4

Bitwise 与 Assoc Array 迭代测试中,有以下代码段:

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

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

4

2 回答 2

4

这让我有点想哭。没有在 Array 上定义运算符<<;它只是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]
于 2012-06-30T05:52:22.003 回答
2

也许想要的意思是o.push({a:a, b:b})

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

于 2012-06-30T06:01:43.800 回答