在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};
}
它准备用于测试目的的数据。最后一个声明对我来说没有任何意义,除了其中存在左移的事实。解释器不会抛出错误,而只是默默地接受它。
最佳答案
这让我哭了一点。在数组上未定义运算符<<
;这只是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]