This question already has answers here:
Is JavaScript a pass-by-reference or pass-by-value language?
                                
                                    (30个答案)
                                
                        
                3年前关闭。
            
        

我有一个设置新对象名称的人的代码。

function setName(human) {
    human.name = "Nicholas";
    human = new Object();
    human.name = "Greg";
};

var newPerson = new Object();
setName(newPerson);
console.log(newPerson.name);


我想使用人员对象的属性“名称”的值。

我原以为该值是“格雷格”,但我正在获得“尼古拉斯”。

这是我的理解:“人”是指向对象的指针。调用该函数时,将使用newPerson的名称创建指向同一Object的另一个指针。

newPerson对象的'name'属性将设置为'Nicholas'。然后,在函数的第二行中创建另一个newPerson对象。因此,一审应被销毁。然后,此新对象的“名称”属性将设置为“格雷格”。我要去哪里错了?

最佳答案

将具有对象值的变量视为这些对象的句柄。

var newPerson = new Object();


您创建了一个新对象和一个名为newPerson的句柄。

setName(newPerson);

function setName(human) {


调用setName时,会将newPerson复制到human中。因此,现在您有两个引用同一对象的句柄。碰巧这两个函数实际上都可以在函数内部访问,但这对讨论并不重要。

    human.name = "Nicholas";


human引用的对象具有新名称。由于humannewPerson仍然是同一对象的句柄,因此newPerson.name现在也已更改。

    human = new Object();


现在手柄变了。 newPerson仍然继续是Nicholas的句柄,但是human成为新对象的句柄。

    human.name = "Greg";


这个新对象的名称是Greg。这不会以任何方式影响尼古拉斯。

};

console.log(newPerson.name);


newPerson仍然是Nicholas的把柄。

10-07 17:36