2016-11-30 80 views
3

我想讓我的頭在JS中的數組。我的問題是;以下兩個測試是否相同?`var in array`和`array.indexOf(var)`有什麼區別?

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

他們似乎是,但後來好像thisbook我讀答案建議你不能陣列上做in,只有一個對象。尋求清晰度。必須有一個原因,人們使用(我認爲是線性時間),而不是in(我認爲這是不變的時間)。

+1

使用'in'查看對象鍵,對於數組,它們是數字鍵而不是字符串。 'indexOf'正在查看數組的值並返回索引。 – synthet1c

回答

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 }(但是從數組構造繼承一束其它性質的)。

4

第一檢查的索引,或者如果存在物體的屬性,

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

,而不用於所述陣列中的值,作爲第二正在做什麼。

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

所以如果測試的值爲0,第一個仍然會返回true? – Esko

+0

是的,因爲'0'是你數組的屬性。 –

4

作爲每MDN

中操作者如果指定的屬性是在指定的對象返回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))

0

試試這個

var test = 2; 
var arrval= [1, 5, 2, 4]; 
var a = arrval.indexOf(test); 
if(a>-1) console.log("Having"); 
else console.log("Not Having"); 
+0

問題的目標是**'indexOf' vs'in ** **而不是如何解決它 – Rajesh

2

in operator返回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:ret甕所有屬性

相關問題