3

javascript で演算子を使用するとin、奇妙なことがわかります。inと同様のルールを使用しているようです==が、同じではありません。ここにいくつかのテストがあります:

var obj = {1: 'a', 3: 'b'};
1 in obj     //=> true
'1' in obj   //=> true
[1] in obj   //=> true
true in obj  //=> false

なぜなら、オペランドは、以外の演算子1 == '1' == [1] == trueと比較する前に文字列または整数型にキャストされるようです。だから私は正しいのだろうか?inboolean

4

2 に答える 2

2

あなたは正しいです。最初に左側のオペランドを文字列に変換しますが、JavaScript でさまざまなデータ型を変換するためのルールは、思っているよりもはるかに微妙であることに注意してください。

true == "true"   //=> true
true == "1"      //=> true
"true" == "1"    //=> false

正確なルールはかなり複雑*ですが、ここで覚えておくべき重要なことは、ブール値を直接文字列に変換すると、次の結果になるということです。

true.toString()  //=> "true"
false.toString() //=> "false"

したがって、これはまさに期待どおりの動作です。たとえば、次のようになります。

var obj = { "true": "a", "false": "b" };
true in obj      //=> true
false in obj     //=> true
1 in obj         //=> false

* JavaScript の比較でどの等号演算子 (== vs ===) を使用してもかまいませんか? を参照してください。

于 2014-04-27T03:43:40.753 に答える
1

それらは異なるコンテキストであるように見えます。

これらのチェック キー。 true はキーではありません。

1 in obj     //=> true
'1' in obj   //=> true
[1] in obj   //=> true
true in obj  //=> false

1 == '1' == [1] == 真

これは、1 が真であるビット値をチェックします。

0 == false は true である必要があります。

于 2014-04-27T03:44:22.703 に答える