当我在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
除外。所以我想我是对的吗?
答案 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应该是真的。