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]
    

    10-04 22:51