Javascript中是否存在使用模式以防止[1,3,5] ===中的2的陷阱?

时间:2012-10-07 13:01:16

标签: javascript

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

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循环时,立即考虑索引。否则,是否有一种方法或使用模式可以用来避免这种陷阱?

3 个答案:

答案 0 :(得分:2)

是的,它被称为“不要将in用于数组”。它测试对象是否具有某个键 - 因此您无法在阵列上正确使用它。

除非您要迭代for(var x in something)的属性,否则您也不应使用something

要检查数组中是否包含值,请使用~arr.indexOf(value) - 或arr.IndexOf(value) != -1,如果您想要更详细的话。

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

答案 1 :(得分:1)

您可以使用indexOf方法。 jsfiddle

for Array

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

for String

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

答案 2 :(得分:1)

in关键字旨在与对象一起使用,如此(取自MDN site

// 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 method返回其参数的索引,或者数组的-1不包含参数。

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

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