как работают сеттеры

у распространение неопределенного в объекте возвращает пустой объект?{...undefined} // equals {}:

console.log({...undefined})

И почему распространение неопределенного в массиве дает вам ошибку?[...undefined] // type error:

console.log([...undefined])

 Ilja Everilä07 нояб. 2017 г., 11:13
 Bergi07 нояб. 2017 г., 11:29
 user644553307 нояб. 2017 г., 11:19
Подводя итог: распространение объекта эквивалентноObject.assign в то время как распространение массива на самом деле повторяемый иundefined не повторяется

Ответы на вопрос(1)

Решение Вопроса

# 687, распространение объекта эквивалентно1 вObject.assign () (вопросы# 687, # 45), где как распространение в массиве литеральный контекст является итеративным распространением.

квотированиеЭкма-262 6,0, Object.assign () определяется как:

19.1.2.1 Object.assign (target, ... sources)

назначать Функция используется для копирования значений всех перечисляемых собственных свойств из одного или нескольких исходных объектов в целевой объект. Когданазначать вызывается функция, предпринимаются следующие шаги:

Пусть будетНа объект(Цель).ReturnIfAbrupt(К).Если был передан только один аргумент, вернитесь к.Пусть источники будутСписок значений аргументов, начиная со второго аргумента.Для каждого элемента nextSource из источников в порядке возрастания индекса выполнитеЕсли следующий источникне определено или жезначение NULLпусть ключи пустыеСписок.Остальное ...

... с последующим описанием копирования собственных свойств. Чертеж Object Rest / Spread Properties являетсяВот, Не входит в Ecma-262 6.0.

A SpreadElement В массиве буквенное выражение определяется так:

SpreadElement : ... ВыражениеПрисваивания

ПозволятьspreadRef быть результатом оценкиВыражениеПрисваивания.ПозволятьspreadObj бытьПолучитьЗначение(spreadRef).Позволятьитератор бытьGetIterator(spreadObj).ReturnIfAbrupt(Итератор).

И с тех порundefined не имеет свойства с ключом@@ итератора,TypeError брошен, основываясь на шагахGetIterator, Стандарт не легко читается, но если я не ошибаюсь, путь к ошибкеGetIterator ->GetMethod ->GetV ->На объект, который бросает TypeError для неопределенных и нулевых.

Простым способом использования переменных с возможно неопределенным значением при инициализации массива является использование значения по умолчанию:

const maybeArray = undefined;
const newArray = [ ...(maybeArray || []) ];

1: Есть разница вкак работают сеттеры.

Ваш ответ на вопрос