【问题标题】:Why does {. . . .0} evaluate to {}?为什么 {。 . . .0} 评估为 {}?
【发布时间】:2019-05-24 02:57:39
【问题描述】:

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

这是为什么呢? JavaScript中的4个点是什么意思?

【问题讨论】:

  • 在 6 小时内查看了近 2500 次?您的 朋友 似乎在不同的上下文中使用 spread 运算符
  • 这更像是一个“如何解析这个表达式”的问题。在 JS 控制台中输入这个,你会注意到第四个点的颜色不同......颜色与零相同。
  • @JeremyHarris HNQ 的魔力

标签: javascript spread-syntax number-literal


【解决方案1】:

扩展运算符{...} 允许扩展可迭代对象。这意味着可以扩展那些可以以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的元素'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} // {}

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

【讨论】:

    【解决方案2】:

    对象字面量中的三个点是一个扩展属性,例如:

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

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

     { ...(0.0) }
    

    将数字对象的所有属性传播到对象中,但是由于数字没有任何(自己的)属性,您会得到一个空对象。

    【讨论】:

    • 你让我想到——我可以传播任何变量,而自己的键将传播到新对象中?它适用于Function (function x() {}), (x.k = 'v'), ({...x})// {k: 'v'} 但不适用于Number (x = 10), (x.k = 'v'), ({...x}) // {}
    • @mist 因为当您将数字(和其他原语)作为对象使用时,它们会被“装箱”到对象中,然后直接“拆箱”。因此x.k 会迷路。
    • “盒装”到底是什么意思?例如。当我使用点运算符(属性)时,我将数字作为对象。如果我是对的,那只是一种情况。 “拳击”发生时还有其他情况吗?它只适用于数字吗?有什么原因吗?我想这是其他问题,我应该进一步研究。你能给我指点什么书吗?
    • 谢谢!我明白为什么我的数字键不起作用了。耶,拳击!
    • 数字没有任何自己的可枚举属性。但它们确实有属性。
    【解决方案3】:

    简而言之,javascript 中的 {...} 扩展运算符用另一个对象/数组扩展了一个对象/数组。

    因此,当 babelifier 尝试与另一个扩展时,它必须识别它是在尝试扩展数组还是对象。

    对于array,它会遍历元素。

    对于object,它会遍历键。

    在这种情况下,babelyfier 正在尝试通过检查对象的 own property call 来提取 number 的键,而 number 缺少该 number,因此它返回空对象。

    【讨论】:

      【解决方案4】:

      四个点实际上没有任何意义。 ...spread operator.00.0 的缩写。

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

      【讨论】:

      • Spreading 0 (or any number) yields an empty object 不一定,如果您将数字分布在除对象之外的任何其他位置,则会引发错误,例如 [...0] 会引发错误。
      • @HiteshKumar 在数组中传播不可迭代的对象确实会抛出错误,但这与这个问题无关。我指的是提到的对象传播。 :)
      • NikxDa 我认为@HiteshKumar 提出了重要的一点。最好更明确地说明您的陈述成立的情况。 Spreading 0 (or any number) in object literal yields an empty object 包含更多有用的信息..
      • @Mist 我已经更新了答案。我不认为它是必要的,但它可能有助于澄清。感谢您的更新!
      • @NikxDa 谢谢。当您能够从上下文中删除它们并粘贴到其他地方并且它们仍然包含所有信息并且具有教育性和信息性时,我喜欢认为这些陈述更加“完整”。
      猜你喜欢
      • 2021-11-01
      • 2016-08-25
      • 1970-01-01
      • 1970-01-01
      • 2013-09-02
      • 2011-07-04
      • 2018-08-16
      • 2016-04-25
      相关资源
      最近更新 更多