轨道
/
JavaScript
JavaScript
/
练习
/
幸运数字
幸运数字

幸运数字

学习练习

简介

在 JavaScript 中,值可以有多种不同的类型。要改变一个变量的类型,可以通过显式的类型转换来实现。除此之外,当上下文需要时,JavaScript 也会执行类型强制转换(隐式类型转换)。

类型转换

JavaScript 不像许多其他语言那样,有专门用于把值转换成另一种类型的语法结构,但可以用一些内置的辅助工具代替。最常用的是,Boolean、Number和String可以作为函数使用,把值转换成对应的类型。

转换成布尔值(真值/假值)

用Boolean(value)可以把任何值转换成布尔值。有一组固定的值,称为假值,它们会转换成false。最重要的是,false、0、空字符串、null、undefined和NaN都是假值。

对于其他所有值,Boolean都返回true。这些值称为真值。

Boolean(-1);
// => true

Boolean(0);
// => false

Boolean(' ');
// => true

Boolean('');
// => false

请注意,根据上述规则,'0'、'false'、[]和{}在 JavaScript 中都是真值。

转换成数字

可以用Number(value)把值转换成数字。字符串开头和结尾的空白字符会被忽略,空字符串会转换成0。如果尝试转换非原始值,或者转换不表示数字的字符串,结果就是NaN(非数字)。

Number('  -12.34  ');
// => -12.34

Number('1,2');
// => NaN

Number('');
// => 0

Number({ num: 123 });
// => NaN

转换成字符串

用String(value)可以把值转换成字符串。对于原始值,结果和你预期的一样。

String(12.34);
// => '12.34'

String(false);
// => 'false'

String(null);
// => 'null'

String(undefined);
// => 'undefined'

对于数组,String函数会对每个元素应用字符串转换,并用逗号把结果拼接起来。你也可以自己调用join方法,例如自定义分隔符。请注意,在这些情况下,null和undefined会被转换成空字符串。

String([42, null, true, 'abc']);
// => '42,,true,abc'

对于对象,String默认会返回一段没什么用的文本。

String({ key: 'value' });
// => '[object Object]'

类型强制转换

在某些上下文中,JavaScript 会在求值某个语句之前,自动把值转换成另一种数据类型。这种隐式转换称为类型强制转换。

布尔上下文

当非布尔值用在布尔上下文中时,JavaScript 会应用和Boolean函数相同的规则,来隐式转换该值。

到布尔值的强制转换常见于以下位置:

  • if 语句的条件
  • 三元运算符?的第一个操作数
  • 逻辑非运算符!的操作数
  • 逻辑与&&和逻辑或||运算符的操作数(表达式的结果是其中一个操作数,不一定是布尔值)
const num = 0;
if (num) {
  // this block is NOT executed because 0 is falsy
}

字符串上下文

如果加法运算符+用于原始值,并且其中一个操作数是字符串,那么另一个操作数也会被强制转换成字符串。转换逻辑和String函数相同。然后,两个字符串会被拼接起来。

let name;
'hello ' + name;
// => 'hello undefined'

数字上下文

许多运算符会按照上面讲解的Number函数的逻辑,把操作数强制转换成数字(如果需要的话)。

  • 算术运算符:+(如果不涉及字符串)、-、*、/、%、**
  • 一元加号运算符和一元取负运算符:+、-
  • 关系运算符(操作数不是字符串时):>、>=、<、<=
  • 位运算符:|、&、^、~

关于这些运算符的更多细节,请参阅 MDN 运算符列表。

为了避免出错,最好在应用这些运算符之前,总是显式调用Number。

说明

你的朋友 Kojo 是个超级数字迷。 他有一个小网站,叫“fun-with-numbers”。 Kojo 的编程水平不算好,所以他来找你帮忙。

你要为 Kojo 网站上的新数字游戏写两个辅助函数,再加第三个,用来校验用户可能输入的某些内容。

1. 计算老虎机上数字的和

Kojo 网站上的其中一个游戏看起来像一台老虎机,上面显示着两组带数字的转轮。 每组数字代表一个数。 为了实现游戏机制,Kojo 需要知道这两个数的和。

写一个函数twoSum,接受两个数组作为形参。 每个数组由一个或多个 0 到 9 之间的数字组成。 函数应把每个数组解释成一个数,并返回这两个数的和。

twoSum([1, 2, 3], [0, 7]);
//=> 130

// [1, 2, 3] represents 123 and [0, 7] represents 7.
// 123 + 7 = 130

2. 判断一个数是否为回文数

网站上的另一个游戏是一个叫“幸运数字”的小测验。 用户可以输入一个数,然后看到这个数是否属于某个秘密数列或模式。 “幸运数字”的数列或模式每个月都会变,而每个用户只有有限的几次机会猜出它。

本月的幸运数字应该是回文数。 回文数把各位数字反转后仍然相同。

实现新的luckyNumber函数,它接受一个数作为形参。 如果这个数是回文数,函数应返回true,否则返回false。 输入的数永远是正整数。

luckyNumber(1441);
//=>  true

luckyNumber(123);
//=> false

3. 为无效的用户输入生成错误消息

网站上有多处输入框,用户可以输入数字并点击按钮来触发某个操作。 Kojo 想改善他网站的用户体验。 如果用户点击了按钮,但输入框里是一个无效的输入值,他希望显示一条错误消息。

下面再补充一些关于输入框的值是如何提供的说明。

  • 如果用户在输入框里输入了内容,那么对应的值永远是字符串,即使用户只输入了数字。
  • 如果用户输入了内容又把它删掉,这个变量会是一个空字符串。
  • 在用户开始输入之前,这个变量可能是undefined或null。

写一个函数errorMessage,它接受用户输入作为形参。 如果用户没有提供任何输入,errorMessage应返回'Required field'。 如果输入不能表示一个非零的数(按照 JavaScript 的转换规则),则应返回'Must be a number besides 0'。 其他所有情况下,你可以假定输入是有效的,返回值应为空字符串。

errorMessage('123');
// => ''

errorMessage('');
// => 'Required field'

errorMessage('abc');
// => 'Must be a number besides 0'
通过 GitHub 编辑 链接将在新窗口或新标签页中打开
JavaScript Exercism

准备好开始 幸运数字 了吗?

注册 Exercism,借助 37 个概念159 个练习 和真人导师指导,学习并掌握 JavaScript,全部免费。