Синтаксис распространения объекта никогда не вызывает ошибку?
Я заметил, что синтаксис Object Spread чрезвычайно разрешает, какие типы значений он может принимать:
console.log({ ...true });
console.log({ ...false });
console.log({ ...0 });
console.log({ ...42 });
console.log({ ...-1 });
console.log({ ...NaN });
console.log({ ...'batman' });
console.log({ .../\w+[0-9a-fA-F]?/ });
console.log({ ...['foo', 'bar', 42] });
console.log({ ...undefined });
console.log({ ...false });
console.log({ ...Symbol('hmm') });
console.log({ ...Promise.resolve('resolved') });
console.log({ ...Promise.reject('rejected') });
Существует ли недопустимый тип, класс или значение (т. Е. Вызывает какую-либо ошибку) при распространении внутри литерала объекта? Не считая, конечно, невыполненных отклоненных обещаний.
1 ответ
Нет, нет выражения, которое является недопустимым при распространении внутри литерала объекта, при условии, конечно, что оценка этого выражения сама по себе не вызывает ошибки.
Мы видим, что это правда из спецификации ECMAScript:
В 12.2.6 Object Initializer мы находим определение синтаксиса для синтаксиса распространения литерала объекта:
PropertyDefinition :
AssignmentExpression [+ In,?Yield,?Await]
ВыражениеПрисваивания представляет все возможные выражения (включая назначение), для оператора запятой, что практически означает , что вы должны использовать круглые скобки , если вы хотите , запятую следует интерпретировать как запятую оператор вместо запятой разделителя литерала объекта, за исключением (см 12.15 Операторы присваивания и 12.16 Оператор запятой ).
Процедура оценки указана в 12.2.6.8 Семантика среды выполнения: PropertyDefinitionEvaluation:
Свойство Определение :
...
ПрисвоениеВыражение
- Пусть exprValue будет результатом вычисления AssignmentExpression .
- Пусть fromValue будет? GetValue ( exprValue ).
- Пусть excludedNames будет новым пустым списком.
- Возвращаться ? CopyDataProperties ( объект , fromValue , excludedNames ).
Мы предположили, что само выражение не будет генерироваться во время оценки, что означает, что вышеупомянутая процедура GetValue завершится успешно без ошибок. Затем мы можем проверить, что делает в CopyDataProperties7.3.25 CopyDataProperties . Важные шаги:
- Если источник - или, вернуть цель .
- Пусть от быть! ToObject( источник ).
Теперь ToObject будет выдавать, когда источник либо
null
или же
undefined
, но эти два случая уже были обработаны (как бездействие) на предыдущем шаге. Все остальные примитивные значения помещаются в объект-оболочку (см. 7.1.18 ToObject).
Наконец, у CopyDataProperties есть еще один шаг, который может вызвать:
- c. 2. ii. Выполнять ! CreateDataPropertyOrThrow( цель , nextKey, propValue).
Но это может быть только тогда, когда свойство, которое нужно установить, уже существует и не настраивается, или целевой объект не является расширяемым (см. вызвано7.3.7 CreateDataPropertyOrThrow и 7.3.5 CreateDataProperty). Но таких условий не бывает в литерале объекта. Они могут происходить в большей оценке , где расширенный объект, но такие ошибки не имеют ничего общего с синтаксисом распространения специально .