为什么对象没有分配空值

时间:2018-06-24 20:04:47

标签: javascript

如何解释此功能clear()的行为? 为什么对象a没有分配空值?

var a = {};
function clear(a) {
  a.b = 2;
  a = null;
}
clear(a);

console.log(a);    // {b: 2}
console.log(a.b);  // 2

2 个答案:

答案 0 :(得分:1)

a传递给函数clear时,会将引用的副本传递给对象a。因此,执行a.b = 2;会在对象b中设置值a

但是正如我在a函数内部提到的clear只是引用的副本,因此将其设置为null只是说clear函数内部参数a指向null。它不会修改原始对象。

答案 1 :(得分:1)

在JavaScript中创建变量时,您不使用对象本身。您正在使用对该对象的引用。可以将变量视为指向对象的符号(在诸如C等其他语言中,这些引用也被称为指针)。

此外,函数内部引用的任何参数都是它们自己的不同引用。因此,在函数内部将这些变量分配给其他变量不会更改(变异)它们引用的对象。

例如:

var someObject = {a: 1, b:2, c:3};
function doSomething(a) {
    a = null;
}

doSomething(someObject);
console.log(someObject) // {a: 1, b:2, c:3}

doSomething函数内部唯一发生的事情是a被设置为指向null而不是someObject

在您的示例中,您有一个名为a的全局变量(在函数外部定义的变量)和一个也称为a的局部函数变量。如果要让函数更改全局a,则必须从clear中删除参数,或者更改参数名称,并仍在a中引用clear功能,就像这样:

var a = {};
function clear() {
    a.b = 2;
    a = null;
}
clear();

console.log(a);    // null
console.log(a.b);  // Uncaught TypeError: Cannot read property 'b' of null

var a = {};
function clear(b) {
    a.b = 2;
    a = null;
}
clear(a);          // Note that it does not matter whether you pass a in or not

console.log(a);    // null
console.log(a.b);  // Uncaught TypeError: Cannot read property 'b' of null