关于Proxy 对象代理Array时 Array.prototype.splice() 与Array.prototype.length 清空数组时的表现差异

本文探讨了使用Proxy代理数组时的问题及解决方法。当调用splice方法清空数组时,会导致元素变为undefined而length属性未更新。文章提供了一种通过直接设置length属性为0来避免这一问题的方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

当使用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 清零,然后引擎删掉元素

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值