为什么Array中的数字有效,但Array中没有String?

时间:2015-11-16 16:28:55

标签: javascript

1 in [1, 2] //true
"foo" in ["foo", "bar"] //false
1 in [1] //false - ? what's going on here?

4 个答案:

答案 0 :(得分:4)

in运算符不检查元素是否在数组中(如Python或JS数组的indexOf),它检查对象是否具有属性名字。

您希望在此处使用indexOf,因为它实际上会检查该值是否包含在数组中。这将适用于数字和字符串,但不总是对象(您必须提供完全相同的对象,而不是相同的对象)。

在示例#1中,具有两个元素的数组具有名为1的元素(数组中的第二个元素)。在示例#3中,具有一个元素的数组不会。

由于数组元素已编号,因此任何数组中都没有foo元素。

如果您要使用:

var data = ["foo", "bar"];
data.foo = "baz";

然后"foo" in data将返回true。

答案 1 :(得分:2)

that in foo测试是否存在名为的属性,而不是存在与之匹配的属性。

x = [1, 2]x = []; x[0] = 1; x[1] = 2相同。存在x[1],因此1 in x为真。

x = ["foo", "bar"]x = []; x[0] = "foo"; x[1] = "bar"相同。 x[1]不存在,因此1 in x为假。

您正在寻找indexOf方法。

["foo", "bar"].indexOf("foo") >= 0

答案 2 :(得分:2)

in运算符检查数组上是否存在给定的,这意味着:

1 in [1, 2] // Checks if arr[1] exists
"foo" in ["foo", "bar"] // Checks if arr['foo'] exists
1 in [1] // Checks again if arr[1] exists

请记住,数组的键默认为数字索引,因此[1, 2]['foo', 'bar']包含01键,[1]仅包含0 }键。

如果要检查数组是否包含给定的,您应该使用Array#indexOf方法:

[1, 2].indexOf(1) !== -1 // true
["foo", "bar"].indexOf("foo") !== -1 // true
[1].indexOf(1) // true

您可能需要阅读MDN docs about the in operator

答案 3 :(得分:2)

是用于循环关联数组的“for-in”,如

for( i in myArray ) {
  // Do something with myArray[ i ];
}
如果“y”具有KEY x而不是VALUE x

的元素,则

和“in”指令(“x in y”)为真

如果要测试数组中数据的存在

if( myArray.indexOf( "foo" ) > -1 ) {
  // "foo" is there
}