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}

答案 0 :(得分:3)
按照规范,对于“x ++”,@@ 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