在 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函数相同的规则,来隐式转换该值。
到布尔值的强制转换常见于以下位置:
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 网站上的新数字游戏写两个辅助函数,再加第三个,用来校验用户可能输入的某些内容。
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
网站上的另一个游戏是一个叫“幸运数字”的小测验。 用户可以输入一个数,然后看到这个数是否属于某个秘密数列或模式。 “幸运数字”的数列或模式每个月都会变,而每个用户只有有限的几次机会猜出它。
本月的幸运数字应该是回文数。 回文数把各位数字反转后仍然相同。
实现新的luckyNumber函数,它接受一个数作为形参。
如果这个数是回文数,函数应返回true,否则返回false。
输入的数永远是正整数。
luckyNumber(1441);
//=> true
luckyNumber(123);
//=> false
网站上有多处输入框,用户可以输入数字并点击按钮来触发某个操作。 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'