Javascript 为什么{….0}计算为{}?

Javascript 为什么{….0}计算为{}?,javascript,spread-syntax,number-literal,Javascript,Spread Syntax,Number Literal,我刚刚在朋友的代码中找到了{….0}。在控制台中计算它将返回{}(空对象) 为什么呢?JavaScript中4个点的含义是什么?四个点实际上没有意义..是,而.0是0.0的缩写 将0(或任何数字)分散到对象中会产生一个空对象,因此对象文本中的三个点是分散属性,例如: 带有0的最后一个点是数字文字。0与0.0相同。因此: { ...(0.0) } 将number对象的所有属性扩展到该对象中,但是由于number没有任何(自己的)属性,因此返回一个空对象。简单来说,javascript中的spr

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


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

四个点实际上没有意义
..
是,而
.0
0.0
的缩写


将0(或任何数字)分散到对象中会产生一个空对象,因此对象文本中的三个点是分散属性,例如:

带有0的最后一个点是数字文字
。0
0.0
相同。因此:

 { ...(0.0) }

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

简单来说,javascript中的spread运算符将一个对象/数组扩展到另一个对象/数组

因此,当babelifier尝试用一个扩展另一个时,它必须确定是尝试扩展数组还是对象

对于
数组
,它迭代元素

对于
对象
,它会在键上迭代


在这种情况下,babelyfier试图通过检查对象的
自身属性调用来提取
number
的键,该调用在
number
中缺失,因此它返回空对象。

扩展运算符
{…}
允许iterables展开。这意味着可以扩展那些可以以
键值
对的形式定义的数据类型。对于
对象
我们称键值对为对象属性及其值,而对于
数组
我们可以将索引视为键,将数组中的元素视为值

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
的元素“1”替换为“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} // {}

总之,当与spread操作符一起使用时,可以以键值对的形式处理的数据类型返回非空对象,否则它返回空对象
{}

您会让我思考-我可以传播任何变量,并且自己的键将被传播到新对象中?它适用于
函数
(函数x(){}),(x.k='v'),({…x})/{k:'v'}
,但不适用于
数字
(x=10),(x.k='v'),({…x})/{/code>@mist,因为数字(和其他原语)在作为对象使用时会“装箱”到对象中,然后直接“拆箱”。因此,
x.k
将丢失。“boxed”的确切含义是什么?例如,当我使用点运算符(属性)时,我使用数字作为对象。如果我是对的,那只是一个例子。发生“拳击”时是否还有其他情况?它是否只适用于数字?有什么原因吗?我想这是另一个问题,我应该进一步研究。你能给我指点书什么的吗?谢谢!我明白为什么我的号码钥匙不能用了。耶,拳击!数字没有自己的可枚举属性。但它们确实有属性。
散布0(或任何数字)会产生一个空对象
不一定如果将数字散布在对象之外的任何其他位置,它会抛出一个错误,例如[…0]会抛出一个错误。@HiteshKumar在数组中散布不可散布的对象确实会抛出一个错误,但这与这个问题无关。我指的是上面提到的对象分布。:)NikxDa我认为@HiteshKumar提出了一个重要的观点。最好更明确地说明你的陈述正确的情况<代码>在对象文字中传播0(或任何数字)会产生一个空对象
包含更多有用的信息。@Mist我已经更新了答案。我认为没有必要,但这可能有助于澄清。谢谢你的更新@谢谢。当你能够从上下文中剪切这些语句,粘贴到其他地方,它们仍然保存着所有信息,并且具有教育性和信息性时,我喜欢认为这些语句更“完整”。在6小时内浏览了近2500次?您的朋友似乎在不同的上下文中使用了spread运算符。这更像是一个“如何解析此表达式”的问题。在JS控制台中键入此命令,您会注意到第四个点的颜色不同。。。与零相同的颜色。@JeremyHarry是HNQ的魔力
let obj7 = { ...true, ...false} // {}