1 | # babel-plugin-transform-es2015-for-of
|
2 |
|
3 | > Compile ES2015 for...of to ES5
|
4 |
|
5 | ## Example
|
6 |
|
7 | **In**
|
8 |
|
9 | ```js
|
10 | for (var i of foo) {}
|
11 | ```
|
12 |
|
13 | **Out**
|
14 |
|
15 | ```js
|
16 | var _iteratorNormalCompletion = true;
|
17 | var _didIteratorError = false;
|
18 | var _iteratorError = undefined;
|
19 |
|
20 | try {
|
21 | for (var _iterator = foo[Symbol.iterator](), _step; !(_iteratorNormalCompletion = (_step = _iterator.next()).done); _iteratorNormalCompletion = true) {
|
22 | var i = _step.value;
|
23 | }
|
24 | } catch (err) {
|
25 | _didIteratorError = true;
|
26 | _iteratorError = err;
|
27 | } finally {
|
28 | try {
|
29 | if (!_iteratorNormalCompletion && _iterator.return) {
|
30 | _iterator.return();
|
31 | }
|
32 | } finally {
|
33 | if (_didIteratorError) {
|
34 | throw _iteratorError;
|
35 | }
|
36 | }
|
37 | }
|
38 | ```
|
39 |
|
40 | ## Installation
|
41 |
|
42 | ```sh
|
43 | npm install --save-dev babel-plugin-transform-es2015-for-of
|
44 | ```
|
45 |
|
46 | ## Usage
|
47 |
|
48 | ### Via `.babelrc` (Recommended)
|
49 |
|
50 | **.babelrc**
|
51 |
|
52 | ```js
|
53 | // without options
|
54 | {
|
55 | "plugins": ["transform-es2015-for-of"]
|
56 | }
|
57 |
|
58 | // with options
|
59 | {
|
60 | "plugins": [
|
61 | ["transform-es2015-for-of", {
|
62 | "loose": true
|
63 | }]
|
64 | ]
|
65 | }
|
66 | ```
|
67 |
|
68 | ### Via CLI
|
69 |
|
70 | ```sh
|
71 | babel --plugins transform-es2015-for-of script.js
|
72 | ```
|
73 |
|
74 | ### Via Node API
|
75 |
|
76 | ```javascript
|
77 | require("babel-core").transform("code", {
|
78 | plugins: ["transform-es2015-for-of"]
|
79 | });
|
80 | ```
|
81 |
|
82 | ## Options
|
83 |
|
84 | ### `loose`
|
85 |
|
86 | `boolean`, defaults to `false`
|
87 |
|
88 | In loose mode, arrays are put in a fast path, thus heavily increasing performance.
|
89 | All other iterables will continue to work fine.
|
90 |
|
91 | #### Example
|
92 |
|
93 | **In**
|
94 |
|
95 | ```js
|
96 | for (var i of foo) {}
|
97 | ```
|
98 |
|
99 | **Out**
|
100 |
|
101 | ```js
|
102 | for (var _iterator = foo, _isArray = Array.isArray(_iterator), _i = 0, _iterator = _isArray ? _iterator : _iterator[Symbol.iterator]();;) {
|
103 | var _ref;
|
104 |
|
105 | if (_isArray) {
|
106 | if (_i >= _iterator.length) break;
|
107 | _ref = _iterator[_i++];
|
108 | } else {
|
109 | _i = _iterator.next();
|
110 | if (_i.done) break;
|
111 | _ref = _i.value;
|
112 | }
|
113 |
|
114 | var i = _ref;
|
115 | }
|
116 | ```
|
117 |
|
118 | #### Abrupt completions
|
119 |
|
120 | In loose mode an iterator's `return` method will not be called on abrupt completions caused by thrown errors.
|
121 |
|
122 | Please see [google/traceur-compiler#1773](https://github.com/google/traceur-compiler/issues/1773) and
|
123 | [babel/babel#838](https://github.com/babel/babel/issues/838) for more information.
|
124 |
|
125 | ### Optimization
|
126 |
|
127 | If a basic array is used, Babel will compile the for-of loop down to a regular for loop.
|
128 |
|
129 | **In**
|
130 |
|
131 | ```js
|
132 | for (let a of [1,2,3]) {}
|
133 | ```
|
134 |
|
135 | **Out**
|
136 |
|
137 | ```js
|
138 | var _arr = [1, 2, 3];
|
139 | for (var _i = 0; _i < _arr.length; _i++) {
|
140 | var a = _arr[_i];
|
141 | }
|
142 | ```
|