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

时间:2018-12-25 11:37:26

标签: javascript spread-syntax number-literal

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

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

4 个答案:

答案 0 :(得分:87)

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

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

答案 1 :(得分:55)

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

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

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

 { ...(0.0) }

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

答案 2 :(得分:6)

简单来说,JavaScript中的{...}传播算子将一个对象/数组扩展为另一个。

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

对于array,它会遍历元素。

对于object,它会遍历键。

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

答案 3 :(得分:0)

扩展运算符{...}允许可迭代对象扩展。这意味着可以扩展以key-value对形式定义的那些数据类型。就Object而言,我们将键值对称为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"}

就数组而言,因为它以索引为键,所以这里用{3'替换了arr1的元素'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} // {}

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