Мне непонятно почему:
console.log(0 == [])
показывает true, а:
console.log('0' == [])
говорит false, что это за мистика?
Мне непонятно почему:
console.log(0 == [])
показывает true, а:
console.log('0' == [])
говорит false, что это за мистика?
В ответе были исправлены ошибки, допущенные при первоначальной публикации.
Все дело в привидении типов.
В случае когда ноль – это строка:
console.log("0" == [])
// "0" == ""
// false
массив будет приведен к строке, т.е будут сравниваться "0" и "", а поскольку одна строка пустая, а вторая нет, то мы получаем false.
В случае когда 0 – это число, массив так же будет приведен сначала к строке и далее уже эта строка – к 0, поэтому мы получим true:
console.log(0 == [])
// 0 == ""
// 0 == 0
// true
'0' == [0]– Grundy Aug 09 '20 at 10:19false == [0]– Grundy Aug 09 '20 at 11:09toStringу массив и увидев, что он вызывается при сравнении. То есть, при сравнении массив, так как у него нет своего переопределенияToPrimitiveиспользует стандартный, что именно происходит в стандартной реализации указано в этом ответе – Grundy Aug 09 '20 at 11:15Если Type(x) - это Object и Type(y) один из следующих: String, Number, или Symbol, вернуть значение выражения ToPrimitive(x) == y. Вернуть false.в чем разница то? – Burg Aug 09 '20 at 11:19ToPrimitive– Grundy Aug 09 '20 at 11:20ToPrimitive. В случае с массивом у него просто вызоветсяtoString()– Grundy Aug 09 '20 at 11:25пустой массив при попытке привидения к строке (falsy)так что тогда неверного в этом утверждении?? если я вызову [].toString() я получу '' или falsy – Burg Aug 09 '20 at 11:29falsyони илиtruthly- так как это просто обычное сравнение значений одного типа. – Grundy Aug 09 '20 at 11:31