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更新了答案,并添加了一些非常类似的附加问题的链接