我有某人的代码设置了新对象的名称。
function setName(human) {
human.name = "Nicholas";
human = new Object();
human.name = "Greg";
};
var newPerson = new Object();
setName(newPerson);
console.log(newPerson.name);
我想使用person对象的属性'name'的值。
我期待价值是'格雷格',但我得到'尼古拉斯'。
这是我的理解:'human'是指向Object的指针。调用该函数时,将通过newPerson的名称创建另一个指向同一Object的指针。
newPerson对象的'name'属性将设置为'Nicholas'。然后,在函数的第二行中创建另一个newPerson对象。因此,应该销毁第一个实例。然后,此新Object的'name'属性将设置为'Greg'。我哪里错了?
答案 0 :(得分:5)
将具有对象值的变量视为处理到这些对象。
var newPerson = new Object();
您创建了一个名为newPerson
的新对象及其句柄。
setName(newPerson);
function setName(human) {
调用setName
后,newPerson
会被复制到human
。所以现在你有两个引用相同对象的句柄。事实上,它们都可以在函数内部实际访问,但这对讨论来说并不重要。
human.name = "Nicholas";
human
引用的对象有一个新名称。由于human
和newPerson
仍是同一对象的句柄,newPerson.name
现在也已更改。
human = new Object();
现在手柄发散了。 newPerson
仍然是尼古拉斯的句柄,但human
成为新对象的句柄。
human.name = "Greg";
这个新对象的名字是格雷格。这不会以任何方式影响尼古拉斯。
};
console.log(newPerson.name);
newPerson
仍然是尼古拉斯的手柄。
答案 1 :(得分:0)
human 是函数的局部变量。
human = new Object();
在此行之后,您有本地变量 human 的新对象,但不是您发送到参数的变量
这意味着您通过值发送了参数。
例如在C#中,您可以使用关键字 ref ,这将使函数按预期工作。