Javascript Объект - это - PullRequest
       85

Javascript Объект - это

0 голосов
/ 08 мая 2020

Я хотел бы знать, что, поскольку объекты на 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? Поскольку они указывают на одни и те же адреса памяти?

Ответы [ 3 ]

1 голос
/ 08 мая 2020

Не думайте об этом в терминах адресов памяти. 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, тогда не останется ссылок на этот объект, и вы не сможете получить к нему доступ (и он будет собирать мусор).

1 голос
/ 08 мая 2020

Когда вы делаете ссылку на объект, указанный объект изменит только свойство, а не форму объекта (user2).

Если вы измените объект пользователя на нулевой или пустой массив, user2 всегда будет оставайся прежним.

1 голос
/ 08 мая 2020

После того, как вы сделаете

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);

Изменение одного указателя не влияет на другой указатель, который указывает на ту же память.

...