Страницы

Поиск по вопросам

среда, 20 февраля 2019 г.

Почему браузер дважды обращается к Symbol.unscopables?

with(new Proxy({}, { has() { return true }, get(obj, key, proxy) { return console.log(String(key)) } }) ) { a-- }
Вывод в Chrome:
Symbol(Symbol.unscopables) a Symbol(Symbol.unscopables)
Вывод в Firefox:
Symbol(Symbol.unscopables) Symbol(Symbol.unscopables) a
Насколько я понимаю, одно обращение связано с чтением, а другое с записью.
Логично, что конструкция a-- должна записать значение в то же место, откуда прочитала. Нет, это не так.
А двойное чтение из Symbol.unscopables как бы намекает, что это не так и у меня есть возможность отдать нечто для чтения, но сказать, что в мой объект этого записывать не надо?
Неужели это так и задумано? Что на эту тему говорит стандарт?
Собственно, в Хроме и FF такое почти прокатывает - чтение и запись связаны с разными объектами, однако работает по-разному:
Update: Safari 10 читает Symbol.unscopables только один раз.
var a, b, flag = true with (a = { x: 7 }) with (b = { x: 4, get [Symbol.unscopables]() { return { x: flag=!flag } } }) x++ // Chrome FF Safari Edge console.log(a) // {x:5} {x:7} {x:7} {x:5} console.log(b) // {x:4} {x:8} {x:5} {x:4}
PS: Этот вопрос по-английски.


Ответ

Согласно спецификации, @@unscopables в этом случае должно читаться только один раз. Детали (к сожаления по английски) в https://mail.mozilla.org/pipermail/es-discuss/2017-February/047725.html
Следовательно Chrome и Firefox не следуют спецификации, а Safari следует.
Смотрите также https://bugzilla.mozilla.org/show_bug.cgi?id=1341061 и https://bugs.chromium.org/p/v8/issues/detail?id=5992

Комментариев нет:

Отправить комментарий