js数组地址引用的奇怪问题

数组js里,应该是属于地址引用吧?就是把一个arr传进去一个方法里,方法对他的操作,会直接影响该arr
下面我的代码,注释掉的问题1问题2,两种写法,得出来的结果不一样。
我本来是不想用问题2这种写法的,因为既然是地址引用,应该是不用接收返回值也能影响到该arr,但是却。。。

// 初始化一个1~10的数组
let arr = [];
let max = 10,
  d = 1;
while (d <= max) {
  arr.push(d++);
}


//问题1 work(arr);
// alert(arr.toString());  // 输出0,2,0,4,0,6,0,8,0,10


//问题2 arr=work(arr);
// alert(arr.toString());  // 输出2,4,6,8,10


// 删除下标是单数的数据
function work(arr){
  let i = 1;
  for (i; i <= arr.length; ++i) {
    if (i % 2 == 1) {
      arr[i-1] = 0;
    }
  }

  arr = arr.filter(q => q != 0); // 这里的过滤,似乎对问题1这种写法不起效。
  return arr;
}
阅读 7.8k
6 个回答

@新の助2 看一群人都在说filter 的问题,这里与filter关系不大,或不在点上。其实这里只与函数本身有关。
1.对参数进行赋值,不会对全局有影响
2.对参数的属性进行更改,会对全局有影响

for (i; i <= arr.length; ++i) {
    if (i % 2 == 1) {
      arr[i-1] = 0;
    }
  }

上面这段代码是对参数属性的修改,所以改变了全局的arr

arr = arr.filter(q => q != 0);

上面这段代码是对参数进行赋值,filter也没有对参数属性进行修改, 所以没影响到的全局的arr

参考内容 mdn 函数

定义和用法
filter() 方法创建一个新的数组,新数组中的元素是通过检查指定数组中符合条件的所有元素。

注意: filter() 不会对空数组进行检测。

注意: filter() 不会改变原始数组。

http://www.runoob.com/jsref/j...

function removeOdd(arr) {
    //注意倒序循环,避免删除元素之后未操作的元素索引发生变化
    for (let i = arr.length - 1; i >= 0; i--) {
        if (arr[i] % 2 === 1) {
            arr.splice(i, 1) //splice方法在原数组删除元素
        }
    }
    return arr
}

let arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
removeOdd(arr)
console.log(arr)
//[ 2, 4, 6, 8, 10 ]

arr数组按共享传递,传递的是引用的拷贝,在函数里面对同一块内存地址里的数据进行操作。
但是,遇到arr = arr.filter(q => q != 0)的时候,函数体里面的arr就指向了新的内存地址,跟外面的arr没有关系了。
你这样理解就能明白。

谢邀。

一楼已经说得很清楚了,你可以把work里面的参数arr换成别的名称再看一下

filter的问题上面已经回答过了
我看了下评论

var arr = [1,2,3]
var copyArr = arr; //这个 copyArr 就相当于 function 的内部 arr  现在copyArr和arr指向同一个引用
copyArr = ['a','b'] //你这里 将copyArr重新复制导致引用改变 所以copyArr和arr不在指向同一引用
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题