3

当我in在 javascript 中使用运算符时,我发现了一些奇怪的东西。似乎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。所以我想知道我是对的吗?

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 回答