gpt4 book ai didi

javascript - 为什么在数组上使用一元运算符 + 在 javascript 中会产生不一致的结果?

转载 作者:可可西里 更新时间:2023-11-01 02:43:50 26 4
gpt4 key购买 nike

当我遇到这种奇怪的行为时,我正在做一些测试,将值转换为 javascript 中的整数并在控制台中打印输出。

console.log(+[]) ==> 0
console.log(+[123]) ==> 123
console.log(+['123']) ==> 123
console.log(+[123, 456]) ==> NaN
console.log(+['123asdf']) ==> NaN

我以为这些值是使用 parseInt 转换的,但结果不是,所以我去了 javascript 转换表 http://www.w3schools.com/js/js_type_conversion.asp

这让我对转换的执行方式有了更好的了解。根据这个表

[] => 0
[20] => 20
[10,20] => NaN
["twenty"] =>NaN
["ten","twenty"] => NaN

显然,他们采用数组的第一个值并使用指定的规则对其进行转换。 parseInt 的规则不适用。

我测试得出这个结论。您可以根据需要嵌套它,它会给您相同的结果。

console.log(+[[[[[[[[[[[10]]]]]]]]]]]) => 10

然后我想,好吧,如果是这样的话

console.log(+[undefined]) will return NaN
console.log(+[null]) will return 0
console.log(+[false]) will return 0

这些是从 javascript 转换表到整数的预期值,但结果是

console.log(+[undefined]) => 0
console.log(+[null]) => 0
console.log(+[false]) => NaN

最后一个最奇怪,因为 false 被转换为 0,而不是 NaN。有人可以解释奇怪的行为或解释这种转换是如何执行的吗?

最佳答案

Unary + operator内部使用 ToNumber 抽象操作。

ToNumber abstract operation ,当应用于对象时,调用对象的 toString 方法(通过 [[DefaultValue]] internal method ),然后对生成的字符串表示重新应用 ToNumber 操作。

这里有趣的是 Array 的 toString 方法。请注意,[false].toString()[undefined].toString()[null].toString() 完全不同。当我们检查 Array.prototype.toString 的规范时,我们看到它在内部使用 Array.prototype.join . join 算法的第 8 步说:

  1. If element0 is undefined or null, let R be the empty String; otherwise, Let R be ToString(element0).

因此,任何包含单个 nullundefined 的数组都会字符串化为空字符串(ToNumber 数字化为 0 ),而其他值将字符串化为其他字符串(如果字符串是非数字,则该字符串将数字化为 NaN)。

+[undefined] 等同于+"",而+[false] 等同于+"假”

关于javascript - 为什么在数组上使用一元运算符 + 在 javascript 中会产生不一致的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30325896/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com