代理索引转换为字符串

时间:2016-10-05 17:14:28

标签: javascript ecmascript-6 es6-proxy

尝试新的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 keynumber,因为我传递了一个数字。但是,它会以某种方式转换为Proxy内的字符串,实际的警报类型为string。您可以see a small JSFiddle here展示问题。 arr即使在通过代理传递之后仍然是一个数组。

那么,我怎样才能区分传递字符串和数字呢?我可以像/\d+/.test(key)那样将其重新排除,但是它并没有区分这些情况和它只是感觉像一个黑客:

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

1 个答案:

答案 0 :(得分:2)

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

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

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

此外,您使用数组的事实不会改变任何内容 - 它与数组(它是特殊类型的对象)的工作方式相同,因为它适用于普通对象。

另见The Object Type in the specification