2016-05-05 3 views
1

私は別々のtask()オブジェクトに異なる日付を割り当てようとしています。この場合、javascriptは予期せぬ動作をします(下のスニペットの添付出力からわかるように)。JavaScript - setDateは、あらかじめ割り当てられた変数の値をオーバーライドします。

期待される値(期待される出力)は、意図された値(割り当てられているもの)を返していますが、それらを見ている間(実際の出力)、何らかの形ですべての日付変数の値を上書きし、それらのすべて。

どうすればこのようなことが起こるのかご理解ください。


 

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

 
var d = new Date(); 
 
var obj = []; 
 
console.log("Expected Output"); 
 
for(i=0;i<5;i++){ 
 
\t 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++){ 
 
\t console.log(obj[i].gettask()); 
 
}

あなたは、各taskに同じ日付オブジェクトを代入しているCONSOLEで出力

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) 
+0

同意します!しかし、毎回異なる日付を 'task.date'に割り当てています。 – Sachink

+2

あなたはそうではありません。 'var d = new Date();'は* d *に日付を割り当てます。 'obj [i] .date = d'は**参照**を日付に割り当てますが、それはコピーされません。 ;-) – RobG

+0

ありがとう!わかった! – Sachink

答えて

2

。ループ内のそれぞれに新しい日付を作成します。

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?


ノートの読み取りを持ってお勧めします。それらのすべてに同じ時間で日付が異なるようにするには、少し変更する必要があります。

+0

ありがとう 私はこの解決策を知っていましたが、なぜこれが起こっているのか理解できません。私は各オブジェクトに異なる日付を割り当てていますが、同じ値を示しています。 – Sachink

+0

@Sachink彼らは違いはありません、彼らは参照によって割り当てられたまったく同じ 'Date'インスタンスです。 – Phil

+0

参照によって割り当てられた日付オブジェクト。私はそれが変数に代入中にコピーを作成していると思った。 – Sachink

関連する問題