当我尝试在数组推送之前和之后记录数组时,两者的输出相同:
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
答案 0 :(得分:1)
原因是您记录了相同的数组实例,并且控制台保存了对该实例的引用 因此,在两个打印件中它都打印相同的实例,并且在第一次打印后更改实例时,控制台中的实例也会更改。
控制台显示如下内容:
在推送[对象,对象,对象,对象,对象]之前在推送[对象,对象,对象,对象,对象,对象]
之后
所以看起来首先有5个项目然后是6个,但是当你在控制台中打开数组时,它会在两种情况下显示6个项目,因为它是相同的实例。
如果您希望第一次打印在推送之前保留数据,请执行以下操作:
console.log('before push', list.slice(0));
list.push({ order: 999 });
console.log('after push', list);
slice method从传递的索引中创建一个新数组,因此它基本上克隆了数组。