【问题标题】:Why reassigning of an object have different value? [duplicate]为什么重新分配一个对象有不同的价值? [复制]
【发布时间】:2021-07-03 22:41:31
【问题描述】:

我知道这听起来有点愚蠢,但我有点卡在这里。

let a={
    name:'Pete',
};
let b=a;

更改 a 的属性。

a.name='Cindy';
b;  //{name: "Cindy"}, b follows a exactly.

为 a 添加属性。

a.age=20;
b; //{name: "Cindy", age: 20}, b still follows a.

这就是问题所在,现在 b 不跟随 a...它现在具有不同的值。为什么..?

a={};
b; // {name: "Cindy", age: 20}. b is different from a.

【问题讨论】:

  • 因为你再次将a初始化为一个空对象
  • Object 保存了引用的内存空间,所以a.name = 'Cindy'age = '20' saving in the same memory. but when you declare a = {}` 基本上就是一个make new address 的意思。所以 b 不会跟随新地址,除非你再次声明 b = a

标签: javascript


【解决方案1】:

对象是通过引用而不是值来存储的。

let a = { name:'Pete' };

上面的行在内存中创建了一个对象,变量a存储了对该对象的引用。

let b = a

当您使b 等于a 时,变量b 也存储对同一对象的引用。

现在,每当您对对象进行任何更改时,它都会反映在变量 ab 中,因为它们都存储对同一对象的引用。

现在,当您执行a = {} 时,这会在内存中创建一个新对象(空),变量a 现在存储对这个新对象的引用。但这不会改变变量b,因为它存储了对第一个没有改变的对象的引用。

【讨论】:

  • 当然:)我做到了:)
【解决方案2】:

当你这样做时

let a = {
  name:'Pete',
};
let b = a;
  • let a = { name:'Pete'} 表示创建分配一些内存并将该对象 {name: 'Pete'} 存储在其中。并且可以使用名为a 的变量访问该内存位置
  • let b = a,因为a 是一个执行b = a 的对象,将变量b 指向相同的内存位置。

所以,现在我们有两个变量指向同一个内存位置。当我们尝试使用任何其他变量访问数据时,将反映使用任何变量对属性进行的更改。这就是为什么当你做 a.name='Cindy'; 或添加一个新的 prop a.age=20; 时,当我们尝试访问 b 时也会看到。

             ___________________
            |                   |
a ----->    | Memory Location 1 |    <------ b
            | { name: 'Pete' }  |
            |___________________|

来做a={};,意思是你要求分配一个新的内存。所以,现在ab 指向不同的内存位置,而b 指向旧的内存位置。因此,我们仍然可以看到值为{name: "Cindy", age: 20}

             ___________________
            |                   |
a ----->    | Memory Location 2 |   
            |        {}         |
            |___________________|

             _____________________________
            |                             |
b ----->    | Memory Location 1           |   
            | { name: 'Cindy', age: 20 }  |
            |_____________________________|

【讨论】:

  • 谢谢,非常直接。
【解决方案3】:

当您第一次创建对象{ name:'Pete' } 时,您将其分配给a,即a 指向内存中的该对象。

然后您将a 分配给b,但实际上您将a 指向的对象分配给b,所以现在b 指向包含相同对象的同一内存位置。

通过将空对象文字分配给a,您创建了一个新对象,a 现在指向它。

旧对象{name: "Cindy", age: 20} 仍然存在,b 仍然指向它。 b 不会改变,因为 a 不再指向同一个对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-25
    • 2014-06-02
    • 1970-01-01
    • 2017-10-31
    • 1970-01-01
    相关资源
    最近更新 更多