gpt4 book ai didi

JavaScript - 继承数组后,过滤器功能被破坏

转载 作者:行者123 更新时间:2023-11-29 10:06:06 25 4
gpt4 key购买 nike

我想我在 zombie 中发现了一个错误.

此代码有效:

function twoArguments(a, b) { }

function threeArguments(a, b, c) { }

let pipeline = new Array();
pipeline.push(twoArguments);
pipeline.push(threeArguments);

let onlyTwoArgumentsFuncs = pipeline.filter(fn => fn.length === 2);
console.log(onlyTwoArgumentsFuncs);

但是下面的代码并没有过滤掉非双参数函数:

class Pipeline extends Array {

constructor() {
super();
this.push(twoArguments);
this.push(threeArguments);
}

run() {
return this.filter(fn => fn.length === 2);
}

}

let pipeline = new Pipeline();
let onlyTwoArgumentsFuncs = pipeline.run();
console.log(onlyTwoArgumentsFuncs);

仍然返回两个函数。请解释原因。

最佳答案

Symbol.species 设置为原始 Array 构造函数修复此问题

class Pipeline extends Array {
static get [Symbol.species]() { return Array; }

// ...
}

编辑:
Array.prototype.filter 实现不会改变原始对象,而是创建一个新对象来存储结果。在这种情况下,派生的构造函数用于此,它会准确地填充对象每个初始化有 2 个值。

您可以在派生类上设置Symbol.species 来专门告诉filter 使用原始的Array 构造函数。或者您可以从类中删除初始化,并使用 new Pipeline(twoArguments, threeArguments)Pipeline.of(...),如 @Bergi 所建议的。

关于JavaScript - 继承数组后,过滤器功能被破坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42927253/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com