我的按位逻辑有什么缺陷?

时间:2015-07-29 06:30:50

标签: javascript optimization binary bit-manipulation bitwise-operators

我在功能开始时尝试做的事情很容易从我的评论中看出来

    this.move = function ( )
    {

        if (this.dx | this.dy != 0) return; // exit early if both this.dx and this.dy are zero

也就是说,我想要相当于if (this.dx == 0 && this.dy == 0)。我认为按位OR是正确的,因为this.dx | this.dy不等于zero当且仅当this.dx至少有一个位或this.dy至少有 this.move = function ( ) { console.log("this.dx = " + this.dx + ", this.dy = " + this.dy); // TEST if (this.dx | this.dy != 0) return; // exit early if both this.dx and this.dy are zero 时一位接通(或两者都至少有一位接通)。但我一定是错的,因为我的考试

this.dx

显示当this.dy .name { background-color: red; display: inline; float: left; } .delete { background-color: green; display: inline; margin-right: 0px; } .price { background-color: blue; display: inline; margin-right: 5px; } .row { width: 450px; background-color: yellow; border: 1px solid blue; display:table; } .info { height:57px; display: table-cell; vertical-align:middle; background-color: ccc; border: 1px solid green; top: 25%; } 都为零时,函数的其余部分正在执行。

这里发生了什么?

2 个答案:

答案 0 :(得分:3)

问题是条件执行为:

this.dx | (this.dy != 0)

试试这个:

if (!(this.dx | this.dy)) return;

答案 1 :(得分:1)

根据precedence table,在完成不等式检查后,将按执行按位OR。例如:

[JS]> 0 | 0 == 0
1

因此,您的表达式实际执行为:

if (this.dx | (this.dy != 0)) { ... }

要解决此问题,请按位OR括起来:if ((this.dx | this.dy) != 0)

另外,正如@ Jon-Skeet指出的那样,正确的检查可能应该是==