当使用Proxy 代理数组 setter 时 代理对象调用 proxy.splice(0) 方法时,只会截获到代理对象length 属性的修改,但此时,原数组已被清空,值为undefined length 还在。
所以使用Proxy 代理数组,需要清空时,直接proxy.lenght=0 进行清空操作,
代码如下
let list=[0,1];
let componentList=[{selected:false},{selected:false}];
let proxy=new Proxy(list,{set:function(target:[], key:string, value,receiver:any){if(key==='length'){if(value===0){for(let v of list){componentList[v].selected=false;//#报错位置}}}else{if(list.includes(value)){list.splice(list.indexOf(value),1);componentList[value].selected=false;}else{componentList[value].selected=true;}}return Reflect.set(target,key,value,receiver);}
});proxy.splice(0);//会报错 因为代理不到删除操作 中会拦截到对length的修改此时数组内元素全为undefined
proxy.lenght=0;// length 清零,然后引擎删掉元素