javascriptの中の原始値と対象を議論します.
2895 ワード
javascriptはデータタイプを二つの種類に分けます.元の値(undefined、null、ブール値、数字と文字列)、対象(オブジェクト、関数と配列)
元の値は変更できません.オブジェクトは変更できます.オブジェクトは参照の種類です.
「元の値は変えてはいけません.変えてはいけません.頭を使っている学生は疑います.文字列は変えられます.信じません.下を見てください.」
元の値の比較は比較に値するので、彼らが等しい時やっと等しいです.
元の値とは違って、次のように修正できます.
以下のコードを証明します.
'対象の値は全部引用です.'下記のコードの証明書を提出します.
'オブジェクトの比較はすべて参照の比較であり、それらが同一のベースオブジェクトを参照する場合にのみ等しい'というコードを証明します.
上記のように、オブジェクトの割当値は、参照のみであり、コピーは行われていません.コピーのコピーを取得するには、オブジェクトの属性または配列の各要素を明示的にコピーする必要があります.
私は浅学非才で、足りないところがあります.
元の値は変更できません.オブジェクトは変更できます.オブジェクトは参照の種類です.
「元の値は変えてはいけません.変えてはいけません.頭を使っている学生は疑います.文字列は変えられます.信じません.下を見てください.」
var a = 'aa';
alert(a.toUpperCase());// AA
実際には、これらは表面的な現象で、元の値文字列'a'は変更されていません.コピーしただけで、新しいコピーに対して'toUpperCase'関数を使用します.以下のコードがあります.var a = 'aa';
a.toUpperCase();
alert(a);// 'aa'
見ていますが、文字列'a'は変わりません.元の値の比較は比較に値するので、彼らが等しい時やっと等しいです.
元の値とは違って、次のように修正できます.
var obj = {'a' : 1, 'b' : 2};
obj.a = 3;
obj.b = 4;
var arr = [1, 2, 3];
arr[0] = 4;
オブジェクトの比較は、同じ属性と値を含む2つのオブジェクトでも、同じではないです.以下のコードを証明します.
var a = {'x' : 1}, b = {'x' : 1};
alert(a === b);//false
var c = [1], d = [1];
alert(c === d);//false
オブジェクトの値はすべて参照であり、オブジェクトの比較はすべて参照の比較であり、それらが同じベースオブジェクトを参照する場合にのみ等しいです.'対象の値は全部引用です.'下記のコードの証明書を提出します.
var a = {'x' : 1};
var b = a;
a.x = 2;
alert(b.x);// 2
var c = function(){
this.x = 1;
}
var d = new c;
var e = d;
d.x = 3;
alert(e.x);// 3
var aa = [1, 2, 3];
var bb = aa;
aa[0] = 11;
alert(bb[0]);// 11
'オブジェクトの比較はすべて参照の比較であり、それらが同一のベースオブジェクトを参照する場合にのみ等しい'というコードを証明します.
var a = [1, 2, 3];
var b = a;
a[1] = 5;
alert(a === b);// true
var aa = [1, 2, 3];
var bb = [1, 2, 3];
alert(aa === bb);// false
上記のように、オブジェクトの割当値は、参照のみであり、コピーは行われていません.コピーのコピーを取得するには、オブジェクトの属性または配列の各要素を明示的にコピーする必要があります.
var a = [1, 2, 3, 4, 5];
var b = [];
for(var i =0, _len = a.length; i < _len; i++){
b[i] = a[i];
}
同じように、2つの配列またはオブジェクトを比較するには、配列またはオブジェクトの各要素または属性を比較しなければなりません.私は浅学非才で、足りないところがあります.