[已放弃] JS 各实现中原生有副作用方法的事务性讨论
发布于 7 年前 作者 dou4cc 3435 次浏览 来自 问答

一楼空着。

欢迎打断我来讨论。我如果能一口气写完也不需要这样了。

12 回复

这篇博文所言,JS 标准库充斥着各种非原子性的、可能报错的有副作用方法,规范明确指出其无事务性,中途失败不会回滚。

但规范对原生方法的定义从未考虑 edge cases,如 StackOverflow、OutOfMemory。

正常人一般不会干出改数组元素描述符的事,所以这些方法这样实现也没什么问题。。。 点进去之前我还以为想讲Atomic。。。

对于 Set 容器,因其不能用下标访问,理论上可以存放无数元素,故写出如下代码测试:

const set = new Set;
for(; ; ) set.add(Symbol());

在 Chrome Canary x64 68.0.3401.0(V8 6.8.44)上,如上代码直接崩溃页面。 在 Firefox Nightly x64 61.0a1 (2018-04-21) 上,如上代码被警告、继续多次后烧光内存。

为了测试 StackOverflow 是否会发生在原生方法中,有如下代码:

const set = new Set;
const fn = () => {
	try{
		return fn();
	}catch(_){}
	try{
		set.add("test");
	}catch(error){
		return error;
	}
};
fn();

在 Chrome Canary x64 68.0.3401.0(V8 6.8.44)上,set.add("test")不报错,可见原生方法从调用到返回都不占用调用栈。

在 Firefox Nightly x64 61.0a1 (2018-04-21) 上,set.add("test")报错,但定位在fn中,故不能得出原生方法不报 StackOverflow 的结论。

在 Chrome Canary x64 68.0.3401.0(V8 6.8.44)上,放入for循环就报错了。。(看来不占用调用栈是解释器福利)图片.png

我放弃讨论。

回到顶部