JavaScript - setDate 覆盖预分配变量的值

JavaScript - setDate overrides the value of pre assigned variables

我正在尝试将不同的日期分配给单独的 task() 对象;但是 javascript 在这种情况下表现出乎意料,从下面代码段的附加输出中可以看出。

在分配日期(即预期输出)时它返回预期值(与分配的值相同),但在查看它们时(即实际输出),它以某种方式覆盖所有日期变量的值并且仅 returns所有这些的最后分配值。

请帮我理解这是怎么回事!

  

  var task = function() {
  this.name, this.date,this.id;
  this.saveTask = function(n,d)
  {
    this.name = n;
    this.date = d;
  };
  this.gettask = function()
  {
   return this.id+": "+this.date;
  };
}

var d = new Date();
var obj = [];
console.log("Expected Output"); 
for(i=0;i<5;i++){
 obj[i] = new task();
  obj[i].id = i;
  d.setDate(i);
  obj[i].date = d;
  console.log(i+": "+d); //Display assinged value
}

console.log("Actual Output");
for(i=0;i<5;i++){
 console.log(obj[i].gettask());
}

控制台输出

 Expected Output
0: Sat Apr 30 2016 10:42:20 GMT+0530 (India Standard Time)
1: Fri Apr 01 2016 10:42:20 GMT+0530 (India Standard Time)
2: Sat Apr 02 2016 10:42:20 GMT+0530 (India Standard Time)
3: Sun Apr 03 2016 10:42:20 GMT+0530 (India Standard Time)
4: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time)
 Actual Output
0: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time)
1: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time)
2: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time)
3: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time)
4: Mon Apr 04 2016 10:42:20 GMT+0530 (India Standard Time)

您正在为每个 task 分配相同的日期对象。为循环中的每个人创建一个新日期。

for (let i = 0; i < 5; i++) {
    let d = new Date();
    d.setDate(i);

    let t = new task();
    t.date = d;
    // etc

    obj.push(t);
}

建议你读一读~Is JavaScript a pass-by-reference or pass-by-value language?


请注意,每个日期对象的时间部分可能因执行时间不同而不同。如果您希望它们都具有相同的时间但不同的日期,则需要稍作更改。