Тестируем новый 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
все еще является массивом даже после прохождения через прокси.
Итак, Как я могу отличить от передачи строки и числа? я мог бы просто REGEX его, как в /\d+/.test(key)
, однако он не хотел проводить различие между этими ситуациями и он просто чувствует, как взломать:
arr['1'];
arr[1];
Идентификатор свойства преобразуется в строку еще до того, как будет определено значение доступа к ресурсу, то есть нет способа, чтобы прокси-объект знал, что такое исходное значение. См. Спецификацию: http://www.ecma-international.org/ecma-262/7.0/#sec-property-accessors-runtime-semantics-evaluation –
По совпадению, собственный массив не будет различать 'arr ['1' ] 'и' arr [1] 'тоже по той причине, что объясняется в ответе. Поэтому да, '/^\ d + $ /' следует использовать. См. Http://stackoverflow.com/a/39802685/3731501 для примера. – estus