看代码的时候遇到了下面这样一段:
function generateSkeleton() {
// 文字节点
;[...document.querySelectorAll('*')]
.filter(
(node) =>
!['script', 'style', 'html', 'body', 'head', 'title'].includes(
node.tagName.toLowerCase()
)
)
.map((node) => [...node.childNodes].filter((node) => node instanceof Text))
.flat(Infinity)
.forEach((node) => {
let span = document.createElement('span')
node.parentNode.insertBefore(span, node)
span.appendChild(node)
span.style = `
background: #f2f2f2;
color: transparent !important;
`
})
}
(代码链接:https://zhuanlan.zhihu.com/p/166009071)
发现有“...”这样的语法。查了一下文档,原来这是js中的展开语法。MDN上的定义为:
展开语法(Spread syntax), 可以在函数调用/数组构造时, 将数组表达式或者string在语法层面展开;还可以在构造字面量对象时, 将对象表达式按key-value的方式展开。
以上面代码中的
为例,在chrome中的运行结果是:
在这里,...把一个nodelist展开来,作为Array的构造参数。
再看一个在String中应用的一个例子
不难明白,“...“的作用其实就是把nodelist,string等可迭代的东西展开来。