2016-11-30 4 views
3

私はJSの配列の周りに頭を抱えようとしています。私の質問は、次の2つのテストは同等ですか?`var in array`と` array.indexOf(var) `の違いは何ですか?

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

彼らはのように見えるが、その後、私はあなただけのオブジェクトに、アレイ上inを行うことができないことを示唆して読んでいますthisbookのように答えます。明快さを探しています。人々が(私は線形時間であると仮定します)を使用し、in(一定時間と仮定します)を使用しない理由が必要です。

+1

'in'はオブジェクトキーを探しています。配列の場合、文字列ではなく数字キーです。 'indexOf'は、アイテムの配列の値を見て、インデックスを返します。 – synthet1c

答えて

7

いいえ、それらは全く異なります。

test in [1,2,3]は、2という名前のオブジェクトがあるかどうかをチェックします。値は3です。

[1,2,3].indexOf(test)は(1というプロパティである)2

で最初のプロパティを取得するだけでオブジェクト

に、あなたは、アレイ上で行うことができないことを示唆しています

配列はオブジェクトです。 (JSのようなプロトタイプ言語には実際には適合しないが、それはポイントを取得する)。

アレイ[1, 2, 3]オブジェクト{ "0": 1, "1": 2, "2": 3 }である(ただし、Arrayコンストラクタから他のプロパティの束を継承します)。指定されたプロパティが指定されたオブジェクトである場合にオペレータにMDN 1として

4

オブジェクトのプロパティが存在するインデックスの場合、または最初のチェック、

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

を、アレイ内の値のために、第二のように行っていません。

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

したがって、testの値が0の場合、最初の値はtrueを返しますか? – Esko

+0

はい、 '0'はあなたの配列のプロパティです。 –

4

ザは真を返します。

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

への同様のは本当in operator戻り、この

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'と 'in' **であり、解決方法ではありません – Rajesh

2

を試してみてください。

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

Object.keys:全て列挙特性

を返すものはアレイのプロパティであるため - indicesのアレイチェックの inオペレータと lengthプロパティを使用

Object.getOwnPropertyNames:ret urnすべてのプロパティ

関連する問題