解释 [].slice.call in javascript?

2022-08-30 00:46:33

我偶然发现了这个将DOM NodeList转换为常规数组的简洁快捷方式,但我必须承认,我不完全理解它是如何工作的:

[].slice.call(document.querySelectorAll('a'), 0)

所以它从一个空数组开始,然后用于将结果转换为新数组是吗?[]slicecall

我不明白的是.它如何从 NodeList 转换为常规数组?calldocument.querySelectorAll('a')


答案 1

这里发生的事情是,您调用就好像它是使用 .在这种情况下,所做的是创建一个空数组,然后循环访问它正在运行的对象(最初是一个数组,现在是一个),并继续将该对象的元素追加到它创建的空数组中,最终返回该数组。这是一篇关于此的文章slice()NodeListcall()slice()NodeList

编辑:

所以它从一个空数组[]开始,然后切片用于将调用结果转换为新数组是吗?

这是不对的。 返回一个函数对象。函数对象有一个函数,该函数调用将 的第一个参数赋值给 ;换句话说,使函数认为它是从参数(返回的)而不是从数组调用的。[].slicecall()call()thisNodeListdocument.querySelectorAll('a')


答案 2

在 JavaScript 中,一个对象的方法可以在运行时绑定到另一个对象。简而言之,javascript允许一个对象“借用”另一个对象的方法:

object1 = {
    name: 'Frank',
    greet() {
        alert(`Hello ${this.name}`);
    }
};

object2 = {
    name: 'Andy'
};

// Note that object2 has no greet method,
// but we may "borrow" from object1:

object1.greet.call(object2); // Will show an alert with 'Hello Andy'

函数对象的和方法(在JavaScript中,函数也是对象)允许您执行此操作。因此,在您的代码中,您可以说 NodeList 正在借用数组的切片方法。 返回另一个数组作为其结果,该数组将成为随后可以使用的“转换”数组。callapply.slice()