2016-10-08 6 views
-1

Я просматриваю профессиональную книгу в JavaScript и пришел к примеру indexOf, который меня смущает. См. Ниже.IndexOf vs LastIndexOf Объект JavaScript

var person = {name: "Ali"}; 
var people = [{name: "Ali"}]; 

var morePeople = [person]; 
alert(people.indexOf(person)); //returns -1 
alert(morePeople.indexOf(people)); //returns 0 

Мне интересно, почему первое предупреждение возвращает -1, потому что люди содержат имя Али. Я запутался!

ответ

1

JavaScript проверяет равенство на объектах тест, чтобы увидеть, если они являются объектом же, не если они одинаковых объектов.

{name: "Ali"} != {name: "Ali"} 

В нем есть имя Ali, но это не тот же объект.

+0

Благодарим за разъяснение – Celaro

0

Объекты являются одинаковыми, если они ссылаются на объект того же объекта, но не тогда, когда они имеют одинаковые свойства и значения, но были определены отдельно.

Эти два объекта не совпадают:

a = { test: 1 }; 
b = { test: 1 }; 
// now a !== b 

массив на самом деле не тот аспект, что здесь имеет значение: как people и morePeople массивы. Ядром вашей проблемы является то, почему объекты, которые являются первыми элементами каждого из этих двух массивов, не являются одним и тем же объектом. Примитивные значения считаются одинаковыми, если они имеют одинаковое значение:

a = 1 
b = 1 
// now a === b 
a = 'test' 
b = 'test' 
// again a === b 

Но это вообще не относится к объектам, так как они представляют собой ссылки. Правила равенства более сложны (см., Например, this Q&A), и они играют роль, когда вы применяете .indexOf().

+0

Так что это означает, что он видит человека как объект и людей как массив объекта, и поэтому они не равны? Спасибо – Celaro

+0

Нет, факт, что массивы задействованы, здесь не проблема. Причина в том, что вы создаете дважды объект, и, следовательно, они не совпадают. См. Дополнение к моему ответу. – trincot

+0

Теперь я понимаю, спасибо! – Celaro