4

Готовлюсь к собесу. И хочу понять почему

(false == []) === true, и в тоже время

(false == Boolean([])) === false.

Как такое явление можно объяснить?

Я понимаю, что в первом случае для массива будет вызван ToPrimitive(), а затем вроде должен отработать valueOf(). Возможно я не прав, но похоже, что этот метод вернет значение length, который равен 0, что в свою очередь является falsy значением, так что-ли?

Bulson
  • 9,411
  • 2
    нет не так. ToPrimitive никак с length не работает – Grundy May 22 '21 at 16:57
  • @Grundy спасибо, за полезное замечание. – Bulson May 22 '21 at 17:16
  • Интересно, а кто будет на собесе задавать такую чушь? В реалиях TypeScript этот код неуместен, поэтому и понять не могу, кому нужно заниматься такой ерундой – MoloF May 22 '21 at 21:34
  • @MoloF, а причем тут TypsScript если вопрос про javascript? Кроме того, TypeScript не панацея и в нем, приведение типов работает точно так же – Grundy May 23 '21 at 08:40
  • @Grundy не думаю что компания может позволить себе писать на голом JS когда без строгой типизации ни один проект не сможет поддерживаться несколькими разработчиками. Я не знаю в каких случаях может пригодится подобное сравнение, в реалиях тайпскрипта данная запись невозможна, последние пару лет забыл про ==, всегда обходился ===. – MoloF May 23 '21 at 11:20
  • @MoloF, проекты без строгой типизации спокойно поддерживаются несколькими разработчиками ¯\(ツ)/¯ в реалиях тайпскрипта данная запись вполне возможна. Если кто-то не использует возможности языка - не значит что их никто не использует :) – Grundy May 23 '21 at 11:32

1 Answers1

3

Массив при нестрогом сравнении с примитивом конвертируется в пустую строку, поэтому при дальнейшем нестрогом сравнении с false и получается совпедение. Но если вы явно преобразуете объект в булево значние, возвращается true, поэтому второй результат такой.

См. подробности в https://javascript.info/array#don-t-compare-arrays-with

vsemozhebuty
  • 14,042
  • 3
    Вообще, если прям совсем совсем по спецификации, то сначала false конвертируется в number, потом массив в строку, потом в number и в итоге два числа сравниваются – Grundy May 22 '21 at 18:22