Индекс прокси преобразуется в строку

Испытывая новые объекты 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' в качестве ключа свойства.


Кроме того, тот факт, что вы используете массив, ничего не меняет - он работает так же с массивами (которые представляют собой особый вид объектов), как и с простыми объектами.


Смотрите также Тип объекта в спецификации.

Другие вопросы по тегам