簡體   English   中英

Javascript中的原始類型/引用類型

[英]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中有原始類型和引用類型。

確實如此。 但是,唯一的參考值是對象; 原始值不可變。

是否所有數字實例都是基本類型,即使它們存在於引用類型的上下文中?

是。 他們的背景不相關。

我相信這里有兩個關鍵的事情要理解:

  1. 原始值永遠不會引用
  2. 永遠不會分配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 ,因為ba指向完全相同的對象。 但是,這些引用就像存儲在給定槽中的任何其他值一樣:當您為插槽分配其他內容時,引用只會被替換為不同的值。 因此,分配給b不會影響a

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM