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

我正在回到web开发中,并且一直在努力研究最近jscript的细微差别。 我正在通过Three.JS之上build立的THREEx扩展库的源代码注意到这个function

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和他们的逻辑运算符列表没有包括这一个。 我不确定这是否拼写错误,浏览器只是把它算作!=或者是否有其他含义。 还有,我想知道这是否是一个单一的逻辑运算符,或者是否是某种组合,就像! + ==?

您还可以在其他几种dynamictypes语言中find===!==运算符。 它总是意味着这两个数值不仅可以通过它们的“隐含”值(也就是两个值中的任何一个或两个值可以转换成可比较的值)进行比较,而且也可以通过它们的原始types进行比较。

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

这是!=没有types的强制。 有关比较运算符,请参阅MDN文档 。

另请参阅此StackOverflow答案 ,其中包含关于==!=问题的“JavaScript:The Good Parts”的引用。 ( null == undefinedfalse == "0"等)

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

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

11.9.4严格的等号操作员(===)

生产EqualityExpressionEqualityExpression === 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. 如果r ,则返回false 。 否则,返回true

11.9.6严格平等比较algorithm

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

  1. 如果Type( x )与Type( y )不同,则返回false
  2. types( x )是未定义的,返回true
  3. types( x )为空,返回true
  4. types( 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,则返回true,如果xy是完全相同的字符序列(相同长度和相同位置的相同字符); 否则,返回false
  6. 如果Type( x )是布尔型,则返回true,如果x和y都为或者都为 ; 否则,返回false
  7. 如果xy引用同一个对象,则返回true 。 否则,返回false

!== opereratortesting值是否不相同或不是相同的types。 即

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

参考这里

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

 a !== ba !== "2" 4 !== '4' 

!==

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

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