尝试新的Proxy objects,我很惊讶当设置代理时,密钥会自动转换为字符串:
var arr = ['a', 'b', 'c'];
arr = new Proxy(arr, {
get: (original, key) => {
alert(typeof key);
return original[key];
}
});
arr[1]; // expected an alert with 'number'; got 'string' instead
我希望typeof key
为number
,因为我传递了一个数字。但是,它会以某种方式转换为Proxy
内的字符串,实际的警报类型为string
。您可以see a small JSFiddle here展示问题。 arr
即使在通过代理传递之后仍然是一个数组。
那么,我怎样才能区分传递字符串和数字呢?我可以像/\d+/.test(key)
那样将其重新排除,但是它并没有区分这些情况和它只是感觉像一个黑客:
arr['1'];
arr[1];
答案 0 :(得分:2)
属性键只能是字符串或符号。如果你正在使用不同的东西,比如数字,它总是首先被转换为字符串。因此,在使用代理时,您无法区分这两个操作:
arr['1'];
arr[1];
它们都将触发代理获取处理程序,并将'1'
作为属性键。
此外,您使用数组的事实不会改变任何内容 - 它与数组(它是特殊类型的对象)的工作方式相同,因为它适用于普通对象。