在Bitwise versus Assoc Array iteration测试中,有以下代码段:
var arr = [1,0,1,0,0,0,0,0,1,1,0,0,1];
var o = [];
for(var i = 0; i < 100; i++){
var a = [(Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1), (Math.random > 0.5 ? 0 : 1)];
var b = 0;
for(var j=0; j < a.length; j++){
b |= (a[j] << j);
}
o << {a: a, b: b};
}
它准备用于测试目的的数据。最后一句话对我来说没有意义,除了它有一个左移。解释器不会抛出错误,只是默默地接受它。
答案 0 :(得分:4)
这让我哭了一下。在数组中没有定义运算符<<
;它只是 在JavaScript中逐位左移。 (虽然不同的语言,比如Ruby,但是要在Array类型上定义这样的运算符。)
因此大致等效于(内部两个操作数都通过本机ToInt32
函数转换):
parseInt(o) << parseInt({a: a, b: b})
应该关闭一些警告标志:
parseInt
(或ToInt32
)的[有意义]结果是什么? <<
的结果在哪里?与此简化代码比较:
var o = []
o << 1
o // -> []
o.push(2) // (as suggested by 6502 as the desired operation)
o // -> [2]
答案 1 :(得分:2)
期望的含义可能是o.push({a:a, b:b})
。
我不知道这是否适用于某些破坏的实现,但它不是标准的。