为什么浏览器得到 Symbol.unscopables 两次?
Why does browser get Symbol.unscopables twice?
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--
应该写到 a
被读取的相同位置是合乎逻辑的。 不,不是。
但是两次获取 Symbol.unscopables
的值提示我们,可以将一个对象传递给读取对象,将另一个对象传递给写入对象。
真的要这样工作吗?规范怎么说?
实际上,它几乎适用于 Chrome 和 FF - 可以从一个对象读取并写入另一个对象,但会导致不同的结果:
更新:Safari 10 只读取一次。
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}
根据规范,据我所知,@@unscopables 对于 "x++" 应该只读一次。请参阅 https://mail.mozilla.org/pipermail/es-discuss/2017-February/047725.html
中的详细信息
所以 Chrome 和 Firefox 都存在问题。 Safari 做对了。
另见 https://bugzilla.mozilla.org/show_bug.cgi?id=1341061 and https://bugs.chromium.org/p/v8/issues/detail?id=5992
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--
应该写到 a
被读取的相同位置是合乎逻辑的。
但是两次获取 Symbol.unscopables
的值提示我们,可以将一个对象传递给读取对象,将另一个对象传递给写入对象。
真的要这样工作吗?规范怎么说?
实际上,它几乎适用于 Chrome 和 FF - 可以从一个对象读取并写入另一个对象,但会导致不同的结果:
更新:Safari 10 只读取一次。
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}
根据规范,据我所知,@@unscopables 对于 "x++" 应该只读一次。请参阅 https://mail.mozilla.org/pipermail/es-discuss/2017-February/047725.html
中的详细信息所以 Chrome 和 Firefox 都存在问题。 Safari 做对了。
另见 https://bugzilla.mozilla.org/show_bug.cgi?id=1341061 and https://bugs.chromium.org/p/v8/issues/detail?id=5992