Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/433.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 阵列如何更新&;在JS函数中返回_Javascript - Fatal编程技术网

Javascript 阵列如何更新&;在JS函数中返回

Javascript 阵列如何更新&;在JS函数中返回,javascript,Javascript,我试图从函数内声明的数组中添加/删除元素。我已经能够添加或删除并访问相同的更新阵列 为了访问阵列,我使用了两种不同的方法 创建了一个返回数组的内部函数 已从主函数返回数组,并使用点表示法访问该数组 这是我的密码: 功能测试(){ 设myArr=[]; const getMyArr=()=>myArr; 常量添加=n=>{ 迈尔推(n); return()=>{ myArr=myArr.filter(a=>a!==n); }; }; 返回{ 迈尔, 格特迈亚, 添加 }; } 让myTestRu

我试图从函数内声明的数组中添加/删除元素。我已经能够添加或删除并访问相同的更新阵列

为了访问阵列,我使用了两种不同的方法

  • 创建了一个返回数组的内部函数
  • 已从主函数返回数组,并使用点表示法访问该数组 这是我的密码:

    功能测试(){
    设myArr=[];
    const getMyArr=()=>myArr;
    常量添加=n=>{
    迈尔推(n);
    return()=>{
    myArr=myArr.filter(a=>a!==n);
    };
    };
    返回{
    迈尔,
    格特迈亚,
    添加
    };
    }
    让myTestRun=test();
    让remove3=myTestRun.add(3);
    让remove7=myTestRun.add(7);
    让remove8=myTestRun.add(8);
    log(“插入后的myArr”,myTestRun.myArr);
    log(“插入后的getMyArr()”,myTestRun.getMyArr());
    移除7();
    log(“删除后的myArr”,myTestRun.myArr)//仍然返回旧数组而不进行任何修改
    log(“删除后的getMyArr()”,myTestRun.getMyArr())//返回修改后的数组。怎样?为什么它以前不工作?
    TL;DR:因为返回一个新数组

    test
    返回的对象和局部变量都引用同一数组。通过任一引用对数组进行变异(
    push
    pop
    splice
    等)将修改数组

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

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

    以下是一些类似的问题,可能会让我们明白:


    您更改了
    myArr
    的对象引用,但您需要相同的对象引用,要删除,您可以拼接不需要的元素

    功能测试(){
    设myArr=[];
    const getMyArr=()=>myArr;
    常量添加=n=>{
    迈尔推(n);
    return()=>{
    var i=myArr.长度;
    而(i--)if(myArr[i]==n)myArr.拼接(i,1);
    };
    };
    返回{myArr,getMyArr,add};
    }
    让myTestRun=test();
    让remove3=myTestRun.add(3);
    让remove7=myTestRun.add(7);
    让remove8=myTestRun.add(8);
    log(“插入后的myArr”,myTestRun.myArr);
    log(“插入后的getMyArr()”,myTestRun.getMyArr());
    移除7();
    log(“删除后的myArr”,myTestRun.myArr)//仍然返回旧数组而不进行任何修改
    log(“删除后的getMyArr()”,myTestRun.getMyArr())//返回修改后的数组。怎样?为什么以前它不工作?
    .as控制台包装{max height:100%!important;top:0;}
    如果您使用

    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());
    

    因为
    让myArr
    返回{myArr,…}
    不再引用同一数组。变量已更改,返回对象的属性尚未更改。和
    getMyArr()
    返回变量的值。该变量让myArr和测试函数返回的对象的myArr属性不再引用同一数组。怎么样?我是否没有返回
    let myArr
    ,它必须是从
    test
    返回的相同属性?@Imran是的,您返回了。更新
    myTestRun.myArr
    将更新
    myArr
    变量,因为这两个变量都指向内存中的同一数组。但是,只有在调用
    remove7()
    之前
    filter
    返回一个新数组,并且
    myArr
    变量现在指向一个新的内存位置。而
    myTestRun.myArr
    则指向旧数组。更新一个数组不会影响另一个数组,我会得到它。请编辑您的帖子并将其添加到您的答案中,以便我可以接受。@Imran更新了答案,并添加了一些非常类似的附加问题的链接