824a34c26cd9fb0413cd4b28dc8e53cfa8b70a7b448769760947ec8bc89e8db5e9451a7a5ca9e5e3b2b591eb2b6dfe59046484e05081b9054b72109da99a21 2.3 KB

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