4

尝试新的代理对象时,我很惊讶当设置代理时,键会自动转换为字符串:

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. 您可以在此处看到一个展示问题的小型 JSFiddle 。arr即使通过代理,它仍然是一个数组。

那么,我如何区分传递字符串和数字呢?我可以像 in 一样将其正则表达式/\d+/.test(key),但是它不会区分这些情况,而且感觉就像一个 hack:

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

1 回答 1

3

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

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

它们都将触发代理获取处理程序'1'作为属性键。


此外,您使用数组这一事实并没有改变任何东西——它对数组(这是一种特殊的对象)的工作方式与对普通对象的工作方式相同。


另请参阅规范中的对象类型

于 2016-10-05T17:19:18.393 回答