Почему {. , , .0} оценивать как {}?

Я только что нашел {....0} в коде друга. Оценка его в консоли возвращает {} (пустой объект).

Это почему? Что означает 4 точки в JavaScript?

Ответы

Ответ 1

Четыре точки на самом деле не имеют смысла. ... является оператором спреда, а .0 коротким для 0.0.

Распределение 0 (или любого числа) в объект приводит к пустому объекту, поэтому {}.

Ответ 2

Три точки в литерале объекта являются свойством распространения, например:

  const a = { b: 1, c: 1 };
  const d = { ...a, e: 1 }; // { b: 1, c: 1, e: 1 }

Последняя точка с 0 является .0 литералом .0 совпадает с 0.0. Поэтому это:

 { ...(0.0) }

распространяет все свойства числового объекта на объект, однако, поскольку числа не имеют никаких (собственных) свойств, вы получаете пустой объект.

Ответ 3

Проще говоря, оператор распространения {...} в javascript расширяет один объект/массив другим.

Таким образом, когда babelifier пытается расширить одно на другое, он должен определить, пытается ли он расширить массив или объект.

В случае с array, он перебирает элементы.

В случае object он перебирает ключи.

В этом сценарии babelyfier пытается извлечь ключи для number, проверяя own property call Object, который отсутствует для number поэтому он возвращает пустой объект.

Ответ 4

Оператор распространения {...} позволяет расширять итерации. Это означает, что те типы данных, которые могут быть определены в форме пар key-value могут быть расширены. В терминах Object мы называем пару ключ-значение как свойство Object и его значение, тогда как в терминах arrays мы можем рассматривать индекс как ключ, а элемент массива - как его значение.

let obj = { a: 4, b: 1};
let obj2 = { ...obj, c: 2, d: 4}; // {a: 4, b: 1, c: 2, d: 4}

let arr1 = ['1', '2'];
let obj3 = { ...arr1, ...['3']}; // {0: "3", 1: "2"}

С точки зрения массива, поскольку он принимает индекс в качестве ключа, здесь он заменяет элемент '1' из arr1 на '3', поскольку оба они имеют одинаковый индекс в разных массивах.

При слишком расширенных строках оператор возвращает непустой объект. Поскольку строка является массивом символов, она обрабатывает строку как массив.

let obj4 = {...'hi',...'hello'}   // {0: "h", 1: "e", 2: "l", 3: "l", 4: "o"}
let obj5 = {...'y',...'x'}   // {0: "x" }

Но с другими примитивными типами данных он возвращает пустой объект

с номерами

let obj6 = { ...0.0, ...55} // {}

с логическим

let obj7 = { ...true, ...false} // {}

В заключение, те типы данных, которые могут быть обработаны в форме пар ключ-значение при использовании с оператором распространения {...} возвращают непустой объект, в противном случае он возвращает пустой объект {}