Я только что нашел {....0}
в коде друга. Оценка его в консоли возвращает {}
(пустой объект).
Это почему? Что означает 4 точки в JavaScript?
Я только что нашел {....0}
в коде друга. Оценка его в консоли возвращает {}
(пустой объект).
Это почему? Что означает 4 точки в JavaScript?
Четыре точки на самом деле не имеют смысла. ...
является оператором спреда, а .0
коротким для 0.0
.
Распределение 0 (или любого числа) в объект приводит к пустому объекту, поэтому {}
.
Три точки в литерале объекта являются свойством распространения, например:
const a = { b: 1, c: 1 };
const d = { ...a, e: 1 }; // { b: 1, c: 1, e: 1 }
Последняя точка с 0 является .0
литералом .0
совпадает с 0.0
. Поэтому это:
{ ...(0.0) }
распространяет все свойства числового объекта на объект, однако, поскольку числа не имеют никаких (собственных) свойств, вы получаете пустой объект.
Проще говоря, оператор распространения {...}
в javascript расширяет один объект/массив другим.
Таким образом, когда babelifier пытается расширить одно на другое, он должен определить, пытается ли он расширить массив или объект.
В случае с array
, он перебирает элементы.
В случае object
он перебирает ключи.
В этом сценарии babelyfier пытается извлечь ключи для number
, проверяя own property call
Object, который отсутствует для number
поэтому он возвращает пустой объект.
Оператор распространения {...}
позволяет расширять итерации. Это означает, что те типы данных, которые могут быть определены в форме пар 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} // {}
В заключение, те типы данных, которые могут быть обработаны в форме пар ключ-значение при использовании с оператором распространения {...}
возвращают непустой объект, в противном случае он возвращает пустой объект {}