在 javascript 下面的代码是如何工作的
In javascript how does the below code works
在 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);
}
以上代码打印错误。
但是,如果我注释掉 a={} 行,则控制台上打印的值为 true。
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。
第一种情况:
var a2 = a; // now a2 and a have reference (or point to) the same object"
a= {}; // a now points to new reference
因为 a 和 a2 点都有不同的引用,即为什么它首先 returns false。
当您评论 a= {}
时,a 和 a2 都指向相同的位置或存储相同的引用,这就是为什么它 returns 为真。
...as Both variables(a and a2) points to the same object ...
他们不再这样了,从这行开始:
a={};
此时,a2
指的是旧对象,a
指的是一个新的、不同的对象。
a2 = a
不会在 变量 a2
和 变量之间创建任何类型的 link =49=] a
.
让我们加入一些 Unicode 艺术:
此代码运行后:
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
:变量引用了不同的对象。
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
获取 var a 的 value,而不是 reference 所以当 var a 改变时, var a2 不会 改变。
第一种情况在这一行之后 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);
}
在 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);
}
以上代码打印错误。
但是,如果我注释掉 a={} 行,则控制台上打印的值为 true。
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。
第一种情况:
var a2 = a; // now a2 and a have reference (or point to) the same object"
a= {}; // a now points to new reference
因为 a 和 a2 点都有不同的引用,即为什么它首先 returns false。
当您评论 a= {}
时,a 和 a2 都指向相同的位置或存储相同的引用,这就是为什么它 returns 为真。
...as Both variables(a and a2) points to the same object ...
他们不再这样了,从这行开始:
a={};
此时,a2
指的是旧对象,a
指的是一个新的、不同的对象。
a2 = a
不会在 变量 a2
和 变量之间创建任何类型的 link =49=] a
.
让我们加入一些 Unicode 艺术:
此代码运行后:
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
:变量引用了不同的对象。
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
获取 var a 的 value,而不是 reference 所以当 var a 改变时, var a2 不会 改变。
第一种情况在这一行之后 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);
}