在自定义函数中清空传递进来的数组对象失败

在自定义函数中清空传递进来的数组对象失败,也就是形参是引用类型的时候采取下面第(1)种方法失败,不知道为什么?

清空数组的三种方法:

//(1)
arr=[];

//(2)
arr.splice(0);

//(3)
arr.length=0;

具体描述:
项目中有一个频繁使用的操作,我自己写了一个函数用来操作传递进来的对象,结果发现不起作用,简化版的例子如下:

var test1 = [
  {
    name: '张三',
    age: 10
  }
];
var test2 = [
  {
    name: '李四',
    age: 20
  }
];
var test3 = [
  {
    name: '王五',
    age: 30
  }
];
function init1(obj) {
  obj = [];
}
function init2(obj) {
  obj = obj.splice(0);
};
function init3(obj) {
  obj.length = 0;
};
init1(test1);
init2(test2);
init3(test3);
console.log(test1)//输出原对象
console.log(test2)//[]
console.log(test3)//[]

而且在init2和init3起作用的基础上加入如下代码:

function init2(obj) {
  obj = obj.splice(0);
  obj=[{name:'王强',age:20}]//新增
};
function init3(obj) {
  obj.length = 0;
  obj.push({name:'王强',age:20});//新增
};
init2(test2);
init3(test3);
console.log(test2)//[]
console.log(test3)//[{ name="王强",  age=20}]

为什么直接赋值不行比如push才可以改变输出结果呢?

阅读 2.5k
3 个回答

根本原因:JS 传参是按值传递的。
个人理解:调用函数时传入的参数可以理解为一个指向对象地址的“指针”,在不给该指针赋值的情况下是操作原对象,给指针重新赋值以后指向的是等号右侧表达式返回的值的地址。这里重新赋值之后,该“指针”指向了[]表达式返回的数组对象的地址。

函数中的参数是在函数作用域中声明的!
而你在函数中直接给参数赋值相当于给新声明的参数指向[],而外部声明的变量仍然指向原数据

赋值会改变 binding 。一旦直接赋值 (obj = ...) ,这个 obj 跟你传入的就不再是同一个东西了。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题