在函数内重新分配对象

时间:2018-02-20 04:49:32

标签: javascript pointers reference

我注意到这样的事情:

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通过值将变量传递给函数,但不是通过引用传递。那为什么它似乎能够重新分配对象内的属性,并且可以访问函数范围之外的更改?在我看来,这并不是严格意义上的“通过价值”

1 个答案:

答案 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);