0

Правильно ли я понял преобразование типов? Я читал это.

Алгоритм:

[] приводится к примитиву потому что:

If Type(x) is Object and Type(y) is either String or Number, return the result of the comparison ToPrimitive(x) == y.

ToPrimitive вызывается с hint String, то есть подсказка что нужно преобразовать к строке. Такая подсказка указана из-за того что '0' строка.

ToPrimitive вызывает toString, возвращается пустая строка '' (перечисление элементов через запятую).

После этого выполняется еще одно выражение ==: '' === '0' (пустая строка из массива и изначальный '0').

Тут уже срабатывает алгоритм сравнения строк:

If Type(x) is the same as Type(y), then

If Type(x) is String, then return true if x and y are exactly the same sequence of characters (same length and same characters in corresponding positions). Otherwise, return false.

То есть строки разные, поэтому false.


Я просто читал эту страницу, там залайкан не правильный ответ.

  • с чего решили, что там не правильный ответ? Суть та же, не пустая строка '0' и пустая строка '' (от преобразования массива) не равны – ThisMan Apr 09 '19 at 11:02
  • @ThisMan "JavaScript cannot coerce them to the same type" По алгоритму что я написал, он привод к одинаковому типу: '' === '0'. Еще "and one is falsy the other is not.", это не понятно, там пример кода внизу где оба Truthy. Еще такой прикол: "if you coerce an empty array to a number, you get it's length - which is zero", путает новичков. – Илья Зелень Apr 09 '19 at 11:15
  • Я так понял типы преобразовываются именно так? Я не ошибся не в чем? – Илья Зелень Apr 09 '19 at 11:55
  • ошибся. ToPrimitive вызывается с hint String - на самом деле он вызывает без hint, об этом говорит вызов ToPrimitive(x), hint передавался бы отдельным параметром, например ToPrimitive(x, 'number') или ToPrimitive(x, 'string') – Grundy Apr 09 '19 at 12:03
  • 1
    Описание работы ToPrimitive есть в ответе на вопрос В чем разница между valueOf и toString – Grundy Apr 09 '19 at 12:04
  • @Grundy то есть вызывается ToPrimitive с [] и hint="default" (то есть number) И получается будет вызыван toString из-за условия Если Type(result) не Object, вернуть result. И второй вопрос, чтобы я точно был уверен, по сути в примере что я навел с [] == '0' будет использовано внутри интерпретатора еще одно сравнение == ('' === '0', после приведения массива)? То есть язык может приводить типы и внутри вызывать еще свое сравнение для приведенных типов? (наверно не больше одного сравнения) Надеюсь поняли о чем я)) – Илья Зелень Apr 09 '19 at 15:10
  • @ИльяЗеленько, собственно об этом явно указано в алгоритме из спецификации, если все операнды с типом Object приводятся к примитивным значениям, и далее сравниваются уже примитивы – Grundy Apr 09 '19 at 15:17
  • @Grundy оказывается ({}) == "[object Object]" это true. valueOf получается игнорится из-за того что возвращает сам объект (как и с массивом было). – Илья Зелень Apr 10 '19 at 05:01

0 Answers0