使用JavaScript代理仅向数组中添加偶数
我正在学习JavaScript代理 通过使用设置陷阱我只想在数组中添加偶数。但每次扔 未捕获的TypeError:代理上的“set”:陷阱为属性返回了falsish “长度” 下面是我的代码示例使用JavaScript代理仅向数组中添加偶数,javascript,javascript-proxy,Javascript,Javascript Proxy,我正在学习JavaScript代理 通过使用设置陷阱我只想在数组中添加偶数。但每次扔 未捕获的TypeError:代理上的“set”:陷阱为属性返回了falsish “长度” 下面是我的代码示例 //此处只添加偶数。我们正在使用Js代理 设偶数=[]; evenNumbers=新代理(evenNumbers{ 设置(目标、p、值、接收器){ 如果((值%2)==0){ 目标[p]=价值; 返回真值 }否则{ 返回false; } } }); 推(2)对于这两种情况,您都需要返回true,因为
//此处只添加偶数。我们正在使用Js代理
设偶数=[];
evenNumbers=新代理(evenNumbers{
设置(目标、p、值、接收器){
如果((值%2)==0){
目标[p]=价值;
返回真值
}否则{
返回false;
}
}
});
推(2)
对于这两种情况,您都需要返回true
,因为
set()
方法应该返回一个布尔值
- 返回
,表示分配成功true
- 如果
方法返回set()
,并且赋值发生在严格模式代码中,将抛出一个false
push
kall代理两次,一次按值,另一次按更改length
属性。为了避免在此代理中执行更多不必要的操作,可以使用此不需要的属性提前退出
让偶数=[];
evenNumbers=新代理(evenNumbers{
设置(目标、p、值、接收器){
if(p=='length')返回true;//排除此属性
如果(值%2==0){
目标[p]=价值;
}
返回true;
}
});
推(2);
console.log(evenNumbers.length);//1.
推(3);
console.log(evenNumbers.length);//仍然是1
console.log(偶数);//[2]
问题是函数.push()
试图更新长度(evenNumbers.length=1
),陷阱不允许这样做
试试这个:
让偶数=[];
evenNumbers=新代理(evenNumbers{
设置(目标、p、值、接收器){
if(isFinite(p)){
//键是一个数字(索引),因此有代码试图添加/更改数组的元素。
如果((值%2)==0){
目标[p]=价值;
返回真值
}否则{
返回false;
}
}否则{
返回true;
}
}
});
偶数。按(2);//好啊
偶数。按(3);//打字错误
谢谢@D.Pardal,但是有没有办法跳过javascript自动指定的长度或其他属性?@sahedmoral这就是我的答案。