可变大小的JavaScript字符串是如何成为基本类型的?

可变大小的JavaScript字符串是如何成为基本类型的?,javascript,string,stack,primitive-types,Javascript,String,Stack,Primitive Types,据我所知,JavaScript中的(basic)string类型是一种基本类型,这意味着它的变量是在堆栈上分配的 我会认为,要在堆栈上分配类型,它需要有一个固定的大小——这可能适用于其他基本类型,如boolean,number,等等 我是不是想错了,还是其他一些内部魔法被用来在JavaScript原语类型中生成strings 编辑: 当考虑到JavaScript是松散类型时,这会变得更加复杂。这让我想知道如何在堆栈上分配任何局部变量。。。。假设在函数执行过程中可能分配给它的内容的大小不是固定的

据我所知,JavaScript中的(basic)
string
类型是一种基本类型,这意味着它的变量是在堆栈上分配的

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

我是不是想错了,还是其他一些内部魔法被用来在JavaScript原语类型中生成
string
s


编辑: 当考虑到JavaScript是松散类型时,这会变得更加复杂。这让我想知道如何在堆栈上分配任何局部变量。。。。假设在函数执行过程中可能分配给它的内容的大小不是固定的

但我想(可能是简化的)答案可能是所有局部变量都可以在堆栈上指定一个固定的最大大小。假设这是8个字节,我认为这是
数字
类型的大小,并且应该足够大以容纳所有其他基本类型(除了
字符串
)以及内存地址(当局部变量被指定为引用类型时)。但是,字符串肯定不能限制为8字节(或者任何大小)。这使我得出结论,字符串(即使是基元类型的字符串)没有(不能)在堆栈上赋值。因此,JavaScript中的“基本类型”一词被用来表示“基本/构建块”类型,而不是必须在堆栈上分配的类型(这与我在很多资料中读到的内容相矛盾,包括尼古拉斯·扎卡斯的《专业JavaScript…》一书)


任何人有任何其他的想法或指向一个好的源代码的指针来谈论这个问题吗?

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

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

  • 未在堆栈上分配字符串
  • 分配变量的位置不区分原语和对象
  • 字符串不是原语,它们属于“string”类
  • 基元和类型之间的区别在于,类型具有方法,您可以为它们指定新属性:

    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);
    ​
    
    给予

    总之,我不确定在JavaScript中使用“primitive”是否有意义,因为行是模糊的

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

  • 未在堆栈上分配字符串
  • 分配变量的位置不区分原语和对象
  • 字符串不是原语,它们属于“string”类
  • 基元和类型之间的区别在于,类型具有方法,您可以为它们指定新属性:

    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);
    ​
    
    给予

    总之,我不确定在JavaScript中使用“primitive”是否有意义,因为行是模糊的


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

    字符串既是对象又是基元

    执行以下操作时:

    var s = "this is a string";
    
    你实际上是:

    var s = new string("this is a string");
    
    在窗帘后面

    第一个是带有字符的基元数组,第二个基元数组引用该基元数组


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

    字符串既是对象又是基元

    执行以下操作时:

    var s = "this is a string";
    
    你实际上是:

    var s = new string("this is a string");
    
    在窗帘后面

    第一个是带有字符的基元数组,第二个基元数组引用该基元数组


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

    第一个字符串实际上是基元类型,而第二个是引用类型,它是基元字符串类型的包装。是的,但这意味着我的原始问题仍然没有回答:)第一个字符串实际上是一个基本类型,而第二个是一个引用类型,它是基本字符串类型的包装器。是的,但这意味着我的原始问题仍然没有回答:)所有基本类型都有相应的引用类型包装器-
    newnumber()
    new String()
    new Boolean()
    等。当您在基本字符串类型上调用一个方法时,在幕后1)创建一个新的String()实例2)在该实例上调用该方法3)然后销毁该实例。此外,根据各种来源,JavaScript有以下五种基本类型:未定义、Null、Boolean、,数字和字符串。(虽然我经常发现它们是这样写的,但我认为它们应该以小写字母开头,以区别于相应的引用包装类型。)最后,根据Nicholas Zakas为Web开发人员编写的专业JavaScript:“基本值是存储在堆栈内存中的简单数据段…”(我的重点),与你的观点相矛盾2.重新引用Nicholas Zakas的话:这要么不正确,要么过于简单化。另外,当你调用字符串上的方法时,JavaScript不会创建新字符串。该方法可能会返回一个新字符串实例,但在JavaScript中调用任何方法都不会自动创建克隆。嗯,三步流程oned是由Nicholas Zakas文本从同一文本中解释的。所以我相信它,除非我被指向一个更权威的来源来反驳它。另外,关于你的观点,能够“调用方法”使