最近在实现一些功能的时候,写了如下代码:
<span style="font-size:14px;">var nums = [1,2,3];
function collect(nums){
nums = [2,3,4,5];
}
collect(nums);
alert(nums);</span>
我们所希冀的,按第一直觉,当然是希望alert出来的nums是[2,3,4,5]这个数组的内容。
但是非常抱歉,结果却是:
//1,2,3
这是为什么呢?
当我将代码写成这样:
<span style="font-size:14px;">var nums = [1,2,3];
function collect(nums){
nums = [2,3,4,5];
}
nums = collect(nums);
alert(nums);</span>
就一点问题都没有了。
显而易见,问题就出现在所传入的nums中。
为什么经过了一段处理之后,我们传入的nums不能改变呢?
nums是一个数组,是一个对象,它所传入的应该是实参啊?为什么会修改不了呢?
各位看官,看到这里,请别急。
请你回想一下:为什么我们给函数传入的对象,能够被我们在函数内部改变呢?
因为我们所传入的变量,实际上只是对象的指针啊!
当我们调用这个指针修改对象的内容的时候,对象的内容当然能够被修改。
但是如果我们是直接给这个变量重新赋予一个新的数组、新的对象(如代码段1所示),变量与原来对象的联系就被割断了,于是就无法再获取到原来的对象了。
因此,我们千万不能用如下方式在函数内部修改对象:
<span style="font-size:14px;">nums = [2,3,4,5];</span>
如果确实需要在函数内部对变量重新赋值,请在原来基础上进行增加再删除的操作,或者为函数返回一个新的对象,用源对象接收,完成修改。