В JavaScript, почему любое значение может быть распространено в объекте, но не в массиве? - PullRequest
0 голосов
/ 13 октября 2018

Распространение любого «пустого» значения в объекте допустимо (не выдает ошибку, а вместо этого становится неактивным):

{
  ...undefined,
  ...null,
  ...false,
  ...true,
  ...'',
  ...{},
  ...[],
  ...Symbol(),
  ...() => {},
} // evaluates to {}

Но выполнение того же в массиве приводит к ошибкедля всех вышеперечисленных значений, кроме '' и [].В сообщении об ошибке говорится, что значения, которые не работают, не являются итеративными, однако они явно и итерируемы в том смысле, что их можно распространить на объект.Разумеется, интуитивно понятно, что строки, массивы и объекты могут быть преобразованы в пары «записи / ключи-значения» при распространении в объект и преобразованы в значения при распространении в массив, но даже в этом случае зачем нужны записи всех этихзначения будут итеративными, но значения не будут?Если записи являются итеративными, разве значения не должны быть такими же?Это просто причуда разных движков JavaScript?Что здесь происходит?

1 Ответ

0 голосов
/ 13 октября 2018

В литералах объекта spread operator копирует собственные перечисляемые свойства из предоставленного объекта в новый объект .Так что в ваших примерах ни одна из предоставленных «сущностей» для оператора распространения не имеет перечисляемых свойств.

С массивами синтаксис распространения применяется только к итерируемым объектам .

Или объекты, которые реализуют протокол итератора ..., что означает:

Объект (или один из объектов в его цепочке прототипов) должен иметь свойствос ключом @@ iterator, который доступен через константу Symbol.iterator

Основные объекты, которые делают это:

...