1

据我了解,stringJavaScript 中的(基本)类型是原始类型,这意味着它的变量是在堆栈上分配的。

我原以为要在堆栈上分配一个类型,它需要有一个固定的大小——这可能适用于其他原始类型,如boolean,number等。

我是否有某种错误的假设,或者是否有其他一些内部魔法用于string在 JavaScript 原始类型中创建 s?


编辑:当人们认为 JavaScript 是松散类型时,这会变得更加复杂。这让我想知道如何在堆栈上分配任何局部变量......鉴于在函数过程中可能分配给它的大小不是固定的。

但我想(可能是简化的)答案可能是所有局部变量都可以在堆栈上分配一个固定的最大大小。假设这是 8 个字节,我认为这是number类型的大小,并且应该足够大以容纳所有其他原始类型(除了string) 以及内存地址(当为局部变量分配引用类型时)。但是,字符串肯定不能限制为 8 个字节(或任何大小)。这让我得出结论,字符串(即使是原始类型的)没有(不能)分配在堆栈上。因此,JavaScript 中的术语“原始类型”被用来表示“基本/构建块”类型,而不是必须在堆栈上分配的类型(与我在包括“Professional JavaScript.. .”尼古拉斯·扎卡斯)。

任何人有任何其他看法或指向一个好的来源谈论这个?

4

3 回答 3

1

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

做的时候:

var s = "this is a string";

你实际上是这样做的:

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

窗帘后面。

第一个是带有字符的原始数组,第二个是指该数组。

字符串是不可变的,这意味着它们无法更改。如果您尝试更改它(即反转它),您将创建一个新的字符串原语,对象引用将指向该原语。

于 2012-09-14T12:12:22.413 回答
0
  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 中使用“原始”是否有意义,因为这条线是模糊的。

字符串是“值对象”,这意味着您不能更改任何属性。例如,当您替换字符串中的字符时,您会得到一个新字符串;旧字符串不会改变。

于 2012-09-14T12:08:23.900 回答
0

用于在 Javascript 解释器中表示变量的存储不需要看起来像堆栈 - 它依赖于实现。

于 2012-09-14T12:05:43.510 回答