Индекс прокси преобразуется в строку
Испытывая новые объекты Proxy, я удивляюсь, что при установке прокси ключ автоматически преобразуется в строку:
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];
1 ответ
Ключи свойств могут быть только строками или символами. Если вы используете что-то другое, например число, оно всегда сначала преобразуется в строку. Поэтому при использовании прокси вы не можете различить эти две операции:
arr['1'];
arr[1];
Оба они будут запускать обработчик получения Proxy с '1'
в качестве ключа свойства.
Кроме того, тот факт, что вы используете массив, ничего не меняет - он работает так же с массивами (которые представляют собой особый вид объектов), как и с простыми объектами.
Смотрите также Тип объекта в спецификации.