代理索引被转换为字符串

Proxy index gets converted to string

尝试新的 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];

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

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

它们都将以 '1' 作为 属性 键触发 Proxy get 处理程序。


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


另见 The Object Type in the specification