JavaScript 中对数组进行位运算操作时是如何进行类型转换的?

在控制台对数组进行位运算符操作时并没有报错,而且会给出运算结果,请问此操作具体的逻辑是什么?遵循了什么标准?

[1] & 1  // 1
[1, 0] & 1  // 0
// 等等均可以运算
阅读 2.8k
3 个回答

JS的位运算为32位整形运算,操作之前,js会把数据进行整数处理。

[1]化为整数涉及到隐式转换, [1] => '1' => 1
[1, 0]的转换为 [1, 0] => '1,0' => NaN
因为1,0无法转换成数字,所以肯定变成NaN

最终可以想象成

1 & 1 === 1
NaN & 1 === 0

另外试试这个

1.24 & 1 === 1
0.6 & 1 === 0

其实本质就是js会把所有数据从64位双精度转成32位整形,所以在JS中位运算的效率并不高。

隐式转换 看我写的这篇就够了 https://segmentfault.com/a/11...

我记得曾经回答过类似的问题,答案是和 js 的自动转换有关
标准规定:按位与操作时会将左右操作数使用 ToInt32 求值,ToInt32 调用的的是 ToNumber, 而 ToNumber 对于 object 类型 使用 ToPrimitive, 默认情况下, ToPrimitive 会调用对象的toString 方法, 而

[1].toString() == '1'
[1,2].toString() == '1,2'

1,2 这样的字符串转换成数字肯定是NaN, 所以就有了你代码中的结果。

你可以试试这样

arr = [1,0]
arr[Symbol.toPrimitive] = () => 1
arr & 1 // 1

// 或者
arr = [1,0]
arr.toString = () => 1
arr & 1 // 1
推荐问题