为了账号安全,请及时绑定邮箱和手机立即绑定

JS 函数中如何更新和返回数组

JS 函数中如何更新和返回数组

慕容3067478 2021-08-20 14:39:13
我正在尝试从函数内部声明的数组中添加/删除元素。我已经能够添加或删除和访问更新的数组。为了访问数组,我使用了两种不同的方法。创建了一个返回数组的内部函数。已从主函数返回数组并使用点表示法访问相同的数组。这是我的代码:function test() {  let myArr = [];  const getMyArr = () => myArr;  const add = n => {    myArr.push(n);    return () => {      myArr = myArr.filter(a => a !== n);    };  };  return {    myArr,    getMyArr,    add  };}let myTestRun = test();let remove3 = myTestRun.add(3);let remove7 = myTestRun.add(7);let remove8 = myTestRun.add(8);console.log("myArr after insertion", myTestRun.myArr);console.log("getMyArr() after insertion", myTestRun.getMyArr());remove7();console.log("myArr after removing", myTestRun.myArr); //still returns the old array without any modificationsconsole.log("getMyArr() after removing", myTestRun.getMyArr()); //returns the modified array. how? Why didn't it work before?我不明白的是为什么没有myArr任何修改以及getMyArr()函数如何返回更新后的值。我曾经相信两者都myArr指向同一个对象。因此,对 的任何修改myArr都应通过这两种方法反映出来。为什么我错了。这种不同的返回值背后的原因是什么?请解释。
查看完整描述

3 回答

?
LEATH

TA贡献1936条经验 获得超6个赞

因为filter返回一个新数组。

返回的对象test和局部变量都引用同一个数组。突变的阵列(pushpopsplice通过任一引用的等)将修改阵列。

这仅在调用remove7(). 该filter方法返回一个新数组,myArr变量现在引用这个新数组,同时myTestRun.myArr仍然引用最初创建的旧数组。如果您myTestRun.myArr === myTestRun.getMyArr()在每个点都登录,它将在 之后开始返回 false remove7()

但是,getMyArr()仍在关闭let myArr变量。因此,它将始终记录当时变量当前持有的任何内容


查看完整回答
反对 回复 2021-08-20
?
眼眸繁星

TA贡献1873条经验 获得超9个赞

如果你使用它会更好


function test() {

  this.myArr = [];


  this.getMyArr = () => this.myArr;


  this.add = n => {

    this.myArr.push(n);

    return () => {

      this.myArr = this.myArr.filter(a => a !== n);

    };

  };

}


let myTestRun = new test();



let remove3 = myTestRun.add(3);

let remove7 = myTestRun.add(7);

let remove8 = myTestRun.add(8);

console.log("myArr after insertion", myTestRun.myArr);

console.log("getMyArr() after insertion", myTestRun.getMyArr());

remove7();


console.log("myArr after removing", myTestRun.myArr); //still returns the old array without any modifications

console.log("getMyArr() after removing", myTestRun.getMyArr());


查看完整回答
反对 回复 2021-08-20
  • 3 回答
  • 0 关注
  • 251 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信