Babel.js 为什么巴别塔在从对象解构属性时引入未使用的变量?

iyfjxgzm  于 2022-12-08  发布在  Babel
关注(0)|答案(1)|浏览(146)

我刚刚看了我的源代码编译脚本,我想我注意到一些奇怪的事情。
此ES6代码:

const data = {someProperty:1, someNamedPropery: 1, test:1};
const { 
  someProperty, // Just gets with 'someProperty' peoperty
  someNamedPropery: changedName, // Works same way, but gets with 'changedName' property
  test: changedNameWithDefault = 1, // This one, introduces new variable and then uses it to compare that to void 0
} = data;

编译为:

"use strict";

const data = {someProperty:1, someNamedPropery: 1, test:1};
var someProperty = data.someProperty,
    changedName = data.someNamedPropery,
    _data$test = data.test,
    changedNameWithDefault = _data$test === void 0 ? 1 : _data$test;

我很好奇为什么Babel引入了新的变量_data$test。它不能只是这样的东西吗?

...
changedNameWithDefault = data.test === void 0 ? 1 : data.test;

它仍然工作。
注意,只有在data变量中不存在key或者key是undefined时,我才尝试分配默认值,这时才会引入新变量。
如果data.test足够大,这会影响应用程序性能吗?我想知道垃圾收集器是否会处理它(_data$test变量)。

2nc8po8w

2nc8po8w1#

就不能这样吗?
不,但有点微妙的原因是:如果test是一个 accessor 属性,那么访问它就是一个函数调用。反结构化代码和Babel对它的翻译只会调用一次accessor。你的修改会调用它两次。下面是一个例子:
第一个
虽然我们可以通过查看代码来判断test不是该特定示例中的访问器属性,但代码转换通常不处理那么多上下文,因此这是转换该代码的更安全的一般情况方法。

相关问题