我想知道,既然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吗? 因为它们指向的是同一个内存地址?
在你做完
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);
改变一个指针不会影响另一个指向同一内存的指针。
不要用内存地址来思考这个问题。JavaScript不在这个层面上处理计算。
let user = {}
的值是 user
是一个对象的引用。
let user2 = user;
请注意 user2
是对同一对象的引用。
user.name = 'Suzan';
现在 name
属性的值 'Suzan'
.
这与使用 user2.name
以同样的方式。
user = null;
现在 user
是空的。
的值是空的。user2
仍然是对该对象的引用。
赋予 null
到 user
只是 变化 价值 的 user
. 它不会影响它的旧值所引用的对象。
console.log(user2.name);
由于 user2
是对原始对象的引用,这仍然有效。
如果您还将 user2 = null
那么就不会再有对该对象的引用,你将无法访问它(而且会被垃圾回收)。
当你对一个对象进行引用时,被引用的对象只会改变对象(user2)的属性而不会改变其形状。
如果你把用户对象改为空或空数组,user2将始终保持不变。