我正试图了解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();
(我假设是恒定时间)。
答案 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
运算符对indices
和length
属性进行数组检查 - 因为这些是数组的属性:
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}}