彻底搞懂 JS 类型转换( 五 )


② 布尔值 => 数字:当使用 Number() 将布尔值转化为数字时,true 会转化为 1,false 会转化为 0 。
Number(true);  // 1Number(false); // 0③ null  => 数字:当使用 Number() 将 null 转化为数字时,会返回 0:
Number(null); // 0null + 5; // 5④ undefined / 数组 / 对象 / NaN => 数字:当使用 Number() 将 undefined、数组、对象、NaN 转化为数字时,会返回 NaN
Number(undefined);  // NaNNumber([1, 2, 3])   // NaNNumber({})          // NaNNumber(NaN)         // NaN⑤ 数组元素可以使用map遍历数组元素,并使用需要的类型来进行类型转换:
["1", "9", "-9", "0.003", "yes"].map(Number);// 输出结果:[1, 9, -9, 0.003, NaN]⑥ 特殊规则在表达式中,当我们将 == 运算符应用于 null 或 undefined 时,不会发生数字转换 。此外,null 只等于 null 或 undefined,不能等于其他任何值:
null == null;           // true null == 0;              // falsenull == undefined;      // trueundefined == undefined  // true根据运算符优先级,+ 运算符具有从左到右的关联性,因此如果有一个表达式 2 + 3 + '4' + 'number' ,则操作按以下方式完成:
2 + 3 + '4' + 'number'==> 5 + '4' + 'number'// 数字 5 被隐式转换为字符串,然后连接起来==> '54' + 'number'==> '54number'NaN 不等于任何其他类型,甚至它本身:
NaN == NaN  // false⑦ 总结上面的例子中,可以清楚地看到一些意想不到的结果:将 null 转换为数字时返回了 0,而将 undefined 转换为数字返回了 NaN 。两个操作都应该返回 NaN,因为这两种值类型显然都不是有效的数字,将空字符串转换为数字时也返回了 0 。
下面是 ECMAScript 规范中将数据类型转换为字符串的规则,清楚的解释了上面的异常现象:


彻底搞懂 JS 类型转换

文章插图
另外,在 ECMAScript 规范中,还提到一点:

彻底搞懂 JS 类型转换

文章插图
意思就是:为空或仅包含空格的 StringNumericLiteral 将转换为 +0 。这也就解释了为什么将空字符串转换为数字时也返回了 0 。
ECMAScript 规范:https://262.ecma-international.org/5.1/#sec-9.3
3. Symbol 类型转换Symbol  只能进行显式转换,不能进行隐式转换 。也就是说,Symbol不能被强制转换为字符串或数字 , 这样它们就不会被意外地用作本来应该表现为 Symbol 的属性 。
const mySymbol = Symbol.for("mySymbol");const str = String(mySymbol);console.log(str);  // 'Symbol(mySymbol)'当使用 console.log() 来打印 symbol 时,它之所以有效 , 是因为 console.log() 在 symbol 上调用了 String() 方法以创建可用的结果 。
如果尝试直接使用字符串连接 symbol,它将抛出TypeError
const mySymbol = Symbol.for("mySymbol");const sum = mySymbol + "";console.log(sum);   // Uncaught TypeError: Cannot convert a Symbol value to a string将 mySymbol 连接到字符串需要首先将 


推荐阅读