全局对象数组上的javascript push方法将覆盖数组中的所有值

时间:2016-12-29 12:56:46

标签: javascript arrays push

我已经回顾了以前关于此问题的帖子,但未能获得通常建议的解决方案。 evtList是“Event”类型的全局对象数组。以前的帖子表明在我的循环中创建一个本地对象(“newEvent”),定义它的元素,然后将本地对象推送到全局数组应该有效。但是,我发现只要在newEvent对象中为元素声明一个新值,全局数组中的所有对象都会在推送操作之前更改为该组值。我错过了什么?

var i = 0;
var nextTime = new Date();

while (evtList[i].evtTime < dayEnd) {
    i++;
    var newEvent = new Event;
    var milliSecs = (evtList[i-1].evtTime).getTime() + gaussian(arrStations[0].mean, arrStations[0].stdDev);
    nextTime.setTime(milliSecs);
    newEvent = ({value: 1, station: 0, evtTime: nextTime});

    evtList.push(newEvent);
}

1 个答案:

答案 0 :(得分:1)

在JavaScript var中没有定义块级范围而是函数级范围,所以newEvent不是你的for循环的本地,而是它所属的函数体,或者是全局范围,如果它不在函数中。

与您[{1}}一起向push添加不同的对象,但问题是每个对象的属性evtList引用相同的evtTime对象,因此使用Date,您将更改所有nextTime.setTime(milliSecs)属性的日期,因为它是同一个对象。

您需要为每个对象创建一个新的evtTime对象:

Date

您推送到var newEvent; var milliSecs; var nextTime; var i = 0; while (evtList[i].evtTime < dayEnd) { i++; // newEvent = new Event; nextTime = new Date; milliSecs = (evtList[i - 1].evtTime).getTime() + gaussian(arrStations[0].mean, arrStations[0].stdDev); nextTime.setTime(milliSecs); newEvent = ({ value: 1, station: 0, evtTime: nextTime }); evtList.push(newEvent); } 的{​​{1}}不属于newEvent类型,因为您创建的evtList对象已被Event覆盖这里是普通的JavaScript对象:

Event

您要么只想设置新创建的newEvent = new Event对象的属性:

newEvent = ({
  value: 1,
  station: 0,
  evtTime: nextTime
});

或者您可以将它们传递给Event构造函数。