Я щойно знайшов {....0}
у коді друга. Оцінюючи його у поверненнях консолі {}
(порожній об’єкт).
Чому так? Що означає 4 крапки в JavaScript?
Я щойно знайшов {....0}
у коді друга. Оцінюючи його у поверненнях консолі {}
(порожній об’єкт).
Чому так? Що означає 4 крапки в JavaScript?
Відповіді:
Чотири крапки насправді не мають значення. ...
є оператором розповсюдження , і .0
це скорочення від 0.0
.
Поширення 0 (або будь-якого числа) в об'єкт дає порожній об'єкт, отже {}
.
Spreading 0 (or any number) yields an empty object
необов’язково, якщо ви поширюєте число в будь-якому іншому місці, крім об’єкта, воно видасть помилку, наприклад [... 0] викине помилку.
Spreading 0 (or any number) in object literal yields an empty object
Містить більше корисної інформації ..
Три крапки в літералі об’єкта є властивістю розповсюдження , наприклад:
const a = { b: 1, c: 1 };
const d = { ...a, e: 1 }; // { b: 1, c: 1, e: 1 }
Остання крапка з 0 - це числовий літерал .0
, такий самий, як 0.0
. Тому це:
{ ...(0.0) }
поширює всі властивості об'єкта числа в об'єкт, однак, оскільки числа не мають жодних (власних) властивостей, ви повертаєте порожній об'єкт.
Function
(function x() {}), (x.k = 'v'), ({...x})// {k: 'v'}
але не працюєNumber
(x = 10), (x.k = 'v'), ({...x}) // {}
x.k
загубишся.
Простіше кажучи, {...}
оператор поширення в javascript розширює один об'єкт / масив іншим.
Отже, коли babelifier намагається розширити одне з одним, він повинен визначити, чи намагається він розширити масив чи об'єкт.
У випадку array
, це ітерація над елементами.
У випадку object
, це ітерація над клавішами.
У цьому випадку babelyfier намагається витягти ключі number
, перевіряючи об'єкт, own property call
якого немає, 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} // {}
На закінчення ті типи даних, які можна обробляти у формі пар ключ-значення при використанні з оператором поширення, {...}
повертає непустий об'єкт, інакше він повертає порожній об'єкт{}