63

我正在重新开始 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,他们的逻辑运算符列表没有包含这个。我不确定这是否拼写错误,浏览器只是将其视为 != 或者它是否具有其他含义。另外我想知道这实际上是一个逻辑运算符还是某种组合,例如!+ ==?

4

6 回答 6

111

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

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

于 2012-06-03T15:38:40.133 回答
21

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

另请参阅此 StackOverflow 答案,其中包括“JavaScript:好的部分”中关于 和 问题的==引用!=。( null == undefined, false == "0", 等)

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

于 2012-06-03T15:37:35.317 回答
10

复制自正式规范:ECMAScript 5.1 section 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是值)产生truefalse。如下进行这样的比较:

  1. 如果 Type( x ) 与 Type( y ) 不同,则返回false
  2. Type( x ) 未定义,返回true
  3. Type( x ) 为 Null,返回true
  4. Type( x ) 是 Number,那么
    1. 如果x是 NaN,则返回false
    2. 如果y是 NaN,则返回false
    3. 如果x与y是相同的 Number 值,则返回true
    4. 如果x为 +0 且 y 为 -0,则返回true
    5. 如果x为 -0 且 y 为 +0,则返回true
    6. 返回
  5. 如果Type( x )是String,那么如果xy是完全相同的字符序列(长度相同,对应位置的字符相同),则返回true ;否则,返回false
  6. 如果 Type( x ) 是布尔值,如果x和 y 都为true或都为false ,则返回true;否则,返回false
  7. 如果xy引用同一个对象,则返回true 。否则,返回false
于 2012-06-03T15:49:00.080 回答
4

运算符测试!==值是否不相等或不同类型。IE

var x = 5;
var y = '5';
var 1 = y !== x; // true
var 2 = y != x; // false
于 2012-06-03T15:37:19.170 回答
2

参考这里

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

a !== b 
a !== "2" 
4 !== '4' 
于 2012-06-03T15:38:31.083 回答
0

!==

这是严格不等于运算符,仅当两个操作数不相等和/或类型不同时才返回 true 值。以下示例返回布尔值 true:

a !== b
a !== "2"
4 !== '4' 
于 2012-06-03T15:42:46.743 回答