В javascript, почему {}! == Object ()? - PullRequest
1 голос
/ 02 января 2012

С учетом

    var o = {};
    var p = new Object();

    p === o; //false

    o.__proto__===p.__proto__  // true

почему это ложно?

Скажите, пожалуйста, непосредственную причину возврата ложного ??

Ответы [ 7 ]

6 голосов
/ 02 января 2012

Два объекта содержат одно и то же (т.е. ничего), но они не один и тот же объект.

Тест равенства объектов в Javascript требует, чтобы два параметра ссылались на точно такой же объект .

5 голосов
/ 02 января 2012

=== для объектов определяется как :

11.9.6 Алгоритм сравнения строгого равенства

Сравнение x === y, где x и y являются значениями, дает true или false. Такое сравнение выполняется следующим образом:

...

7. Вернуть true, если x и y относятся к одному и тому же объекту. В противном случае вернуть false.

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

В качестве примечания, обе конструкции делают одно и то же; но обычной практикой является использование {}.

3 голосов
/ 02 января 2012

Строгое сравнение JavaScript для объектов проверяет, ссылаются ли два выражения на одни и те же объекты (и так же, как и обычный оператор равенства).

Первый объект создается с использованием литерала объекта {}, который создает новый объект без свойств.

Вы создаете второй объект, вызывая конструктор Object как функцию. В соответствии с разделом 15.2.1.1 Спецификация языка ECMAScript это также создает новый объект так же, как если бы использовался new Object().

Таким образом, вы создаете два объекта, сохраняете их ссылки в p и o и проверяете, относятся ли p и o к одному и тому же объекту. Они не.

1 голос
/ 02 января 2012

Используя ===, результат будет отображаться, если элементы на обеих сторонах имеют одинаковый экземпляр

Если вы хотите сравнить два элемента одного типа, вы должны использовать:

var o1 = {};
var o2 = new Object();

alert( typeof(o1) === typeof(o2));

и если вы хотите сказать, что два объекта считаются равными (в свойствах и значениях), вы должны попробовать библиотеку underscore.js и использовать функцию isEqual.

1 голос
/ 02 января 2012

Каждый раз, когда вы создаете объект, результат имеет свою особую индивидуальность. Так что, хотя они оба «пустые», они не одно и то же. Следовательно, сравнение === дает false.

0 голосов
/ 02 января 2012

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

0 голосов
/ 02 января 2012

Это домашняя работа?

В этом случае я дам только несколько советов: - Подумай о том, что делают первые две строчки. O и p относятся к одному и тому же объекту после этих двух строк? - Посмотрите, что именно === делает. Сравнивает ли он два объекта, чтобы увидеть, совпадают ли их структуры? Или сравнивает объекты по их идентичности?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...