Javascript对象 - 这个

问题描述 投票:0回答:1

我想知道,既然JavaScript中的对象是以引用的形式工作的,那么我如何从一个克隆的对象中获取属性值,如下图所示。

let user = {
  name: 'Dan',
  age: 26,
  sayHi(){
      console.log('Hi', this.name);
  }
    
}

let user2 = user;

user.name = 'Suzan';
user = null;

console.log(user2.name);
//return Suzan

如果对象user收到的是null, user2不应该也是null吗? 因为它们指向的是同一个内存地址?

javascript object this
1个回答
1
投票

在你做完

user2 = user;

两个变量都指向同一个对象。但是当你做

user = null;

你只要改变一下 user 指向,但这并不会影响到 user2 是指向的。它仍然指向原始对象。

如果你熟悉C等语言,就类似于这样。

struct u {
    char *name;
    int age;
};

struct u foo = {"Dan", 26};

struct u *user = &foo;
struct u *user2 = user;

user->name = "Suzan";
user = NULL;

printf("%s\n", user2->name);

改变一个指针不会影响另一个指向同一内存的指针。


1
投票

不要用内存地址来思考这个问题。JavaScript不在这个层面上处理计算。

let user = {}

的值是 user 是一个对象的引用。

let user2 = user;

请注意 user2 是对同一对象的引用。

user.name = 'Suzan';

现在 name 属性的值 'Suzan'.

这与使用 user2.name 以同样的方式。

user = null;

现在 user 是空的。

的值是空的。user2 仍然是对该对象的引用。

赋予 nulluser 只是 变化 价值user. 它不会影响它的旧值所引用的对象。

console.log(user2.name);

由于 user2 是对原始对象的引用,这仍然有效。

如果您还将 user2 = null 那么就不会再有对该对象的引用,你将无法访问它(而且会被垃圾回收)。


1
投票

当你对一个对象进行引用时,被引用的对象只会改变对象(user2)的属性而不会改变其形状。

如果你把用户对象改为空或空数组,user2将始终保持不变。

© www.soinside.com 2019 - 2024. All rights reserved.