簡體   English   中英

字符串:javascript中的原始類型變量或引用類型變量?

[英]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" ,它不會更改ab指向的字符串; 它將創建一個具有價值的新字符串"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.

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