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