`var in array`和`array.indexOf(var)`有什么区别?

时间:2016-11-30 11:12:57

标签: javascript arrays

我正试图了解JS中的数组。我的问题是;是以下两个测试相当吗?

var test = 2;
console.log(test in [1,2,3]);
console.log([1,2,3].indexOf(test) != -1);

他们似乎是,但接着像this和我正在阅读的book这样的答案表明你不能在一个数组上做in,只能在一个对象上做.indexOf(x)。寻找清晰度。必须有一个原因,人们使用in(我假设是线性时间)而不是var rootTasks = tasks.Where(x => x.Parent == null).ToList(); (我假设是恒定时间)。

5 个答案:

答案 0 :(得分:7)

没有。它们完全不同。

test in [1,2,3]检查对象中是否存在名为 2的属性。有,它的值为3

[1,2,3].indexOf(test)获取第一个具有 2的属性(位于名为1的属性中)

  

建议您不能在数组上进行操作,只能在对象上进行操作

数组是对象。 (如果我们想要使用经典的OO,那么这是一个子类,它并不适合像JS这样的原型语言,但它可以解决这个问题。)

数组[1, 2, 3] 就像一个对象{ "0": 1, "1": 2, "2": 3 }(但是继承了Array构造函数中的一堆其他属性)。

答案 1 :(得分:4)

首先检查索引,或者是否存在对象的属性,

console.log(test in [1,2,3]);

而不是数组中的值,正如第二个那样。

console.log([1,2,3].indexOf(test) != -1);

答案 2 :(得分:4)

根据MDN

  

如果指定的属性在指定的对象中,则in运算符返回true。

in会检查密钥。它类似于Object.keys(array).indexOf(test)

var a1 = [1,2,3];
var a2 = ['a', 'b', 'c']
var test = 2;

console.log(test in a1)
console.log(test in a2)

// Ideal way

//ES5
console.log(a1.indexOf(test)>-1)
console.log(a2.indexOf(test)>-1)

//ES6
console.log(a1.includes(test))
console.log(a2.includes(test))

答案 3 :(得分:2)

  

如果指定的属性在in operator中,则https://jsfiddle.net/ho2sph79/返回true   指定的对象。

使用in运算符对indiceslength属性进行数组检查 - 因为这些是数组的属性:

console.log(Object.getOwnPropertyNames([1, 2, 3]));
console.log(Object.keys([1, 2, 3]));
console.log('length' in [1, 2, 3]);

Object.keys:返回所有可枚举的属性

Object.getOwnPropertyNames:返回所有属性

答案 4 :(得分:0)

试试这个

{{1}}