Javascript 代理索引转换为字符串

Javascript 代理索引转换为字符串,javascript,ecmascript-6,es6-proxy,Javascript,Ecmascript 6,Es6 Proxy,尝试新的方法时,我感到惊讶的是,当设置代理时,密钥会自动转换为字符串: 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 在那里,我希望

尝试新的方法时,我感到惊讶的是,当设置代理时,密钥会自动转换为字符串:

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
将是
number
,因为我正在传递一个数字。但是,它以某种方式被转换为
代理
中的字符串,实际的警报类型是
字符串
。你可以从中看出问题所在
arr
即使在通过代理后仍然是一个数组

那么,我如何区分传递字符串和数字呢?我可以像
/\d+/.test(key)
那样对其进行正则化,但是它无法区分这些情况,感觉就像是一个黑客:

arr['1'];
arr[1];

属性键只能是字符串或符号。如果您使用的是不同的东西,例如数字,它总是首先转换为字符串。因此,当使用代理时,您无法区分这两种操作:

arr['1'];
arr[1];
它们都将触发代理get处理程序,属性键为
'1'


此外,使用数组这一事实不会改变任何东西―它对数组(这是一种特殊的对象)的作用与对普通对象的作用相同



另请参见。

即使在确定属性访问的值之前,属性名称也会转换为字符串,即代理对象无法知道原始值是什么。请参阅规范:巧合的是,本机数组也不会区分
arr['1']
arr[1]
,原因已在答案中解释。因此,是的,应该使用
/^\d+$/
。请参见示例。非常好,谢谢。通过你的第一句话,我还找到了更多相关信息:(并链接到MDN:)。因此,基本上它是访问数组本身,将其转换为字符串,与代理无关,它将捕获两种通用数组方法,如
.forEach()
.map()
,以及所述的数字索引