此代码使用[] .filter.call做什么?

Taa*_*zar 3 javascript arrays

我正在学习javascript,并尝试编写对列表进行排序的代码,如果满足某些条件,则将其删除。

我发现此片段似乎很有希望,但不知道它如何工作,因此我可以使其适应我的需求:

list = document.getElementById("raffles-list").children; // Get a list of all open raffles on page
list = [].filter.call(list, function(j) {
    if (j.getAttribute("style") === "") {
        return true;
    } else {
        return false;
    }
});
Run Code Online (Sandbox Code Playgroud)

你们可以通过解释此代码块的功能来帮助我学习吗?

jro*_*lla 5

它获取“ raffles-list”元素的所有子元素,然后返回包含空“ style”属性的元素的过滤列表。

第一行是不言而喻的-它只是从id为“ raffles-list”的元素中检索孩子。

第二行稍微复杂一些。它利用了两点优势:[]是一个空数组,实际上只是一个具有各种方法/属性的对象,并且等号右侧的逻辑需要在“列表”之前求值。 ”获得新的价值。

  1. 使用空白数组以调用“过滤器”方法
  2. 告诉过滤器list用作要过滤的数组,并使用function(j)进行过滤,其中j是要测试的列表中的项目
  3. 如果该项目的样式属性为空,即未应用任何样式,则返回true。

编辑:根据OP注释,[]。filter是一个原型,因此从本质上讲,一个对象具有与其他所有对象一样的各种属性。在这种情况下,过滤器是一种方法-请参见此处。通常,您仅指定执行测试的匿名函数/方法,但是此处的作者使用.call来指定任意对象来进行测试。看来这已经内置在标准过滤器方法中,所以我不知道他们为什么这样做。

  • list.filter无效,因为list是HTMLCollection而不是Array。因此它没有`filter`原型方法。这就是为什么需要创建空数组以便从Array原型中获取filter方法的原因。您无法删除“通话”部分,除非之前已将“ list”转换为“ Array”(例如,“ Array.from(list)” —并非所有浏览器都支持)。这个答案中带有“ [] .filter`是原型”的部分不是很清楚。过滤器是Array.prototype中的_prototype method_。`.call`不是特定于`filter`的。 (6认同)