Javascript逻辑“!==”运算符?

时间:2012-06-03 15:35:04

标签: 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;
}

我特别关注这一行:

if( THREEx.KeyboardState.MODIFIERS.indexOf( key ) !== -1 ){

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

6 个答案:

答案 0 :(得分:85)

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

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

答案 1 :(得分:18)

没有类型强制的!=。请参阅MDN documentation for comparison operators

另请参阅this StackOverflow answer,其中包含有关==!=问题的“JavaScript:好部分”的引用。 (null == undefinedfalse == "0"等。)

简短回答:始终使用===!==,除非您有令人信服的理由不这样做。 (JSLintJSHintESLint等工具会给你同样的建议。)

答案 2 :(得分:8)

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

  

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

     

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

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

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

         

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

         
        
    1. lref 成为评估 EqualityExpression 的结果。
    2.   
    3. lval 为GetValue( lref )。
    4.   
    5. rref 成为评估 RelationalExpression 的结果。
    6.   
    7. rval 为GetValue( rref )。   设 r 是执行严格相等比较 rval === lval 的结果。 (见11.9.6)
    8.   
    9. 如果 r true ,请返回 false 。否则,请返回 true
    10.         

      11.9.6严格的等式比较算法

           

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

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

答案 3 :(得分:2)

!== opererator测试值是否相同或不相同。 即。

var x = 5;
var y = '5';
var 1 = y !== x; // true
var 2 = y != x; // false

答案 4 :(得分:2)

参考here

!==是严格不等于运算符,并且如果两个操作数不相等和/或不是相同类型,则仅返回值true。以下示例返回布尔值true:

a !== b 
a !== "2" 
4 !== '4' 

答案 5 :(得分:0)

!==

  

这是严格的不等于运算符,只返回值true   如果两个操作数不相等和/或不相同。该   以下示例返回一个布尔值true:

a !== b
a !== "2"
4 !== '4'