基本类型(数字、字符串等)通过值传递。然而,对象是未知的,因为它们都可以通过值传递(在这种情况下,我们认为保存对象的变量是
基本类型(数字、字符串等)通过值传递。但对象是未知的,因为它们既可以通过值传递(在这种情况下,我们认为保存对象的变量是对象的引用),也可以通过引用传递(我们认为对象的变量保存对象本身)。
虽然最终这并不重要,但我想知道传递参数约定的正确方式是什么。是否有 JavaScript 规范摘录,其中定义了关于此的语义应该是什么?
它总是按值传递,但对于对象来说,变量的值是引用。因此,当您传递一个对象并更改其 成员 ,这些更改会在函数外部持续存在。这使得它 看起来 像按引用传递。但如果您实际更改对象变量的值,您将看到更改不会持续存在,证明它确实是按值传递。
例子:
function changeObject(x) {
x = { member: "bar" };
console.log("in changeObject: " + x.member);
}
function changeMember(x) {
x.member = "bar";
console.log("in changeMember: " + x.member);
}
var x = { member: "foo" };
console.log("before changeObject: " + x.member);
changeObject(x);
console.log("after changeObject: " + x.member); /* change did not persist */
console.log("before changeMember: " + x.member);
changeMember(x);
console.log("after changeMember: " + x.member); /* change persists */
输出:
before changeObject: foo
in changeObject: bar
after changeObject: foo
before changeMember: foo
in changeMember: bar
after changeMember: bar