代理索引被转换为字符串
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 处理程序。
此外,您使用数组这一事实不会改变任何东西——它对数组(特殊类型的对象)的作用与对普通对象的作用相同。
尝试新的 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 处理程序。
此外,您使用数组这一事实不会改变任何东西——它对数组(特殊类型的对象)的作用与对普通对象的作用相同。