[英]primitive types / reference types in Javascript
我一直假設Javascript中有原始類型和引用類型。 在日常工作中,我從來沒有對我產生過影響,但我剛剛開始更多的JS,並希望更新我的'思考'。 換句話說,我打賭20美元,以下將返回68
var my_obj = {};
var tmp_obj = {};
tmp_obj.my_int = 38;
my_obj.tmp_val = tmp_obj.my_int;
tmp_obj.my_int = 68;
alert('68 means reference, 38 means primitve: ' + my_obj.tmp_val);
但它返回38。
是否所有數字實例都是基本類型,即使它們存在於引用類型的上下文中? 如果你,我真的很驚訝,發現這種奇怪的行為(並且會出20美元)。 或者我的例子沒有證明我認為它是什么?
thx提前
更新#1
哇,謝謝所有答案。 這是一個微小的變化,這對我有很大的幫助:
var my_obj={};
var tmp_obj={};
var my_obj_2=tmp_obj;
tmp_obj.my_int=38;
my_obj.tmp_val=tmp_obj.my_int;
tmp_obj.my_int=68
alert('68 means reference, 38 means primitve: ' + my_obj.tmp_val); // 38
alert('68 means reference, 38 means primitve: ' + my_obj_2.my_int); // 68
my_obj_2.my_int=78;
alert(tmp_obj.my_int); // tmp_obj is now 78 ie two way
如果你有,你的例子會按預期工作
my_obj = tmp_obj;
然后,所有屬性都將指向相同的引用,因為只有一個對象。
但是當你寫作
my_obj.tmp_val = tmp_obj.my_int;
然后my_obj.tmp_val
將獲取存儲在tmp_obj.my_int
的值,但不會在2個對象之間創建新的引用。
如果我可以使用類似Java的語法,看起來您希望代碼的行為與此類似,其中有一個整數對象的值已經變異。
tmp_obj.my_int = new Integer(38);
my_obj.tmp_val = tmp_obj.my_int;
tmp_obj.my_int.setValue(68);
由於它不打印68
您可以得出結論:整數必須是基本類型而不是引用類型。 但這並不一定如此。 考慮這種替代解釋:
tmp_obj.my_int = new Integer(38);
my_obj.tmp_val = tmp_obj.my_int;
tmp_obj.my_int = new Integer(68);
這里的整數是引用類型,但my_obj.tmp_val
仍將包含值38
,因為賦值為整數意味着覆蓋引用。
您可以將整數視為不可變對象。 JavaScript在呈現統一的所有對象視圖方面做得非常好,因此這比結果更好地解釋了“整數是原始類型”。
是的,像數字和字符串這樣的值就像原始值一樣。 他們是不變的。 為變量賦值新值會替換舊值,但不會更改其中的值。
例:
var x = 42;
var y = x; // y == 42
x = 1337; // this puts a new value in x, it doesn't change 42 to be 1337
alert(y); // it's still 42
同樣適用於字符串:
var x = "42";
var y = x; // y == "42"
x = "1337"; // this puts a new string in x, it doesn't change "42" to be "1337"
alert(y); // it's still "42"
如果你使用對象屬性;
var o = {};
o.x = 42;
o.y = o.x; // o.y == 42
o.x = 1337; // this puts a new value in o.x, it doesn't change 42 to be 1337
alert(o.y); // it's still 42
值的行為方式僅取決於其類型,而不是存儲在常規變量或對象的屬性中。
即使字符串在內部實現為對象,它也是不可變的並且作為值起作用。 復制字符串可能會復制對對象的引用,但效果是您獲得單獨的副本,因為沒有任何內容可以更改字符串值本身。
我一直假設Javascript中有原始類型和引用類型。
確實如此。 但是,唯一的參考值是對象; 原始值不可變。
是否所有數字實例都是基本類型,即使它們存在於引用類型的上下文中?
是。 他們的背景不相關。
我相信這里有兩個關鍵的事情要理解:
考慮此代碼來演示第一點:
var a = 10,
b = a,
c = {foo : 20}
d = c.foo;
b = 20;
d = 30;
a; // 10;
c.foo; // 20;
所以,你有“槽”(變量或屬性)包含原始值,而不是引用。 更改其中一個插槽中的值不會影響其他插槽。
考慮第二點:
var a = {foo: true},
b = a;
b.foo; // true
b.foo = false;
a.foo; // false;
b = {bar: false};
a; // {foo: false}
變量a
包含一個對象,而b
最初是對同一對象的引用。 分配給b.foo
會影響a
,因為b
和a
指向完全相同的對象。 但是,這些引用就像存儲在給定槽中的任何其他值一樣:當您為插槽分配其他內容時,引用只會被替換為不同的值。 因此,分配給b
不會影響a
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.