为什么 {。。。.0}评估为{}?


80

我刚刚{....0}在朋友的代码中找到。在控制台返回值中对其进行评估{}(空对象)。

这是为什么?JavaScript中4个点的含义是什么?


11
在6小时内观看了近2500次?您的朋友似乎在其他情况下使用了传播算子
杰里米·哈里斯

这更多是“如何解析此表达式”的问题。在JS控制台中键入此内容,您会注意到第四个点的颜色不同...与零的颜色相同。
Salman A


@JeremyHarris HNQ的魔力
Pac0

Answers:


90

四个点实际上没有任何意义。...价差运算符.0是的缩写0.0

因此,将0(或任何数字)散布到一个对象中会产生一个空对象{}


9
Spreading 0 (or any number) yields an empty object如果您在对象之外的其他任何地方散布数字,则不一定会引发错误,例如[... 0]会引发错误。
Hitesh Kumar

2
@HiteshKumar在数组内传播不可迭代的对象确实会引发错误,但这与该问题无关。我指的是对象传播。:)
NikxDa

2
NikxDa我认为@HiteshKumar提出了重要观点。最好对陈述为真的情况进行更明确的说明。Spreading 0 (or any number) in object literal yields an empty object包含更多有用的信息..
薄雾

1
@雾我已经更新了答案。我认为这不是必需的,但可能有助于澄清。感谢更新!
NikxDa

1
@NikxDa谢谢。当您有能力从上下文中剪切它们,将其粘贴到其他位置并且它们仍然保留所有信息并且具有教育性和信息性时,我想认为这样的语句更加“完整”。

56

对象文字中的三个点是传播属性,例如:

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

3
@mist,因为当您将数字(和其他基元)作为对象使用时,它们被“装箱”到对象中,然后直接“取消装箱”。因此x.k会迷路。
乔纳斯·威尔姆斯

“装箱”到底是什么意思?例如,当我使用点运算符(属性)时,我将数字用作对象。如果我是正确的,那只是一种情况。还有其他情况发生“装箱”吗?它仅适用于数字吗?有性能方面的原因吗?我想这是另一个问题,我应该进一步研究。你能指点什么书吗?

1
谢谢!我知道为什么我的数字键无法使用。Yayy拳击!

3
数字没有任何自己的可枚举属性。但是它们确实具有属性。
帕特里克·罗伯茨

6

简单来说{...},JavaScript中的散布运算符可将一个对象/数组扩展到另一个对象/数组。

因此,当babelifier尝试彼此扩展时,它必须确定是尝试扩展数组还是对象。

对于array,它会遍历元素。

对于object,它会遍历键。

在这种情况下,Babelyfier试图number通过检查own property call缺少的对象来提取密钥,number以便它返回空对象。


0

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.