Javascript 整个对象及其属性的赋值行为不同

Javascript 整个对象及其属性的赋值行为不同,javascript,object,syntax,assign,Javascript,Object,Syntax,Assign,例如,我们有以下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(`befor

例如,我们有以下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”对象,而不是创建新的对象。

如果您仔细想想,这两种情况下的行为实际上非常相似。请记住,
o.message
在您为其指定
“set in f”
时已经存在。新值将覆盖
o.message
的现有值
“初始值”
,就像将对象文字分配给变量
o
时覆盖先前的值一样,该值已经存在

如果你从上下文的角度来看,同样的说法是正确的。如果
o
是一个全局变量,它实际上(在某种程度上)可以被视为全局对象上的一个属性,即浏览器中的
window
。因此,如果
window.o
已经存在,并且您执行类似
o={}
的赋值(与本例中的
window.o={}
相同),则行为是相同的


在所有情况下,当重写变量或属性的现有值时,同时修改变量或属性所在的上下文。这只是一个视角的问题。

如果你仔细想想,这两种情况下的行为实际上非常相似。请记住,
o.message
在您为其指定
“set in f”
时已经存在。新值将覆盖
o.message
的现有值
“初始值”
,就像将对象文字分配给变量
o
时覆盖先前的值一样,该值已经存在

如果你从上下文的角度来看,同样的说法是正确的。如果
o
是一个全局变量,它实际上(在某种程度上)可以被视为全局对象上的一个属性,即浏览器中的
window
。因此,如果
window.o
已经存在,并且您执行类似
o={}
的赋值(与本例中的
window.o={}
相同),则行为是相同的


在所有情况下,当重写变量或属性的现有值时,同时修改变量或属性所在的上下文。这只是一个视角问题。

不……非常简单的例子是
{}={}
。每个对象都是一个新对象,不引用其他对象不…非常简单的示例是
{}={}
。每个都是一个新对象,没有引用otherNice解释。唯一的区别是对象是语言值,可以传递,而可变环境不是可访问的实体。非常感谢您的解释!很好的解释。唯一的区别是对象是语言值,可以传递,而可变环境不是可访问的实体。非常感谢您的解释!