使用JavaScript代理仅向数组中添加偶数

使用JavaScript代理仅向数组中添加偶数,javascript,javascript-proxy,Javascript,Javascript Proxy,我正在学习JavaScript代理 通过使用设置陷阱我只想在数组中添加偶数。但每次扔 未捕获的TypeError:代理上的“set”:陷阱为属性返回了falsish “长度” 下面是我的代码示例 //此处只添加偶数。我们正在使用Js代理 设偶数=[]; evenNumbers=新代理(evenNumbers{ 设置(目标、p、值、接收器){ 如果((值%2)==0){ 目标[p]=价值; 返回真值 }否则{ 返回false; } } }); 推(2)对于这两种情况,您都需要返回true,因为

我正在学习JavaScript代理

通过使用设置陷阱我只想在数组中添加偶数。但每次扔

未捕获的TypeError:代理上的“set”:陷阱为属性返回了falsish “长度”

下面是我的代码示例

//此处只添加偶数。我们正在使用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这就是我的答案。