【问题标题】:concatenate problems with concat function使用 concat 函数连接问题
【发布时间】:2020-07-15 19:57:07
【问题描述】:

在 concat() 函数的这种情况下,我不明白为什么长度属性的值没有连接到数组。此外,当我将长度属性的值更改为某个随机值时,当我连接它们时,前两个属性也会被忽略。 第一种情况:

let arr = [1, 2];

let arrayLike = {
  0: "something",
  1: "else",
  [Symbol.isConcatSpreadable]: true,
  length: 2
};

alert( arr.concat(arrayLike) ); // 1,2,something,else

第二种情况:

let arr = [1, 2];

let arrayLike = {
  0: "something",
  1: "else",
  [Symbol.isConcatSpreadable]: true,
  length: "random",
};

console.log( arr.concat(arrayLike) ); // 1,2

【问题讨论】:

    标签: javascript


    【解决方案1】:

    您的arrayLike 对象有点模仿arr 之类的数组。因此,如果您将其视为普通数组,那么您为什么希望 length 的值被计为数组中的值?

    在您的实际数组arr 中,您将拥有arr.length == 2。但是2 不是数组中的一个值,它只是告诉你数组中有多少个值(两个值,12)。这就是 JavaScript 知道要查找多少值的方式。如果你设置arr.length = 1,突然间JavaScript 将只显示一个值而不是两个。见这里:

    let arr = [1, 2];
    console.log(arr); //[1, 2]
    
    arr.length = 1;
    console.log(arr) //[1]

    同样,arrayLike 对象中的 length: 2 属性用于表示具有 2 个元素的数组。如果将其设置为不是数字的值,JavaScript 将不再知道“数组”中有多少个值,因此它显然只是将其视为 0 - 一个空数组。

    【讨论】:

    • 谢谢。所以我从你的回答中了解到,如果我要将一个对象连接到一个数组,我必须定义对象的长度,对吧?
    • @fatihthebach 完全取决于您的目标。这是一些奇怪的代码,为什么不简单地为 concat 使用适当的数组而不是这个“假”的?
    • 不,我的意思是我想知道我是否必须定义要连接到该特定数组的对象的长度。对不起,如果我不能清楚地解释自己..
    • @fatihthebach 闻起来像 XY Problem。如果您的目标是将对象的每个属性值放入数组中,您应该使用Object.values(obj) 来获取对象中的值数组,然后可以将其连接起来。如果您坚持要制作一个假的“类数组”对象,其中属性键都是从 0 到 N 的整数,您只需要定义对象的长度。
    猜你喜欢
    • 1970-01-01
    • 2020-08-15
    • 1970-01-01
    • 1970-01-01
    • 2020-09-22
    • 1970-01-01
    • 2020-05-03
    • 1970-01-01
    • 2021-08-17
    相关资源
    最近更新 更多