これを行うとき:
time2=time1;
...新しい Date
オブジェクトを作成するのではなく、2つの別々の変数から日付オブジェクトを指しているだけです。オブジェクトは1つしかないため、どの変数を調べても、当然、オブジェクトに加えた変更はすべて明らかです。
それにASCIIアートを投げましょう:
time1 = new Date();
それは私たちに与えます:
+ ------- +
+ time1 +
+ ------- + + --------------- +
| 値|---------------->| Dateオブジェクト|
+ ------- + + --------------- +
今あなたがするとき:
time2=time1;
我々は持っています
+ ------- +
+ time1 |
+ ------- +
| 値|------+
+ ------- + | + --------------- +
+ ---------> | Dateオブジェクト|
| + --------------- +
+ ------- + |
+ time2 | |
+ ------- + |
| 値|------+
+ ------- +
and変数の値はオブジェクトへの参照であり、オブジェクトのコピーではありません。(すべてのオブジェクトはこのように機能します。)オブジェクト参照は、メモリ内のオブジェクトを見つける場所のメモリアドレスのようなものと考えることができます。(実際の内容は実装によって異なります。)time1
time2
Date
これは、変数の値に実際にプリミティブのデータが含まれているプリミティブとは異なります。例:
var n = 42;
結果は
+ ----------- +
+ n |
+ ----------- +
| 値:42 |
+ ----------- +
(理論的には、文字列「プリミティブ」はそれが真実であるかのように動作しますが、実際にはおそらくオブジェクトのように格納されます。問題ではありません。文字列は不変で==
あり===
、文字列プリミティブの場合はコンテンツを比較するため、できません。違いを実際に伝えて、それらが実際に変数に含まれているように見せかけることができます。[本当に混乱するだけです。JavaScriptにはNumber
、String
オブジェクトのように動作するオブジェクトもあります。])
以下の質問を再確認してください。
暫定的に、既存のオブジェクトと同一の2番目のjavascriptオブジェクトを作成する最も効率的な方法は何ですか?
JavaScriptオブジェクトには一般的な「クローン」操作がないため、答えはオブジェクトによって異なります。一部のオブジェクトは、不変(変更できない)であり、クローンを作成する必要がないため(String
たとえば、オブジェクト)、クローンを作成する必要はありません。
日付のクローンを作成するには、簡単です。
time2 = new Date(time1);
または、もう少し効率的です。
time2 = new Date(+time1);
(+
はtime1
オブジェクトにそれ自体を数値に変換するように指示し、Date
コンストラクターはその数値を使用するためです。これがないと、time1
オブジェクトはそれ自体を文字列に変換するように求められ、Date
コンストラクターはその文字列を解析します。それでも機能しますが、数字を介して、マイクロでほぼ確実に時期尚早の最適化であり、エンジンが使用したい隠れた最適化を妨げる可能性がありますtime2 = new Date(time1);
。