ES6 的解构赋值前每次都创建一个对象吗?会加重 GC 的负担吗?

本文来源于知乎上的一个提问。

为了程序的易读性,我们会使用 ES6 的解构赋值:

这个例子的函数调用中,会真的产生一个对象吗?如果会,那大量的函数调用会白白生成很多有待 GC 释放的临时对象,那么就意味着在函数参数少时,还是需要尽量避免采用解构传参,而使用传统的:

上面的描述其实同时提了好几个问题:

会不会产生一个对象?

参数少时,是否需要尽量避免采用解构传参?

对性能(CPU/内存)的影响多大?

1. 从 V8 字节码分析两者的性能表现

首先从上面给的代码例子中,确实会产生一个对象。但是在实际项目中,有很大的概率是不需要产生这个临时对象的。

我之前写过一篇文章使用 D8 分析 javascript 如何被 V8 引擎优化的。那么我们就分析一下你的示例代码。

鉴于很多人没有 d8,因此我们使用 node.js 代替。运行:

其中的 可以查看 V8 引擎生成的字节码。在输出结果中查找 :

将当前在累加器中的值存储在寄存器 中。

将小整数(Smi) 加载到累加器寄存器中。

而函数体只有两行代码: 和 Add a0 。

当我们使用解构赋值后:

我们可以看到,代码明显增加了很多, 创建了一个对象。本来只有 2 条核心指令的函数突然增加到了近 20 条。其中不乏有 、 、 这种指令。

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20180628B1XHGR00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券