数组扩展符号应该如何与 Babel 中的 NodeLists 一起使用?

Posted

技术标签:

【中文标题】数组扩展符号应该如何与 Babel 中的 NodeLists 一起使用?【英文标题】:How should array spread notation work with NodeLists in Babel? 【发布时间】:2016-12-28 09:09:12 【问题描述】:

我知道querySelectorAll 返回类似数组但不完全是数组的东西。所以在我的代码中,我使用 ES6 扩展语法对其进行迭代:

const things = document.querySelectorAll('.things');
[...things].forEach(thing => thing.do());

如果我将确切的代码写入 Chrome devtools 控制台,它会按预期工作。但是,Babel 正在将其转换为 ES5:

var things = document.querySelectorAll('.things');
[].concat(things).forEach(function(thing)  thing.do() );

[].concat(things) [...things] 做同样的事情。预期的结果是一个节点数组,但concat 返回一个节点列表数组。因此调用thing.do() 会导致错误,因为NodeList 没有do 方法。

相反,在 NodeList 上使用 Array 方法的一种 ES5 友好的方式是首先调用 slice,例如 Array.prototype.slice.call(things)

那么对于每次使用数组扩展,Babel 都错误地转换为 concat 吗?还是我缺少更新的版本或配置?

【问题讨论】:

你需要支持哪些浏览器? 听起来你在 Babel 预设中使用了loose: true,这会禁用你正在寻找的行为。 只需要支持常青浏览器 【参考方案1】:

您可以将NodeList.prototype 上的@@isConcatSpreadable 属性设置为true,以使其与[].concat 一起正常工作。

NodeList.prototype[Symbol.isConcatSpreadable] = true;
const divs = document.querySelectorAll('div');
console.log([].concat(divs));
<div>foo</div>
<div>bar</div>

【讨论】:

以上是关于数组扩展符号应该如何与 Babel 中的 NodeLists 一起使用?的主要内容,如果未能解决你的问题,请参考以下文章

babel-node vs node:带有导入/导出的graphql文件

关于babel,你应该知道的一些事

使用 vue-cli 设置时如何从 babel-loader 中排除特定文件?

数组中的“...”(三点)符号是啥意思? [复制]

Node.js 中的 Emoji 到 PNG 或 JPG - 如何?

node.js学习笔记之babel使用