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?
请注意,每个日期对象的时间部分可能因执行时间不同而不同。如果您希望它们都具有相同的时间但不同的日期,则需要稍作更改。
我正在尝试将不同的日期分配给单独的 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?
请注意,每个日期对象的时间部分可能因执行时间不同而不同。如果您希望它们都具有相同的时间但不同的日期,则需要稍作更改。