[英]Strings: Primitive type variables or reference type variables in javascript?
我今天再次讀了我的JavaScript書,它解釋了引用類型變量和原始類型變量之間的區別。 它給出了這些例子來說明差異。
示例1(原始類型)
var a = 3.14;
var b = a;
a = 4;
alert( b ); // Displays 3.14
示例2(引用類型)
var a = [1, 2, 3];
var b = a;
var a[0] = 99;
alert( b ); // Displays the changed array [99, 2, 3]
我理解此示例,對此沒有任何疑問。 我的問題是關於javascript中的字符串。 憑直覺,我會假設字符串是引用類型變量,因為如果使用動態大小,但是我在example.com上弄亂了它們,我創建了這個示例,該示例似乎表明字符串是原始類型變量。
示例3(字符串?)
var a = 'Ben';
var b = a;
var a = 'Benjamin';
alert( b ); //Displays the unchanged 'Ben'
我在這里搜索了堆棧溢出和google,並發現了一些有關此的文章,但大多數文章都在談論其他語言,例如Java和C#。
問題: 在javascript中,字符串是否被視為原始或引用變量類型,還有其他情況我應該知道字符串的工作方式與我期望的不同嗎?
當你做a = 'Benjamin'
,賦值運算符( =
)更改對象到a
點。 它不會更改為其他變量指向的對象。 為了顯示:
var a, b;
a = "Ben"; // `a` now points to "Ben" in memory
b = a; // `b` now points to "Ben" in memory
a = "Benjamin"; // `a` now points to "Benjamin" in memory, but
// `b` still points to "Ben"
這與字符串沒什么特別的。 任何原始值或對象值的語義都是相同的。
正如貝吉指出的那樣,您問題的答案的重要組成部分是JavaScript中的字符串是不可變的,因此,無論它們如何實現,它們本質上都充當原語。 再次說明一下:
a = "Ben"; // `a` now points to "Ben" in memory
b = a; // `b` now points to "Ben" in memory
a += "jamin"; // `a` now points to "Benjamin" in memory, but
// `b` still points to "Ben"
您知道, a += "jamin"
等效於a = a + "jamin"
,它不會更改a
和b
指向的字符串; 它將創建一個具有價值的新字符串"Benjamin"
,使a
指向它,而不是"Ben"
。 ( "Ben"
和"Benjamin"
共享內存中的任何相同字節都是對JavaScript程序完全不透明的實現細節。)
不可以。在JavaScript中,字符串是不可變的 ,因此是基本類型。
它們具有可變的大小,就像大小不同的數字一樣。 它們的大小不是動態的 ,您不能更改現有字符串值的大小。 每當您執行字符串操作時,都將創建新值。 就像var x = 1; x += 2
var x = 1; x += 2
不會更改1
值(而是創建一個新的3
值), var var a = "Hi!"; a += "!"
var var a = "Hi!"; a += "!"
不會更改字符串"Hi!"
。
在JavaScript中,字符串是基元。
不過,您應該擁有一件事。 包裝對象。 諸如字符串,數字,布爾值之類的基元被包裝在對象中,因此您可以在這些包裝器對象上調用屬性,例如:
var foo = 'bar';
var poo = foo.slice(0,-1)
poo == 'ar'; //true
在這里,字符串“ bar”被包裝在具有slice方法(以及許多其他方法)的對象中,但是在所有其他情況下(當您僅傳遞原始變量時,等等),該變量只是一個原始變量。
示例3無效,因為正如Jordan所說,如果您更改實際對象的值而不僅僅是屬性,則即使Object是JavaScript中的引用類型,該對象所指向的對象也不會更改。
但是,字符串是不可變的且是原始值,因此即使我們執行以下操作:
var a = "Hi!";
var b = a;
a[2] = "?";
alert(a);
alert(b);
a
仍然是"Hi!"
因為字符串是不可變的,並且b
仍然是"Hi!"
即使a
是"Hi?"
因為字符串是原始值。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.