整个对象及其属性

时间:2016-11-20 21:06:44

标签: 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(`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'对象而不是创建新对象。

1 个答案:

答案 0 :(得分:2)

在这两种情况下,如果你考虑一下,行为实际上非常相似。我们请记住,"set in f"已经存在"initial value"。新值将覆盖o.message的现有值o,就像将对象文字指定给变量o时覆盖之前的值一样,而它已经存在。

如果从背景角度来看,同样的说法是正确的。如果window是一个全局变量,它实际上(在某种程度上)可以被视为全局对象上的属性,在浏览器中为window.o。因此,如果o = {}已经存在,并且您执行了window.o = {}之类的分配(在此示例中与{{1}}相同),则行为完全相同。

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