我注意到这样的事情:
let x = { a: 1 };
function reassignProperty(obj, key, newValue) {
obj[key] = newValue;
}
reassignProperty(x, "a", "hello");
console.log(x.a); //prints hello
但这不是:
function reassignObject(obj) {
obj = { a: "some new value" };
}
reassignObject(x);
console.log(x.a); //still prints hello
似乎你可以重新分配对象的属性(对象中的指针),即使这些值本身就是引用类型。即我们可以做reassignProperty(x, "a", { inner: 55 })
之类的事情,但在功能范围之外它仍然是相同的。但重新分配对象本身的引用不是吗?
我见过人们认为javascript通过值将变量传递给函数,但不是通过引用传递。那为什么它似乎能够重新分配对象内的属性,并且可以访问函数范围之外的更改?在我看来,这并不是严格意义上的“通过价值”
答案 0 :(得分:0)
在第二种情况下,使用点符号而不是对象文字
let x = {
a: 1
};
function reassignObject(obj) {
console.log("Passed from function call ", obj);
if (obj.hasOwnProperty('a')) {
obj.a = "some new value"
}
console.log("After reassinging value ", obj)
}
reassignObject(x);
console.log(x.a);