【问题标题】:Typescript array push, strange behaviour with console.logTypescript数组推送,console.log的奇怪行为
【发布时间】:2016-10-31 11:19:51
【问题描述】:

当我尝试在数组推送之前和之后记录一个数组时,两者的输出是相同的:

class MyClass {
    order: number;
}

let list: MyClass[] = [];

for (let i = 0; i < 5; i++){
    list.push({ order: i });
}
console.log('before push', list);
list.push({ order: 999 });
console.log('after push', list);

“推送前”包含订单号为 999 的 MyClass。为什么? 你可以在这里尝试一下: Playground

【问题讨论】:

    标签: javascript arrays typescript console push


    【解决方案1】:

    原因是您记录了同一个数组实例,而控制台保存了对该实例的引用。
    因此,在两次打印中,它都会打印相同的实例,并且当您在第一次打印后更改实例时,控制台中的实例也会更改。

    控制台显示如下:

    推送前[对象,对象,对象,对象,对象]
    推后[对象,对象,对象,对象,对象,对象]

    所以看起来一开始有 5 个项目,然后是 6 个,但是当您在控制台中打开数组时,两种情况下都显示 6 个项目,因为它是同一个实例。

    如果您希望第一次打印在推送之前保留数据,请执行以下操作:

    console.log('before push', list.slice(0));
    list.push({ order: 999 });
    console.log('after push', list);
    

    slice method 从传递的索引开始创建一个新数组,因此它基本上克隆了该数组。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2012-08-09
      • 1970-01-01
      • 1970-01-01
      • 2021-12-13
      相关资源
      最近更新 更多