簡體   English   中英

可變大小的JavaScript字符串如何是原始類型?

[英]How is the variable sized JavaScript string a primitive type?

據我了解,JavaScript中的(基本) string類型是原始類型,這意味着其變量分配在堆棧上。

我本來以為要在堆棧上分配一個類型,它必須具有固定的大小-這對於其他基本類型(如booleannumber等)也是如此。

我以某種方式是錯誤的假設,還是在JavaScript基本類型中使用了其他一些內部魔術來制作string


編輯:當人們認為JavaScript是松散類型時,這變得更加復雜。 這讓我想知道如何在堆棧上分配任何局部變量。...鑒於函數過程中可能分配給該變量的大小是不確定的。

但是我想(也許是簡化的)答案可能是所有局部變量都可以在堆棧上分配一個固定的最大大小。 假設這是8個字節,我認為這是number類型的大小,並且應該足夠大以容納所有其他原始類型( string除外)以及內存地址(用於為局部變量分配引用類型時) 。 但是,字符串肯定不能限制為8個字節(或任何大小)。 這使我得出結論,沒有(不能)在堆棧上分配字符串(甚至是原始類型的字符串)。 因此,JavaScript中的“原始類型”一詞用於表示“基本/構建塊”類型,而不是必須在堆棧上分配的類型(這與我在眾多書籍(包括《專業JavaScript》)中所讀到的內容相矛盾。 ”(尼古拉斯·扎卡斯)。

有人對此有其他看法或指向好的消息來源的指針嗎?

字符串既是對象又是基元。

進行時:

var s = "this is a string";

您實際上是這樣做的:

var s = new string("this is a string");

在窗簾后面。

第一個是帶有字符的原始數組,第二個是字符數組。

字符串是不可變的,這意味着它們不能更改。 如果嘗試更改(即反轉)它,則將創建一個新的字符串基元,對象引用將指向該基元。

用於在Javascript解釋器中表示變量的存儲不必看起來像堆棧-它取決於實現。

  1. 字符串未分配在堆棧上
  2. 分配變量的位置無法區分原始對象和對象
  3. 字符串不是基元,它們屬於“字符串”類

基本類型和類型之間的區別在於類型具有方法,您可以為其分配新屬性:

var a = 1, b = {}, s = '';
a.foo = 1; // doesn't work, but no error either
b.foo = 1; // works
s.foo = 1; // doesn't work, but no error either

console.log(a.foo);
console.log(b.foo);
console.log(s.foo);
​

undefined
1
undefined

因此,總之,由於行模糊,我不確定在JavaScript中使用“原始”是否有意義。

字符串是“值對象”,這意味着您無法更改任何屬性。 例如,當您替換字符串中的字符時,會得到一個新的字符串。 舊的字符串不變。

暫無
暫無

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

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