Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/451.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当我试图在Set/Map上使用错误的api时,我能让Set/Map打我一巴掌吗?_Javascript_Javascript Objects - Fatal编程技术网

Javascript 当我试图在Set/Map上使用错误的api时,我能让Set/Map打我一巴掌吗?

Javascript 当我试图在Set/Map上使用错误的api时,我能让Set/Map打我一巴掌吗?,javascript,javascript-objects,Javascript,Javascript Objects,当我在javascript中使用Set和Map对象时,我总是说错话: 我指的是set.size时的set.length 我指的是map.size时的map.length map.someKeyName或map['someKeyName'],我指的是map.get'someKeyName' map.someKeyName=someValue或map['someKeyName']=someValue,我指的是map.set'someKeyName',someValue 结果是一个被动的、侵略性的、未

当我在javascript中使用Set和Map对象时,我总是说错话:

我指的是set.size时的set.length 我指的是map.size时的map.length map.someKeyName或map['someKeyName'],我指的是map.get'someKeyName' map.someKeyName=someValue或map['someKeyName']=someValue,我指的是map.set'someKeyName',someValue 结果是一个被动的、侵略性的、未定义的或者默默地没有做我想做的事情,这浪费了我的时间


当我尝试做任何不好的事情时,要制作一些稍微修改过的Set和Map版本并抛出一个错误,有多难呢?

下面的一些东西似乎正是我想要在Chrome 59上测试的东西。 大部分都要感谢@T.J.Crowder的回答;出于某种原因,我不得不为size属性添加一个特殊情况

警告:表示Map的length属性始终为0。我认为这是在撒谎;或者,至少,我在Chrome 59上测试它是错误的,所以当我访问代理对象上的length属性时,它会失败,并且没有长度!如所愿。在特殊情况下,它可能会更安全,以确保无论底层映射是否具有长度,它都会按预期失败

//好斗的斗士。 //与Map类似,但只允许获取存在的属性, //而且根本不允许设置属性。 const AggressiveMap=functionarg{ 返回新Proxynew Maparg{ //性能吸气剂 获取:函数、名称、接收者{ 如果!房地产中的名字{ 为你抛出新的ErrorNo+name+!; } //不知道为什么这是必要的,但如果我没有特殊情况的'大小',我得到 //未捕获的TypeError:在不兼容的接收器[对象]上调用了方法Map.prototype.size //在Chrome 59上。 如果name=='size'{return realThing.size;} let answer=Reflect.getrealThing、姓名、接收人; 如果回答的类型===“函数”{ // https://stackoverflow.com/questions/43236329/why-is-proxy-to-a-map-object-in-es2015-not-working/43236808answer-43236808 答案=答案.bindrealThing; } 返回答案; }, //属性设置器 集合:functionrealThing、名称、值、接收者{ //不允许设置任何属性。 为你抛出新的ErrorNo+name+!; //但如果我们想允许的话,这里有一些方法。 return Reflect.setrealThing、name、value、receiver; }, }; }; // 攻击性映射 //运动一下 const map=AggressiveMap[[a',1],[b',2],[c',3]; 地图。设置为'd',4; 地图。删除“c”; console.logmap.get'b'=+JSON.stringifymap.get'b'; 控制台。登录:; 用于映射的常量[键,值]{ console.log+JSON.stringifykey+->+JSON.stringifyvalue; } console.logmap.size=+JSON.stringifymap.size; 地图['moose']='foo';//你没有驼鹿! console.logmap['moose']=+JSON.stringifymap['moose'];//你没有驼鹿!如果注释掉前一行,则返回此处
注意:需要一个支持ES2015代理的浏览器。我猜您必须用额外的properties@Pete什么额外的属性?等等,你认为我想让他们理解那些错误的名字吗?不,我想让他们在我使用它们时抛出一个错误!如果您将它们映射为额外属性,则可以使这些属性在使用时引发异常-这是唯一可以让它们扇你耳光的方法,但如果不扩展初始对象,您将无法访问这些属性,并且它们将始终是undefined@Pete啊,我明白了。好吧,我想这就够了。括号呢?不太确定-不太了解js!