代码之家  ›  专栏  ›  技术社区  ›  Yousef Dawood

javascript中的不变性是什么意思

  •  -1
  • Yousef Dawood  · 技术社区  · 10 月前

    因此,在Javascript文档中,他们说所有原语都是不可变的

    所以我的问题是 当我写作时 let x = 'foo'; x = 'bar' ; 这是否意味着a foo 位于独立的内存位置 和 酒吧 在另一个内存位置,垃圾回收将收集旧的 foo

    或者它只是替换了 foo 酒吧 在首次定义的同一内存位置?

    2 回复  |  直到 10 月前
        1
  •  0
  •   Nicholas Tower    10 月前

    所以我的问题是,当我写let x='foo'时;x=“bar”;这是否意味着foo位于一个独立的内存位置,bar位于另一个内存位置,垃圾回收将收集旧的foo

    是的,但这并不是基元独有的,对象也会发生这种情况。如果你这样做:

    let x = { foo: 'foo' };
    x = { bar: 'bar' };
    

    新对象存储在另一个内存位置,第一个对象可以被垃圾回收(假设没有其他对象引用它)。

    当他们说基元是不可变的时,他们的意思是别的。它们意味着你不能对记忆中的那个位置进行更改。例如, x.toUpperCase() 无法更改现有字符串中存储的内容,它只能返回一个新字符串。或者,如果你这样做:

    //'use strict';
    let a = 1;
    a.nickname = 'alpha';
    console.log(a.nickname);

    在严格模式下,你要么会得到一个错误,要么在非严格模式下什么都不会发生。

    相比之下,对象 可以 被突变。您可以更改它们所包含的内容,同时仍将它们保留在内存中的同一位置:

    let x = { foo: 'foo' };
    let y = x; // Create another way to refer to the same spot in memory
    x.bar = 'bar';
    console.log(x); // Includes .bar
    console.log(y); // Also include .bar, since it's the same object, which has been mutated.
        2
  •  0
  •   Joshua George    10 月前

    所以我的问题是,当我写let x='foo'时;x=“bar”;这意味着什么 foo位于一个独立的内存位置,bar位于另一个内存中 位置和垃圾收集将收集旧的 foo

    你在这里点击,旧值和新值占据了不同的内存位置。

    x = 'foo' , foo 存储在一个存储位置。

    当你这样做的时候 x = 'bar' , bar 存储在不同的内存位置,x现在指向该新位置,然后旧值'foo'有资格进行垃圾回收。

    因此,在Javascript中,基元是不可变的,每个新赋值在内存中创建一个新值,而不是修改现有值。