Пробуя новые прокси-объекты, я был удивлен, что при установке прокси ключ автоматически преобразуется в строку:
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
по-прежнему является массивом даже после его передачи через прокси.
Итак, как я могу отличить передачу строки от числа? Я мог бы просто использовать регулярное выражение, как в /\d+/.test(key)
, однако это не отличало бы эти ситуации, и это просто похоже на хак:
arr['1'];
arr[1];
arr['1']
иarr[1]
по причине, которая объясняется в ответе. Так что да,/^\d+$/
следует использовать. Пример см. на stackoverflow.com/a/39802685/3731501. - person Estus Flask   schedule 05.10.2016