" in"运算符使用非字符串键?

时间:2014-04-27 03:40:13

标签: javascript operators in-operator

当我在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,所以在与in运算符进行比较之前,似乎将操作数强制转换为字符串或整数类型,但boolean除外。所以我想我是对的吗?

2 个答案:

答案 0 :(得分: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

*请参阅Does it matter which equals operator (== vs ===) I use in JavaScript comparisons?

答案 1 :(得分:1)

它们似乎是不同的背景。

这些检查键,其中true不是键。

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

1 ==' 1' == [1] == true

这将检查位值为1,其中1为真。

0 == false应该是真的。