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

dev*_*ept 10 javascript arrays

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

console.log(+[]) ==> 0
console.log(+[123]) ==> 123
console.log(+['123']) ==> 123
console.log(+[123, 456]) ==> NaN
console.log(+['123asdf']) ==> NaN
Run Code Online (Sandbox Code Playgroud)

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

这让我更好地了解如何执行转换.根据此表

[] => 0
[20] => 20
[10,20] => NaN
["twenty"] =>NaN
["ten","twenty"] => NaN
Run Code Online (Sandbox Code Playgroud)

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

我测试得出这个结论.您可以将所有内容嵌套,它会给您相同的结果.

console.log(+[[[[[[[[[[[10]]]]]]]]]]]) => 10
Run Code Online (Sandbox Code Playgroud)

那么我想,好吧,如果是这样的话

console.log(+[undefined]) will return NaN
console.log(+[null]) will return 0
console.log(+[false]) will return 0
Run Code Online (Sandbox Code Playgroud)

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

console.log(+[undefined]) => 0
console.log(+[null]) => 0
console.log(+[false]) => NaN
Run Code Online (Sandbox Code Playgroud)

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

aps*_*ers 6

一元+运营商内部使用ToNumber抽象操作.

所述ToNumber抽象操作,当施加到对象,调用该对象的toString方法(由的方式[[DefaultValue]]内部方法),然后再施加ToNumber对所得字符串表示的操作.

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

  1. 如果element0undefinednull,则令R为空String; 否则,设RToString(element0).

因此,任何包含单个的数组nullundefined字符串化为空字符串(ToNumber number-ifies to 0),而其他值将字符串化为其他字符串(NaN如果字符串为非数字,则将其编号为if -ify ).

+[undefined]是一样的+"",虽然+[false]是一样的+"false".