整个对象及其属性的分配行为不同
Assignment behavior differs for whole object and its attributes
例如我们有以下JavaScript代码:
function f(o) {
o.message = "set in f";
o = {
message: "new object!"
};
console.log(`inside f: o.message="${o.message}" (after assignment)`);
}
let o = {
message: 'initial value'
};
console.log(`before calling f: o.message="${o.message}"`);
f(o);
console.log(`after calling f: o.message="${o.message}"`);
在这些特定的行中
o = {
message: "new object!"
};
我们正在创建名称为 'o' 的新对象,但在上一行中
o.message = "set in f";
我们正在修改名称为 'o' 的原始对象的属性(因此根据我的理解修改对象本身)。
我的问题是为什么在这些情况下赋值行为会有所不同?对象本身及其属性不应该相同吗?
例如 'o' 函数主体中的赋值应该更改原始 'o' 对象而不是创建新对象。
如果您考虑一下,在这两种情况下,行为实际上非常相似。请记住,在您将 "set in f"
分配给它时,o.message
已经存在。新值将覆盖 o.message
的已经存在的值 "initial value"
,就像将对象文字分配给变量时 o
覆盖先前的值,而它已经存在。
如果从上下文来看,同样的说法也是正确的。如果 o
是一个全局变量,它实际上(在某种程度上)可以看作是全局对象上的 属性,在浏览器中是 window
。因此,如果 window.o
已经存在,并且您执行类似 o = {}
的赋值(与本例中的 window.o = {}
相同),行为是相同的。
在所有情况下,当您覆盖变量或 属性 的现有值时,您同时修改了变量或 属性 所在的上下文。这只是一个观点问题。
例如我们有以下JavaScript代码:
function f(o) {
o.message = "set in f";
o = {
message: "new object!"
};
console.log(`inside f: o.message="${o.message}" (after assignment)`);
}
let o = {
message: 'initial value'
};
console.log(`before calling f: o.message="${o.message}"`);
f(o);
console.log(`after calling f: o.message="${o.message}"`);
在这些特定的行中
o = {
message: "new object!"
};
我们正在创建名称为 'o' 的新对象,但在上一行中
o.message = "set in f";
我们正在修改名称为 'o' 的原始对象的属性(因此根据我的理解修改对象本身)。
我的问题是为什么在这些情况下赋值行为会有所不同?对象本身及其属性不应该相同吗?
例如 'o' 函数主体中的赋值应该更改原始 'o' 对象而不是创建新对象。
如果您考虑一下,在这两种情况下,行为实际上非常相似。请记住,在您将 "set in f"
分配给它时,o.message
已经存在。新值将覆盖 o.message
的已经存在的值 "initial value"
,就像将对象文字分配给变量时 o
覆盖先前的值,而它已经存在。
如果从上下文来看,同样的说法也是正确的。如果 o
是一个全局变量,它实际上(在某种程度上)可以看作是全局对象上的 属性,在浏览器中是 window
。因此,如果 window.o
已经存在,并且您执行类似 o = {}
的赋值(与本例中的 window.o = {}
相同),行为是相同的。
在所有情况下,当您覆盖变量或 属性 的现有值时,您同时修改了变量或 属性 所在的上下文。这只是一个观点问题。