Сравнение JavaScript-массива

Возможный дубликат:
   Почему [] == [] является ложным в javascript?

Я хотел бы спросить о странной вещи, то есть:

var x = "pl";
var y = ["pl"];
[x] == y;//false - why?
x == y;//true - how ? 
x === y;//false - okay

Может кто-нибудь объяснить это?

Заранее спасибо.

4
nl ja de

3 ответы

Первый из них неверен, потому что вы сравниваете два массива (которые являются объектами) - сравнение, которое всегда будет ложным, если только объекты не являются тем же самым объектом , или , если объекты принуждаются к другому типу значения, как во втором сравнении.

Во втором сравнении y принуждается как строковое значение, а затем оказывается равным "pl" .

Например, этот код:

["pl"] + "foo" → "plfoo"

Кстати, именно поэтому вы всегда должны использовать === вместо == - это не приводит к каким-либо неожиданным принуждениям. Вот почему третье сравнение ложно.

4
добавлено
@cojack ['a', 'b', 'c']. toString() 'a, b, c'
добавлено автор jrajav, источник
[x] == y делает мелкое сравнение, и поскольку эти два не относятся к одному и тому же массиву, он возвращает false.
добавлено автор spinningarrow, источник
ok, тогда объясните это: ["hello", "john"] == "hello, john"//true
добавлено автор cojack, источник

Массив в массив (абстрактное сравнение равенства)

[x] == y;//false - why?

[x] and y do not refer to the same object. Arrays are objects and the == operator tests that they are the same object, not simply two objects having identical values for all properties. In order to determine object-equality in that way, you'll have to manually enumerate the properties of each object and test each value.

Согласно Алгоритм сравнения абстрактного равенства , используемый < a href = "http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.1" rel = "nofollow"> == :

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

Строка в массив (абстрактное сравнение равенства)

x == y;//true - how ? oO

y, an array, is coerced into a string because you used == when comparing it to x, a string.

Согласно Алгоритм сравнения абстрактного равенства , используемый < a href = "http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.1" rel = "nofollow"> == :

Если тип (x) является либо строкой, либо номером, а тип (y) - объектом, возвращает   результат сравнения x == ToPrimitive (y).

Строка в массив (строгое сравнение равенства)

x === y;//fasle - okey

===, unlike ==, will not coerce y into a string... so, you're comparing a string to an object.

Согласно Алгоритм сравнения строгого равенства , используемый < a href = "http://www.ecma-international.org/ecma-262/5.1/#sec-11.9.4" rel = "nofollow"> === :

Если Type (x) отличается от Type (y), верните false.

2
добавлено
[x] == y; 

['pl'] == ['p1'] - сравнение ссылок на 2 разных массивах в памяти

x == y; 

То же, что и «pl» == ["p1"]. ToString (). JS преобразует второй аргумент в строку, потому что первая строка также является строкой

0
добавлено
JavaScript Jobs — чат
JavaScript Jobs — чат
8 336 участник(ов)

JavaScript Jobs — чат для поиска работы и людей Правила оформления: https://teletype.in/@telegram-ru/r1WQe5F1m См. также: @mobile_jobs, @devops_jobs, @nodejs_jobs, @react_js, @angular_ru, @js_ru

JavaScript.ru
JavaScript.ru
7 932 участник(ов)

Сообщество сайта JavaScript.ru в Slack.

pro.js
pro.js
4 675 участник(ов)

Про JavaScript и NodeJS Invite: https://t.me/joinchat/Be4rsT5Rsgq30DHutjxXgA Правила: http://telegra.ph/ru-chat-rules-06-19 Вакансии только с ЗП, не чаще раза в неделю.

JavaScript — русскоговорящее сообщество
JavaScript — русскоговорящее сообщество
3 269 участник(ов)

Рекомендуем сразу отключить уведомления Правила: https://rudevs.network/ByaMH6un7 См. также: @js_noobs_ru, @nodejs_ru, @typescript_ru, @react_js, @electron_ru Вакансии и поиск работы: @javascript_jobs

JavaScript Noobs — сообщество новичков
JavaScript Noobs — сообщество новичков
2 484 участник(ов)

Чат для новичков

javascript_ru
javascript_ru
915 участник(ов)

Сообщество любителей самого популярного языка программирования в мире. Чат основан в 2009 году. Логи: https://goo.gl/9EOeM7 Поддержка бота: @chat_linker (ссылка на репу внутри) Вам будут интересны @frontend_ru и @css_ru

jsChat
jsChat
603 участник(ов)

Чат посвященный программированию на языке javaScript Перед отправкой ссылки на Ваш контент посоветуйтесь с админом Все ссылки удаляются ботом автоматически

JavaScript for Zombies Chat
JavaScript for Zombies Chat
492 участник(ов)

Чат про JavaScript для настоящих zombie! Вход строго по приглашениям! Ссылка для строгих приглашений: https://t.me/joinchat/AAMBHz3Uyr0tuZ7VaB029g

All That JS
All That JS
417 участник(ов)

JS на русском