Почему [null, undefined, []] == ",," возвращает true - PullRequest
0 голосов
/ 06 августа 2020

Я знаю, что абстрактное сравнение преобразует LHS в String, а String([null, undefined, []]) приведет к ',,'.

Но String(null) - это 'null', а String(undefined) - 'undefined'. Итак, как String([null, undefined, []]) равно ',,'?

Ответы [ 3 ]

6 голосов
/ 06 августа 2020

Это потому, что.

  1. Вот как определяется == https://tc39.es/ecma262/#sec -abstract-equal-compare См. Шаг 11: If Type(x) is Object and Type(y) is either String, Number, BigInt, or Symbol, return the result of the comparison ? ToPrimitive(x) == y.
  2. Затем происходит ToPrimitive: https://tc39.es/ecma262/#sec -топпримитивный
  3. Затем происходит OrdinaryToPrimitive: https://tc39.es/ecma262/#sec -обычно-примитивный , который вызывает Array.prototype.toString
  4. Для массивов он вызывает Array.prototype.join(arr) См. https://tc39.es/ecma262/#sec -array.prototype.tostring
  5. Вот как реализовано Array.prototype.join: https://tc39.es/ecma262/#sec -array.prototype.join , важнейшие шаги:
Repeat, while k < len,

* If k > 0, set R to the string-concatenation of R and sep.
* Let element be ? Get(O, ! ToString(k)).
* If element is undefined or null, let next be the empty String; otherwise, let next be ? ToString(element).
* Set R to the string-concatenation of R and next.
* Set k to k + 1.
2 голосов
/ 06 августа 2020

zerkms - отличный ответ, если вам нужны подробные спецификации. Проще говоря, это выглядит так:

  1. Конструктор String в основном преобразует параметр, который вы передаете, в строку.
  2. В этом случае параметр представляет собой массив (созданный с помощью [...] синтаксис).
  3. Преобразование массива в строку выполняется путем создания списка строковых представлений внутри него значений, разделенных запятыми, с одним интересным предупреждением: даже если undefined и null будут обычно конвертируется в "undefined" и "null", spe c для Array.prototype.join , на который ссылается zerkms, указывает, что вместо обычного преобразования строки будет использоваться пустая строка.
  4. Третий элемент в вашем массиве - это пустой массив (снова созданный с помощью синтаксиса []). Поскольку нечего разделять запятыми, это также дает пустую строку при преобразовании в строку. запятая, за которой следует еще одна пустая строка. Следовательно, ",,".

    Другой способ взглянуть на это состоит в том, что вы в основном вызываете:

    [undefined, null, []].join(",")
    

    ... который обрабатывает значения undefined и null как если бы это были пустые строки.

1 голос
/ 06 августа 2020

Я знаю, что абстрактное сравнение преобразует LHS в String, а String ([null, undefined, []]) приведет к ',,'.

Но String (null) будет 'null 'и String (undefined) - undefined. Итак, как String ([null, undefined, []]) является ',,'?

Почему вы думаете, что func([x, y, z]) должно быть равно func(x) + func(y) + func(z)?

См. эти примеры:

String([1, 2]); // "1,2"
String([null]); // ""
String([undefined]); // ""
String([[]]); // ""
String([1, null, undefined]); // "1,,"

// In same way 

String([null, undefined, []]); // ",,"

Попробуйте связать эти примеры со своим вопросом.

...