为什么{ . . 0}的计算结果是{} ?

我刚刚在朋友的代码中找到了 {....0},在控制台中计算返回 {}(空对象)。

为什么? 在 JavaScript 中4个点的意义是什么?

9412 次浏览

四个点实际上没有任何意义。 ...扩散算符扩散算符,而 .00.0的缩写。

将0(或任意数字)展开到一个对象中会产生一个空对象,因此 {}

文字对象中的三个点是 分散财产,例如:

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

最后一个点为0的数字字面值 .00.0相同,因此:

 { ...(0.0) }

将数字对象的所有属性扩展到对象中,但是由于数字没有任何(自己的)属性,所以返回的是一个空对象。

简单来说,javascript 中的 {...}扩展运算符用一个对象/数组扩展另一个对象/数组。

因此,当 babelifier 试图扩展一个与另一个,它必须确定它是否试图扩展一个数组或对象。

对于 array,它迭代元素。

对于 object,它迭代键。

在这个场景中,babelyfier 试图通过检查对象的 own property call来提取 number的键,own property callnumber中丢失了,因此它返回空 Object。

扩展操作符 {...}允许可迭代扩展。这意味着那些可以以 key-value对的形式定义的数据类型可以扩展。就 Object而言,我们把键-值对称为 Object 属性和它的值,而就 arrays而言,我们可以把 index 看作键,数组中的元素看作它的值。

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"}

就数组而言,因为它以 index 作为键,所以在这里它将 arr1的元素“1”替换为“3”,因为它们在不同的数组中具有相同的索引。

使用字符串的扩展运算符返回非空对象。因为 string 是一个字符数组,所以它将 string 视为一个数组。

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} // {}

总之,当与扩展运算符 {...}一起使用时,那些可以以键-值对的形式处理的数据类型返回非空对象,否则返回空对象 {}