在控制台对数组进行位运算符操作时并没有报错,而且会给出运算结果,请问此操作具体的逻辑是什么?遵循了什么标准?
[1] & 1 // 1
[1, 0] & 1 // 0
// 等等均可以运算
在控制台对数组进行位运算符操作时并没有报错,而且会给出运算结果,请问此操作具体的逻辑是什么?遵循了什么标准?
[1] & 1 // 1
[1, 0] & 1 // 0
// 等等均可以运算
我记得曾经回答过类似的问题,答案是和 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
算一下就知道了,如果数组只有一个元素,那么[n]&i 就等于n&i;而如果数组有多个元素自身会转化为0作位运算
已参与了 SegmentFault 思否社区 10 周年「问答」打卡 ,欢迎正在阅读的你也加入。
13 回答12.6k 阅读
2 回答4.9k 阅读✓ 已解决
7 回答1.8k 阅读
3 回答2.1k 阅读✓ 已解决
7 回答2k 阅读
5 回答580 阅读
3 回答1k 阅读✓ 已解决
JS的位运算为
32位整形
运算,操作之前,js会把数据进行整数处理。[1]
化为整数涉及到隐式转换
, [1] => '1' => 1而
[1, 0]
的转换为 [1, 0] => '1,0' => NaN因为
1,0
无法转换成数字,所以肯定变成NaN最终可以想象成
另外试试这个
其实本质就是js会把所有数据从
64位双精度
转成32位整形
,所以在JS中位运算的效率并不高。隐式转换 看我写的这篇就够了 https://segmentfault.com/a/11...