在JS中,非基本类型的传递是通过传递“引用的拷贝”进行的。引用指向值。不能简单类比指针的思维模型。
例子1
var a = 2; var b = a; // b 是 a 中的值的复制 b++; a; // 显然输出是 2 b; // 3 var c = [1,2,3]; var d = c; // d是c的引用的复制,指向数组 [1,2,3] d.push( 4 ); c; // [1,2,3,4] d; // [1,2,3,4]
例子2: 与指针的区别
var a = [1,2,3]; var b = a; b = [4,5,6]; a; // [1,2,3]
这里,b指向了新的值,a不受影响。但如果push则不一样(见例3)。
例子3: 非基本类型值作为函数参数
function foo(x) { x.push( 4 ); x; // [1,2,3,4],注意这里push后,x和a仍指向同一个值 x = [4,5,6]; //这里x指向新的值 x.push( 7 ); x; // [4,5,6,7] } var a = [1,2,3]; foo( a ); a; // 是[1,2,3,4],而不是[4,5,6,7]
例子4: 返回非基本类型值
function returnObj() { var obj = { a:3 }; return obj; } var b = returnObj(); var c = returnObj(); // 这里c指向了另一个对象值,和b指向的值不同 b.a = 2; c.a; //由于不是同一个值,c自然不会受到影响
例子5: 利用引用修改基本类型值
function add1(x) { x++; } var a=3; add1(a); a; //显然a仍是3
可以对a进行包装
var obj = { a: 2}; function add1(obj) { obj.a++; } obj.a; //3
另外,这里用Number进行包装是不可行的,因为无法修改Number对象里的标量值。
function foo(x) { x = x + 1; //加法时类型转换,赋值后x是基本类型值3 x; // 3 } var a = 2; var b = new Number( a ); // 或者 `Object(a)` foo( b ); console.log( b ); // Number {2},未改变
参考资料:https://github.com/getify/You-Dont-Know-JS/blob/1ed-zh-CN/types%20%26%20grammar/ch2.md