babel的“for-of”循环传输代码不支持某些浏览器

时间:2017-09-06 04:11:36

标签: reactjs asynchronous ecmascript-6 babel for-of-loop

我的反应项目中有一些es6代码,如下所示:

``` javascript
for (const v of [0, 1, 2,]) { /* doSth*/ }
```

并且在每个地方运输到es5之后运行良好。 但是,如果我改变它们:

``` javascript
const arr = [0, 1, 2,];
for (const v of arr) { /* doSth*/ }
```

然后它会在iPhone 5c中抛出ReferenceError: Can't find variable: Symbol的错误。 我尝试了foreach for-in和纯for发行版,它们在旧版设备上运行良好。 但是,我需要执行async () => { for (...) { await doSthAysnc; } }之类的操作,而不能使用foreach。 更重要的是,for-of非常危险,而纯for非常难看。所以,如果可能的话,我更喜欢使用for-of。 感谢。

@Bergi嗯,这是它转化为的代码:     javascript ("================================================================"),m=["a","b","c"],e.prev=38,v=c.a.mark(function e(n){return c.a.wrap(function(e){for(;;)switch(e.prev=e.next){case 0:return e.next=2,new Promise(function(e){return setTimeout(function(){return e(n)},1e3)});case 2:case"end":return e.stop()}},e,t)}),y=!0,b=!1,w=void 0,e.prev=43,_=m[Symbol.iterator]();case 45:if(y=(x=_.next()).done){e.next=51;break}return E=x.value,e.delegateYield(v(E),"t2",48);case 48:y=!0,e.next=45;break;case 51:e.next=57;break;case 53:e.prev=53,e.t3=e.catch(43),b=!0,w=e.t3;case 57:e.prev=57,e.prev=58,!y&&_.return&&_.return();case 60:if(e.prev=60,!b){e.next=63;break}throw w;case 63:return e.finish(60);case 64:return e.finish(57);case 65:e.next=69;break;case 67:e.prev=67,e.t4=e.catch(38);case 69:console.log("================================================================"),

1 个答案:

答案 0 :(得分:0)

直接在for … of内使用数组文字会导致extra transpiler optimisation导致它不使用iterables。在默认情况下,它将尝试查找在旧环境中失败的m[Symbol.iterable]方法。

在中可以看到三种解决方案: