【发布时间】:2024-04-16 03:30:02
【问题描述】:
试用新的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];
【问题讨论】:
-
属性名称甚至在属性访问的值确定之前就被转换为字符串,即代理对象无法知道原始值是什么。请参阅规范:ecma-international.org/ecma-262/7.0/…
-
巧合的是,由于答案中解释的原因,本机数组也不会区分
arr['1']和arr[1]。所以是的,应该使用/^\d+$/。示例见*.com/a/39802685/3731501。
标签: javascript ecmascript-6 es6-proxy