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

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

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

于 2012-06-03T15:38:40.133 に答える
21

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

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

簡単な答え:やむを得ない理由がない限り、常に===andを使用してください。!==( JSLintJSHintESLintなどのツールは、これと同じアドバイスを提供します。)

于 2012-06-03T15:37:35.317 に答える
10

正式な仕様からのコピー: ECMAScript 5.1セクション 11.9.5

11.9.4 厳密な等号演算子 ( === )

プロダクションEqualityExpression : EqualityExpression === RelationalExpressionは次のように評価されます。

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

11.9.5 厳密な不等号演算子 ( !== )

プロダクション EqualityExpression : EqualityExpression !== RelationalExpressionは次のように評価されます。

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

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

xyが値である比較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. xがyと同じ数値の場合、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 ) が Booleanの場合、xと y の両方がtrueまたは両方がfalseの場合はtrueを返します。それ以外の場合はfalseを返します。
  7. xyが同じオブジェクトを参照している場合はtrueを返します。それ以外の場合はfalseを返します。
于 2012-06-03T15:49:00.080 に答える
4

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

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 に答える