2016-09-01 7 views
-2

対:それは私の不一致を伝える保つなぜ「厳格な」テスト私はこのようなオブジェクト持っている未定義の偽

function doit() { 
 
    var current_mods = { 
 
    alt: false, 
 
    shift: false 
 
    }; 
 

 
    var required_mods = {}; 
 

 
    for (var modname in current_mods) { 
 
    if (current_mods[modname] != required_mods[modname]) { 
 
     alert('mismatch'); 
 
     return; 
 
    } 
 
    } 
 

 
    alert('matched'); 
 
} 
 
doit();

を。しかし、私は!==をやっていません。undefined != falseは両方とも偽であるので、falseを返してはいけませんか?

+1

両方とも偽ではありません。 Undifinedは何もない、定義されていないものと等しくない –

+1

この質問がなぜ落とされたのか分かりません。それは完全によく書かれています –

+1

ブラウザコンソールで 'undefined == false'と打つことで答えられるかもしれないこのような基本的な質問のために、このサイトにあまりにも多くの評判があります... –

答えて

2

==!=の比較のルールでは、異なるタイプの2つの値がブール値である場合の比較は、ブール値を数値に変換して処理する必要があります。したがって、あなたのfalse0に変換され、それが今度は、falseのデフォルトの結果に比較プロセスの終了を落ちる、ということ

undefined != 0 

であるかのように比較が扱われています。

テストオブジェクトのプロパティ値は、プロパティが全く存在しない場合、またはプロパティ存在するが、値がないときobj[prop]のような式がundefinedに評価するという事実によって複雑なプロセスです。あなたのニーズに応じて、値のテストと一緒にin演算子を使用することができます。

if (modname in required_mods) { 
    if (current_mods[modname] !== required_mods[modname]) 
     alert("value mismatch"); 
    } 
    else 
    alert("property " + modname + " missing"); 
+0

ありがとうPointy! – Noitidart

+1

@Noitidartと 'undefined == undefined'は' true'であり、 'undefined == null'であることに注意してください。 – Pointy

+0

このノートのおかげで、私はそれをテストして実現しました。だから私の上記のケースでは、私はこれを使用する必要があります: 'if(!current_mods [modname]!=!required_mods [modname]){' – Noitidart