gpt4 book ai didi

javascript - 浏览器的 "localStorage.generator++"运算符是原子的吗?

转载 作者:行者123 更新时间:2023-12-01 00:38:34 34 4
gpt4 key购买 nike

我想实现一个由浏览器本地存储支持的唯一 ID 生成器。我担心的是存储 DOM 对象的++ 运算符没有实现以原子方式运行。

考虑:

function generateUniqueID() {
if(!localStorage.generator) {
localStorage.generator = 0;
}
return localStorage.generator++;
}

如果此代码运行时不会出现任何并发问题,并在多个浏览器选项卡上生成唯一 ID,以实现此 generateUniqueID 函数,请大家评论一下吗?

最佳答案

根据 W3C Web 存储建议(请参阅 here ),§4.5“线程”:

Because of the use of the storage mutex, multiple browsing contexts will be able to access the local storage areas simultaneously in such a manner that scripts cannot detect any concurrent script execution.

Thus, the length attribute of a Storage object, and the value of the various properties of that object, cannot change while a script is executing, other than in a way that is predictable by the script itself.

这对我来说意味着互斥锁被放置在脚本对 localStorage 的第一次访问(读取或写入)上,并一直保留到此事件循环条目执行返回。 实际上,我们在执行链期间拥有对localStorage的独占访问权

我想,如果使用await/async,它会破坏执行链,并使代码跨多个事件循环条目执行,从而破坏这个契约。尽管源代码块看起来是单一的。当心。

问题的答案是:是的,只要浏览器遵守 W3C 建议,相关代码就会正确运行。尽管事实上“测试”if(!localStorage.generator) 和“增量”localStorage.generator++ 位于不同的行并且在大多数其他执行环境中不保证原子执行。

关于javascript - 浏览器的 "localStorage.generator++"运算符是原子的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57897293/

34 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com