Если [] - [], а Array.prototype - [], почему нет ([] == Array.prototype) - PullRequest
4 голосов
/ 18 января 2011

Я бездельничаю в консоли и вижу следующее:

>>> []
[]
>>> Array.prototype
[]
>>> [] == Array.prototype
false
>>> [] === Array.prototype
false

Может кто-нибудь объяснить это поведение? (Похоже, хороший кандидат для wtfjs)

Ответы [ 4 ]

8 голосов
/ 18 января 2011

В Javascript == для массивов - это равенство указателей, т.е. только true, если оба массива являются одним и тем же объектом.Если массивы не равны указателю, сохранение одного из них не повлияет на другое.

2 голосов
/ 18 января 2011
>>> typeof [] == typeof Array.prototype
true
1 голос
/ 18 января 2011

По сути, это расширение ответа Рафа Левиена , но я не смог уместить его в комментарии.

Я думаю, что приятно отметить, что

[] == [] || [] === [] //outputs false

Таким образом, тот факт, что

[] == Array.prototype || [] === Array.prototype //outputs false

становится ожидаемым.Чтение операторов сравнения MDN дает объяснение того, почему все четыре ситуации оцениваются как ложные:

  • Два объекта строго равны, если они ссылаются на один и тот же объект.

Равен (==) - если два операнда не одного типа, JavaScript преобразует операнды, а затем применяет строгое сравнение.Если операнд является числом или логическим значением, операнды преобразуются в числа, если это возможно;иначе, если любой операнд является строкой, другой операнд преобразуется в строку, если это возможно.

Strict equal (===) - Возвращает true, если операнды строго равны (см. выше) без преобразования типов.

0 голосов
/ 18 января 2011
js> []
[]
js> Array.prototype
[]
js> [].toString == Array.prototype.toString
true
js> [].toString === Array.prototype.toString
true

То есть метод toString объектов идентичен.Конечно, для Array.prototype.toString () (который фактически является тем, что вызывает вторая строка), этот объект для объекта toString не содержит свойств, подобных массиву, и, следовательно, дает [].

...