1

Мне непонятно почему:

console.log(0 == [])

показывает true, а:

console.log('0' == [])

говорит false, что это за мистика?

Vasily
  • 11,547
Burg
  • 103
  • 2
  • 11
  • 1
    чтобы было true, сравнивай '0' == [0] – Grundy Aug 09 '20 at 10:19
  • @Grundy зачем мне так сравнивать? мой вопрос про другое – Burg Aug 09 '20 at 11:04
  • Это пример еще одной "мистики". – Grundy Aug 09 '20 at 11:05
  • @Grundy Почему говоришь что ответ неверный?, я посмотрел ссылку ниже,там написано тоже самое а у человека рядом с фото написано 107к, наверное он знает о чем говорит – Burg Aug 09 '20 at 11:08
  • Он может и знает, но говорит ошибочно. И ему на это указывают в комментариях. В любом случае длина никак не проверяется при сравнении. Да и falsy/truthly тоже не имеют отношения в сравнению иначе не выполнялось бы равенство false == [0] – Grundy Aug 09 '20 at 11:09
  • @Grundy чем ты можешь подтвердить что ты прав когда говоришь что он ошибаеться? – Burg Aug 09 '20 at 11:12
  • например спецификацией - пример приведен в ответе на дубликат. – Grundy Aug 09 '20 at 11:12
  • Так же ты сам можешь проверить это, переопределив toString у массив и увидев, что он вызывается при сравнении. То есть, при сравнении массив, так как у него нет своего переопределения ToPrimitive использует стандартный, что именно происходит в стандартной реализации указано в этом ответе – Grundy Aug 09 '20 at 11:15
  • @Grundy Так у тебя ведь тоже самое написано Если Type(x) - это Object и Type(y) один из следующих: String, Number, или Symbol, вернуть значение выражения ToPrimitive(x) == y. Вернуть false. в чем разница то? – Burg Aug 09 '20 at 11:19
  • разница в том, как описана работа ToPrimitive – Grundy Aug 09 '20 at 11:20
  • @Grundy этот случай у тебя там не описан, как тогда по твоей версии это будет происходить? Потому что формула что у тебя что в ответе ниже одна и таже, но ниже написано поэтапное обяснение а у тебя в примере нет сравнения с массивом – Burg Aug 09 '20 at 11:23
  • Добавил второй дубликат, где описана работа ToPrimitive. В случае с массивом у него просто вызовется toString() – Grundy Aug 09 '20 at 11:25
  • @Grundy пустой массив при попытке привидения к строке (falsy) так что тогда неверного в этом утверждении?? если я вызову [].toString() я получу '' или falsy – Burg Aug 09 '20 at 11:29
  • Разница в том, что во-первых, не используется длина, во-вторых, все отлично приводится к одному типу, в третьих, при сравнении значений одного типа не учитываются falsy они или truthly - так как это просто обычное сравнение значений одного типа. – Grundy Aug 09 '20 at 11:31
  • @Grundy как происходит тогода преобразование [] в 0? Если не длинна – Burg Aug 09 '20 at 11:37
  • Написал в чате. Ссылка на чат выше в комментариях. – Grundy Aug 09 '20 at 11:41

1 Answers1

-6

В ответе были исправлены ошибки, допущенные при первоначальной публикации.


Все дело в привидении типов.

В случае когда ноль – это строка:

console.log("0" == [])
// "0" == ""
// false

массив будет приведен к строке, т.е будут сравниваться "0" и "", а поскольку одна строка пустая, а вторая нет, то мы получаем false.

В случае когда 0 – это число, массив так же будет приведен сначала к строке и далее уже эта строка – к 0, поэтому мы получим true:

console.log(0 == [])
// 0 == ""
// 0 == 0
// true
Vasily
  • 11,547