2016-11-30 2 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); 

Они, кажется, но ответы, как this и book я читал предположить, что вы не можете сделать 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 } (но наследует кучу других свойств из конструктора Array).

4

Первые чеки для индекса, или если свойство объекта существует,

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

, а не для значения в массиве, а второй делает.

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

Итак, если значение теста равно 0, первое будет возвращать true? – Esko

+0

Да, потому что '0' является свойством вашего массива. –

4

Согласно MDN,

в операторе возвращает истину, если указанное имущество находится в указанном объекте.

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 возвращает истину, если указанное имущество находится в указанного объекта.

Использование 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: ret urn all properties

Смежные вопросы