什么o<< {a:a,b:b};做?

时间:2012-06-30 05:46:21

标签: javascript

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};
}

它准备用于测试目的的数据。最后一句话对我来说没有意义,除了它有一个左移。解释器不会抛出错误,只是默默地接受它。

2 个答案:

答案 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})

我不知道这是否适用于某些破坏的实现,但它不是标准的。