JS对类中数组属性提前插入了新对象,这是怎么回事?

我想取出这个类中的数组tables里的最后一个对象,然后对它进行修改,比如 将最后一个对象中里面的timestamp属性修改为1,然后再作为一个新的对象通过 push 插入到原来数组的最后。(!不改变原来数组中的最后一个对象)

代码如下:

图片描述

图片描述

但是奇怪的是我在修改lastTable之前输出一下数组,缩略下显示数组有一个object展开后却变成了两个,而且此时我并没有将对象中的timestamp赋值为1,但展开后的数组里面的timestamp却都变成了1(理论上因该是"1470123842")

图片描述

即便这只是显示错误,但是我在代码中明明只对其中一个对象的timestamp赋值了1 但是结果两个对象都都变了,这就更加奇怪了,数组的push操作被提前执行,属性的赋值被赋值到其它对象中,这该怎么解决?

阅读 3.5k
2 个回答

这种结果已经告诉你你尝试修改的你认为是两个对象其实是引用了同一个对象,从数组中取出来的对象,如果你要进行修改,应该先对该对象进行复制,这里借用一下jQuery的extend方法复制:

this.lastTable = $.extend(true,{},this.table[this.table.length - 1]);

如果将一个对象赋值给一个变量,其实是赋值给变量的是一个指向该对象的地址。你将这个变量的值赋值给另一个变量,只不过是增加了一个指向该对象的入口罢了。

所以你应该创建一个对象的副本,可以使用Object.create(参数为你要复制的对象),这样就会返回一个参数对象副本

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题