web-dev-qa-db-ja.com

Javascript論理「!==」演算子?

私は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をチェックしましたが、その論理演算子リストにはこれが含まれていません。これがスペルミスであり、ブラウザが単にそれを!=としてカウントするのか、それとも他の意味があるのか​​はわかりません。また、これが実際に単一の論理演算子であるのか、それとも! + ==?

49
Cory Gross

===および!==演算子は、他のいくつかの動的に型付けされた言語でも見つけることができます。これは常に、2つの値が「暗黙の」値(つまり、一方または両方の値が変換されて比較可能になる)だけでなく、元のタイプによっても比較されることを意味します。

これは基本的に、0 == "0"がtrueを返す場合、数値と文字列を比較しているため、0 === "0"はfalseを返すことを意味します。同様に、0 != "0"はfalseを返しますが、0 !== "0"はtrueを返します。

88
Wormbo

型の強制なしの!=です。 比較演算子のMDNドキュメント を参照してください。

このStackOverflowの回答 も参照してください。これには、==および!=の問題に関する「JavaScript:The Good Parts」の引用が含まれています。 (null == undefinedfalse == "0"など)

簡単な答え:always特別な理由がない限り、===!==を使用します。 ( JSLintJSHintESLint などのツールは、同じアドバイスを提供します。)

18
Joe White

正式な仕様からコピー: ECMAScript 5.1 section 11.9.5

11.9.4厳密に等しい演算子(===)

生成EqualityExpressionEqualityExpression===RelationalExpressionは、次のように評価されます。

  1. lrefEqualityExpressionの評価結果とします。
  2. lvalをGetValue(lref)とする。
  3. rrefRelationalExpressionの評価結果とします。
  4. rvalをGetValue(rref)とする。
  5. 厳密な等価比較を実行した結果を返しますrval===lval。 (11.9.6を参照)

11.9.5厳密な等しくない演算子(!==)

生成EqualityExpression:EqualityExpression!==RelationalExpressionは、次のように評価されます。

  1. lrefEqualityExpressionの評価結果とします。
  2. lvalをGetValue(lref)とする。
  3. rrefRelationalExpressionの評価結果とします。
  4. rvalをGetValue(rref)とする。 rを厳密な等価比較の実行結果としますrval===lval。 (11.9.6を参照)
  5. r true の場合、 false を返します。それ以外の場合は、 true を返します。

11.9.6厳密な等価比較アルゴリズム

比較x===y、ここでxおよびyは値で、 true または false を生成します。このような比較は次のように実行されます。

  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. xyと同じ数値の場合、 true を返します。
    4. xが+0でyが-0の場合、 true を返します。
    5. xが-0でyが+0の場合、 true を返します。
    6. false を返します。
  5. Type(x)がStringの場合、 true ifxandyはまったく同じ文字列です(同じ長さで、対応する位置に同じ文字があります)。それ以外の場合は、 false を返します。
  6. Type(x)がブールの場合、 true ifxおよびyが両方 true または両方 false ;それ以外の場合は、 false を返します。
  7. xyが同じオブジェクトを参照する場合、 true を返します。それ以外の場合は、 false を返します。
8
kay

!==演算子は、値が等しくないか、同じ型ではないかをテストします。つまり.

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

参照 ここ

!==は厳密な等しくない演算子であり、両方のオペランドが等しくないか、同じタイプではない場合にのみtrueの値を返します。次の例は、ブール値のtrueを返します。

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

!==

これは厳密な等しくない演算子であり、両方のオペランドが等しくない場合、および/または同じ型でない場合にのみtrueの値を返します。次の例は、ブール値のtrueを返します。

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