我的理解是,这实际上非常简单:
- Javascript 总是 按值传递,但是当变量引用对象(包括数组)时,“值”是对对象的引用。
- 更改变量的值 永远不会 更改基础原语或对象,而只是将变量指向新的原语或对象。
- 但是,更改变量引用的对象的 属性 确实会更改基础对象。
因此,通过一些示例:
function f(a,b,c) { // Argument a is re-assigned to a new value. // The object or primitive referenced by the original a is unchanged. a = 3; // Calling b.push changes its properties - it adds // a new property b[b.length] with the value "foo". // So the object referenced by b has been changed. b.push("foo"); // The "first" property of argument c has been changed. // So the object referenced by c has been changed (unless c is a primitive) c.first = false;}var x = 4;var y = ["eeny", "miny", "mo"];var z = {first: true};f(x,y,z);console.log(x, y, z.first); // 4, ["eeny", "miny", "mo", "foo"], false范例2:
var a = ["1", "2", {foo:"bar"}];var b = a[1]; // b is now "2";var c = a[2]; // c now references {foo:"bar"}a[1] = "4"; // a is now ["1", "4", {foo:"bar"}]; b still has the value // it had at the time of assignmenta[2] = "5"; // a is now ["1", "4", "5"]; c still has the value // it had at the time of assignment, i.e. a reference to // the object {foo:"bar"}console.log(b, c.foo); // "2" "bar"


