Javascript逻辑"!=="运算符?

Cor*_*oss 50 javascript syntax logical-operators

我正在重新开始进行Web开发,并且最近一直试图重新审视jscript的细微差别.我正在通过构建在Three.JS之上的THREEx扩展库的源代码,并注意到了这个功能

THREEx.KeyboardState.prototype.pressed  = function(keyDesc)
{
    var keys    = keyDesc.split("+");
    for(var i = 0; i < keys.length; i++){
        var key     = keys[i];
        var pressed;
        if( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){
            pressed = this.modifiers[key];
        }else if( Object.keys(THREEx.KeyboardState.ALIAS).indexOf( key ) != -1 ){
            pressed = this.keyCodes[ THREEx.KeyboardState.ALIAS[key] ];
        }else {
            pressed = this.keyCodes[key.toUpperCase().charCodeAt(0)];
        }
        if( !pressed)   return false;
    };
    return true;
}
Run Code Online (Sandbox Code Playgroud)

我特别关注这里的线路:

if( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){
Run Code Online (Sandbox Code Playgroud)

我不熟悉这个!==运算符.我检查了w3schools,他们的逻辑运算符列表中没有包含这个.我不确定这是否拼写错误,浏览器只是将其视为!=或者它是否有其他含义.另外我想知道这实际上是一个逻辑运算符还是它是某种组合,比如!+ ==?

Wor*_*mbo 90

您也可以使用其他几种动态类型语言查找===!==运算符.它总是意味着这两个值不仅通过它们的"隐含"值进行比较(即,可以转换其中一个或两个值以使它们具有可比性),还可以通过它们的原始类型进行比较.

这基本上意味着如果0 == "0"返回true,0 === "0"则返回false,因为您正在比较数字和字符串.同样,while 0 != "0"返回false,0 !== "0"返回true.


Joe*_*ite 18

!=没有类型强制.有关比较运算符,请参阅MDN文档.

也看到这个StackOverflow的答案,其中包括从报价"的JavaScript:好的部分"关于与存在的问题==!=.(null == undefined,false == "0"等)

简短的回答:总是使用===,!==除非你有令人信服的理由否则.(如工具的JSLint,JSHint,ESLint,等会给你这个同样的建议.)


kay*_*kay 8

复制自正式规范:ECMAScript 5.1第11.9.5节

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).设r是执行严格相等比较rval === lval的结果.(见11.9.6)
  5. 如果rtrue,则返回false.否则,返回true.

11.9.6严格的等式比较算法

比较x === y,其中xy是值,产生.这样的比较如下进行:

  1. 如果Type(x)与Type(y)不同,则返回false.
  2. 类型(x)是未定义的,返回true.
  3. 类型(x)为Null,返回true.
  4. 类型(x)是数字,然后
    1. 如果x是NaN,则返回false.
    2. 如果y是NaN,则返回false.
    3. 如果xy的 Number值相同,则返回true.
    4. 如果x是+0且y是-0,则返回true.
    5. 如果x是-0且y是+0,则返回true.
    6. 返回false.
  5. 如果Type(x)是String,则如果xy完全相同的字符序列(相应位置的长度和字符相同),则返回true ; 否则,返回false.
  6. 如果Type(x)是布尔值,如果x和y都为true或两者都为false,则返回true ; 否则,返回false.
  7. 如果xy引用同一个对象,则返回true.否则,返回false.