我刚刚{....0}
在朋友的代码中找到。在控制台返回值中对其进行评估{}
(空对象)。
这是为什么?JavaScript中4个点的含义是什么?
Answers:
四个点实际上没有任何意义。...
是价差运算符,.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
以便它返回空对象。
Spread运算符{...}
允许可迭代对象扩展。这意味着key-value
可以扩展成对定义的数据类型。就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"}
在数组方面,因为它以索引为键,所以这里arr1
用“ 3”替换元素“ 1”,因为它们在不同的数组中都有相同的索引。
如果字符串过于分散,运算符将返回非空对象。由于字符串是字符数组,因此将字符串视为数组。
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} // {}
总之,与散布运算符一起使用时,可以按键值对形式处理的那些数据类型{...}
返回非空对象,否则返回空对象{}