根据值的类型是基本类型值还是复杂类型的值在传递时会有不同。
JS函数的参数传递是按值传递,基本类型值传递的是副本,复杂类型值传递的是引用。从而会影响原来的值,不会改变原来的复制前的引用。
function foo (x) {
x += 1;
console.log(x);
} var a = 3;
var b = new Number(a);
foo(a); //4 复制了3,从而函数中操作不会影响到a指向的值
console.log(a); //
foo(b); //4 b是个数字对象,参数传递时传给x的是这个对象的引用。 x += 1; 由于基本类型值是不可变的,首先会从x指向的值中提取出3,最后x神不知鬼不觉的从一个引用变为
一个新的数字对象的用。原对象还在那里。
console.log(b); //
有时,我只是想去传入一个数组参数,但是却改变了数组的值,这时可以传入对象的副本即可。如:
var arr = [1, 3, 5];
function foo (a) {
return a.push("end_flag").join(" ");
} foo(arr); //这时arr指向的数组也发生了变化。 foo(arr.slice()); //arr不变