В JavaScript, как работает приведенный ниже код - PullRequest
0 голосов
/ 30 июня 2018

В Javascript как работает приведенный ниже код.

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v";
a = {};
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}

Приведенный выше код печатает false.

Но если я закомментирую строку a = {}, значение, которое выводится на консоль, будет истинным.

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v";
//a={};
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}

Как работает приведенный выше код, поскольку обе переменные (a и a2) указывают на один и тот же объект, но когда я инициализировал a с помощью {}, он дал false.

Ответы [ 4 ]

0 голосов
/ 30 июня 2018

В первом случае после этой строки var a2 = a; a снова инициализируется как пустой объект, так что теперь a & a2 - это две разные ссылки

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a = {};
console.log(a, a2)
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}

Во втором случае они указывают на одно и то же местоположение, поэтому добавление нового свойства отразится и на другом.

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v";
console.log(a, a2)
//a={};
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}
0 голосов
/ 30 июня 2018

... as Обе переменные (a и a2) указывают на один и тот же объект ...

Они больше не, с этой строки:

a={};

В этот момент a2 относится к старому объекту, а a относится к новому, другому объекту.

a2 = a не создает никакой непрерывной связи между переменной a2 и переменной a.

Давайте добавим немного юникод-арта:

После запуска этого кода:

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v";

На данный момент, у вас есть что-то подобное в памяти (с опущенными различными деталями):

a:Ref44512−−−+
             |
             |
             |    +−−−−−−−−−−−−−+                 
             +−−−>|  (object)   |                 
             |    +−−−−−−−−−−−−−+                 
             |    | prop1: "a"  |                 
             |    | prop2: "b"  |   +−−−−−−−−−−−−+
a2:Ref44512−−+    | fun:Ref7846 |−−>| (function) |
                  | vn: "v"     |   +−−−−−−−−−−−−+
                  +−−−−−−−−−−−−−+                 

Эти значения "Ref" являются ссылками на объекты. (На самом деле мы никогда не видим их значений, эти значения просто выдуманы.) Обратите внимание, что значение в a и значение в a2, однако, одинаковы.

Если в этот момент вы сделаете a === a2, это будет true: обе переменные ссылаются на один и тот же объект.

Но когда вы сделаете это:

a={};
                  +−−−−−−−−−−−−−+
a:Ref84521−−−−−−−>|  (object)   |
                  +−−−−−−−−−−−−−+

                  +−−−−−−−−−−−−−+                 
a2:Ref44512−−−−−−>|  (object)   |                 
                  +−−−−−−−−−−−−−+                 
                  | prop1: "a"  |                 
                  | prop2: "b"  |   +−−−−−−−−−−−−+
                  | fun:Ref7846 |−−>| (function) |
                  | vn: "v"     |   +−−−−−−−−−−−−+
                  +−−−−−−−−−−−−−+                 

На данный момент a === a2 равно false: переменные ссылаются на разные объекты.

0 голосов
/ 30 июня 2018

var a = {
  prop1: "a",
  prop2: "b",
  fun: function() {
    return this.prop1 + " " + this.prop2;
  }

}
var a2 = a;
a.fn = "v"; 
a = {}; 
console.log(a);
console.log(a2);
if (a === a2) {
  console.log(true);
} else {
  console.log(false);
}

Внимательно посмотрите на свой код. a не инициализируется до {}. Он был инициализирован в первой строке, где написано var a =. Я распечатал оба значения для вас. var a2 получает значение переменной a, а не ссылку , поэтому, когда var a изменяется, var a2 не не изменить.

0 голосов
/ 30 июня 2018

В первом случае:

var a2 = a; // now a2 and a have reference (or point to) the same object"
a= {}; // a now points to new reference

Поскольку точки a и a2 имеют разные ссылки, т. Е. Почему вначале возвращается false.

Когда вы комментируете a= {} и a, и a2 указывают на одно и то же местоположение или сохраняют одну и ту же ссылку, поэтому она возвращает true.

...