1

我觉得有点棘手的一些用法是

2 in [1, 3, 5]

for (var i in [1, 3, 5]) { ... }

str = "hello";
for (var i in str) { ... }

第一个是true(我可能马上说2 in [1, 3, 5]false),第二行循环通过 0、1、2 而不是 1、3、5,最后一部分循环通过 0 到 4,而不是'h', 'e', 'l', 'l', 'o'. 现在我只是在使用:每当看到in数组或数组的 for-in 循环时,立即考虑索引。否则,有没有一种方法或使用模式可以用来避免这个陷阱?

4

3 回答 3

2

是的,它被称为“不要in用于数组”。它测试一个对象是否有某个键 - 所以你不能在数组上正确使用它。

除非您for(var x in something)想遍历something.

要检查一个值是否包含在数组中,请使用~arr.indexOf(value)- 或者arr.IndexOf(value) != -1您是否希望它更详细。

要遍历数组中的元素,请使用for(var i = 0; i < arr.length; i++)

于 2012-10-07T13:03:10.570 回答
1

你可以使用indexOf方法。jsfiddle

对于数组

var arr = [1,2,3,4];
arr.indexOf(2); // will return index of item if exist other wise return -1;

对于字符串

var str = 'Hello world';
str.indexOf('e')
console.log(str.indexOf('e'),str.indexOf('n'));

​</p>

于 2012-10-07T13:03:07.247 回答
1

in关键字旨在与对象一起使用,例如(取自MDN 站点

// Arrays
var trees = new Array("redwood", "bay", "cedar", "oak", "maple");
0 in trees;        // returns true
3 in trees;        // returns true
6 in trees;        // returns false
"bay" in trees;    // returns false (you must specify the index number,
                  // not the value at that index)
"length" in trees; // returns true (length is an Array property)

// Predefined objects
"PI" in Math;          // returns true
var myString = new String("coral");
"length" in myString;  // returns true

// Custom objects
var mycar = {make: "Honda", model: "Accord", year: 1998};
"make" in mycar;  // returns true
"model" in mycar; // returns true

数组可以被认为是一个对象。数组['zero', 'one', 'two']就像对象{0: 'zero', 1: 'one', 2: 'two'}

因此,如果您编写for (i in ['zero', 'one', 'two'])javascript 会将其视为您编写for (i in {0: 'zero', 1: 'one', 2: 'two'})的 .

您可以检查对象是否具有特定的属性值,如下所示:

function isIn(val, obj) {
  for (var i in obj) if (obj[i] == val) return true;
  return false;
}

isIn('car', ['car', 'horse']) // returns true

如果您专门检查一个数组而不仅仅是一个任意对象,您可以使用返回其参数索引的indexOf方法或数组的 -1 不包含参数。

function isInArray(val, arr) {return arr.indexOf(val) > -1;}

isIn('car', ['car', 'horse']) // returns true
于 2012-10-07T13:34:15.047 回答