1

我这样说是否正确:

if (y === x) {
    //statement a
} else {
    //statement b
}

比这更有效:

if (y !== x) {
    //statement b
} else {
    //statement a
}

注意:语句的顺序。

4

3 回答 3

1

首先我会说“不”,或者至少不能可靠地决定它,因为它最终总是依赖于实现。

话虽如此,!==规范中描述了一个额外的步骤,即返回与比较结果相反的结果。否则它们是相同的。

11.9.4 严格等于运算符(===)

产生式 EqualityExpression : EqualityExpression === RelationalExpression 的评估如下:

  1. 令 lref 为评估 EqualityExpression 的结果。
  2. 令 lval 为 GetValue(lref)。
  3. 令 rref 为评估 RelationalExpression 的结果。
  4. 设 rval 为 GetValue(rref)。
  5. 返回执行严格相等比较的结果 rval === lval。(见 11.9.6)

11.9.5 严格不等于运算符(!==)

产生式 EqualityExpression : EqualityExpression !== RelationalExpression 的评估如下:

  1. 令 lref 为评估 EqualityExpression 的结果。
  2. 令 lval 为 GetValue(lref)。
  3. 令 rref 为评估 RelationalExpression 的结果。
  4. 设 rval 为 GetValue(rref)。
  5. 令 r 为执行严格相等比较 rval === lval 的结果。(见 11.9.6)
  6. 如果 r 为真,则返回假。否则,返回真。

我会让您决定是否应该关注该步骤,但同样,这只是语言规范。谁知道这些实现有什么技巧。

于 2013-06-01T13:50:43.137 回答
0

=== 必须比较两个变量的每个字符(如果它们有多个),而 !== 如果第一个字符不匹配,则可能会很快失败。所以 !== 应该快一点,但通常好处很小,你不会注意到它们。我还推荐 Pointy 的方式来寻找更好的逻辑。

于 2013-06-01T14:00:29.333 回答
0

不,它们非常相似。我创建了一个 jsfiddle http://jsfiddle.net/rEtjn/

var date1,date2;
date1=new Date();
for(a=1;a<=10000;a++){
    if(i===a){
        console.log("hello!");
    }
    else{
        console.log("bye!");
    }
}
date2=new Date();
alert(date2-date1);
date1=new Date();
for(a=1;a<=10000;a++){
    if(i!==a){
        console.log("bye");
    }
    else{
        console.log("hi!");
    }
}
date2= new Date();
alert(date2-date1);

两者大部分时间都在 10 毫秒内运行。做任何你想做的事,但他们的速度是一样的。

于 2013-06-01T14:18:20.213 回答