一楼空着。
欢迎打断我来讨论。我如果能一口气写完也不需要这样了。
如这篇博文所言,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
循环就报错了。。(看来不占用调用栈是解释器福利)
我放弃讨论。
hhhh
@FrankFang 卢本伟牛逼