在自定义函数中清空传递进来的数组对象失败,也就是形参是引用类型的时候采取下面第(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才可以改变输出结果呢?
根本原因:JS 传参是按值传递的。
个人理解:调用函数时传入的参数可以理解为一个指向对象地址的“指针”,在不给该指针赋值的情况下是操作原对象,给指针重新赋值以后指向的是等号右侧表达式返回的值的地址。这里重新赋值之后,该“指针”指向了
[]
表达式返回的数组对象的地址。