打字稿数组推送,console.log的奇怪行为

时间:2016-10-31 11:19:51

标签: javascript arrays typescript console push

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

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

1 个答案:

答案 0 :(得分:1)

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

控制台显示如下内容:

  在推送[对象,对象,对象,对象,对象]之前

  在推送[对象,对象,对象,对象,对象,对象]

之后

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

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

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

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