rest参数【ES6 真的比ES5好很多吗?】为了支持rest参数,v8提供了CreateRestParameter指令 。不过,原有的arguments也是有CreateMAppedArguments指令支持的 。
二者算是打平 。
不过,从源代码的角度来看,不转码的会短一些:
let f1 = (...values) => {let sum = 0;for (let v of values) {sum += v;}return sum;};f1(1, 4, 9);
转码之后如下:
var f1 = function f1() {var sum = 0;for (var _len = arguments.length, values = new Array(_len), _key = 0; _key < _len; _key++) {values[_key] = arguments[_key];}for (var _i = 0, _values = values; _i < _values.length; _i++) {var v = _values[_i];sum += v;}return sum;};
可选catch参数这是ES2019的特性,可以省略catch中的错误类型 。在2018年上半年即被safari所支持 。
let f3 = f2 => {try {f2();} catch {console.error("Error");}};
转码之后,Babel会给我们生成一个未使用的error变量_unused:
var f1 = function f1(f2) {try {f2();} catch (_unused) {console.error("Error");}};
带有error变量的情况下,v8通过CreateCatchContext为我们生成CatchContext,并且为catch块生成了一个CATCH_SCOPE:
0x1937082936b6 @0 : 19 ff faMov <context>, r00x1937082936b9 @3 : 61 03 00CallUndefinedReceiver0 a0, [0]0x1937082936bc @6 : 8a 20Jump [32] (0x1937082936dc @ 38)0x1937082936be @8 : c3Star10x1937082936bf @9 : 82 f9 00CreateCatchContext r1, [0]0x1937082936c2 @12 : c4Star00x1937082936c3 @13 : 10LdaTheHole0x1937082936c4 @14 : a6SetPendingMessage0x1937082936c5 @15 : 0b faLdar r00x1937082936c7 @17 : 1a f9PushContext r10x1937082936c9 @19 : 21 01 02LdaGlobal [1], [2]0x1937082936cc @22 : c1Star30x1937082936cd @23 : 2d f7 02 04LdaNamedProperty r3, [2], [4]0x1937082936d1 @27 : c2Star20x1937082936d2 @28 : 13 03LdaConstant [3]0x1937082936d4 @30 : c0Star40x1937082936d5 @31 : 5e f8 f7 f6 06CallProperty1 r2, r3, r4, [6]0x1937082936da @36 : 1b f9PopContext r10x1937082936dc @38 : 0eLdaUndefined0x1937082936dd @39 : a9Return Constant pool (size = 4)0x19370829367d: [FixedArray] in OldSpace - map: 0x193708002205 <Map> - length: 40: 0x193708293649 <ScopeInfo CATCH_SCOPE>1: 0x193708202741 <String[7]: #console>2: 0x193708202769 <String[5]: #error>3: 0x19370800455d <String[5]: #Error>
而对于可选catch参数的情况下,直接不生成CatchContext:
0x19370829376a @0 : 19 ff faMov <context>, r00x19370829376d @3 : 61 03 00CallUndefinedReceiver0 a0, [0]0x193708293770 @6 : 8a 15Jump [21] (0x193708293785 @ 27)0x193708293772 @8 : 10LdaTheHole0x193708293773 @9 : a6SetPendingMessage0x193708293774 @10 : 21 00 02LdaGlobal [0], [2]0x193708293777 @13 : c2Star20x193708293778 @14 : 2d f8 01 04LdaNamedProperty r2, [1], [4]0x19370829377c @18 : c3Star10x19370829377d @19 : 13 02LdaConstant [2]0x19370829377f @21 : c1Star30x193708293780 @22 : 5e f9 f8 f7 06CallProperty1 r1, r2, r3, [6]0x193708293785 @27 : 0eLdaUndefined0x193708293786 @28 : a9Return Constant pool (size = 3)0x193708293735: [FixedArray] in OldSpace - map: 0x193708002205 <Map> - length: 30: 0x193708202741 <String[7]: #console>1: 0x193708202769 <String[5]: #error>2: 0x19370800455d <String[5]: #Error>
Generator解析赋值这样使用迭代器的方式是下一节转码效率高的部分 。
但是,针对Generator这样显式使用迭代器的,就是另一番情况了 。
我们看一个最简单的Generator,我们只生成几个数字:
let f1 = () => {let obj1 = {*[Symbol.iterator]() {yield 1;yield 2;yield 3;}};[...obj1];};
我们看到,转码后的结果,不但定义了几个函数,还需要regeneratorRuntime运行时的支持:
function _toConsumableArray(arr) { return _arrayWithoutHoles(arr) || _iterableToArray(arr) || _unsupportedIterableToArray(arr) || _nonIterableSpread(); }function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }function _iterableToArray(iter) { if (typeof Symbol !== "undefined" && iter[Symbol.iterator] != null || iter["@@iterator"] != null) return Array.from(iter); }function _arrayWithoutHoles(arr) { if (Array.isArray(arr)) return _arrayLikeToArray(arr); }function _arrayLikeToArray(arr, len) { if (len == null || len > arr.length) len = arr.length; for (var i = 0, arr2 = new Array(len); i < len; i++) { arr2[i] = arr[i]; } return arr2; }var f1 = function f1() {var obj1 = {[Symbol.iterator]() {return /*#__PURE__*/regeneratorRuntime.mark(function _callee() {return regeneratorRuntime.wrap(function _callee$(_context) {while (1) {switch (_context.prev = _context.next) {case 0:_context.next = 2;return 1;case 2:_context.next = 4;return 2;case 4:_context.next = 6;return 3;case 6:case "end":return _context.stop();}}}, _callee);})();}};_toConsumableArray(obj1);};
推荐阅读
- 莎士比亚的四大喜剧分别是什么内容? 莎士比亚四大喜剧
- 团购怎么做 聚团购
- 海外代购平台有哪些比较靠谱 黑五海淘
- 陈小春|被误认为是港星的10位内地明星,一个比一个有故事,有人已去世
- 简历里的求职意向怎么写比较合适? 求职意向怎么写
- 白夜追凶|比《白夜追凶》还精彩的6部探案剧,你不一定全看过?
- 先锋股份2021年净利6070.3万同比减少17.85% 公允价值变动损益同比减少
- 伊能静|伊能静儿子穿女装,裸上身妩媚妖娆,眼神勾人比妈妈还有女人味
- 最近火了的“一元脸”,真的是小脸的标准吗?
- 比黄金、白银走势更牛!钯金持续刷新历史高点,这只正牌概念股却没怎么涨!分析称:还得涨