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

开发概念

当我遇到这种奇怪的行为时,我正在做一些测试,将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。有人可以解释奇怪的行为或解释如何执行此转换吗?

炸药

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

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

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

  1. 如果element0undefinednull,则让R为空String;否则为0。否则,令RToStringelement0)。

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

+[undefined]与相同+"",而+[false]与相同+"false"

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

TelemetryClient在Application Insights中产生不一致的结果

在Java中使用按位&运算符和+产生不一致的结果

使用echo >>会产生不一致的结果

流星SmartCollection产生不一致的结果

Swift CryptoKit 加密产生不一致的结果

system()产生不一致的结果

C 方法产生不一致的结果

COUNT() 与 PARTITION 产生不一致的结果

Codeigniter加密类产生不一致的结果

nproc 产生与硬件报告不一致的结果

为什么选择二元运算符而不是一元运算符?

应用于不同 lambda 的三元运算符会产生不一致的结果

为什么GCC会定义一元运算符'&&'而不是仅使用'&'?

C ++类上使用的一元运算符是什么意思?(类::类)

为什么Gemfile语义版本控制运算符(〜>)产生一个数字不一致的结果?

Javascript:与算术运算符不一致?

为什么我的相同C代码在编译时会产生不一致的结果

为什么在vue.js中“避免使用JavaScript一元运算符作为属性名称”?

getTimezoneOffset结果不一致

API 结果不一致

不一致的 Python 结果

将numpy数组与标量传递给函数会产生不一致的结果

-a一元运算符会检查什么?

Unix连接在Windows 7上产生不一致的结果

为什么会出现“ -eq:一元运算符期望为假”的情况?

为什么一元运算符&不需要完整的类型?

为什么“自动”不尊重一元减号运算符?

为什么一元运算符返回的类型与其操作数不同?

为什么一元运算符启用()=> X隐式转换?