具有绑定与未绑定函数的数组筛选器

Array filter with bound vs unbound function

本文关键字:绑定 数组 筛选 函数      更新时间:2023-09-26

所以我有这个代码来获得两个数组的交集:

var a = [1,2,3];
var b = [2,3,4];
var intersection = a.filter(x => b.includes(x));

得到了正确的CCD_ 1。但后来我想为什么不这样做:

var binc = b.includes.bind(b);
var intersection = a.filter(binc);

得到CCD_ 2。为什么?这是有效的:a.filter(x => binc(x))bincx => binc(x)为每个输入返回相同的值。那个么,我在这里缺少的过滤器是干什么的呢?

在文档中,您可以看到Array#includes接受两个参数:

  1. searchElement
  2. fromIndex(数组中要搜索的位置)

因为你调用binc的方式,它会得到[2,3]0回调得到的所有参数:

  1. value(填充searchElement
  2. index(填充fromIndex并使您的includes搜索失败)
  3. completearray

因此,您需要向Array#filter传递一个回调,该回调只将所需的值传递给Array#includes,这样fromIndex就不会被填充:

var a = [1,2,3];
var b = [2,3,4];
var binc = b.includes.bind(b);
var intersection = a.filter(x => binc(x));

[]0向回调传递三个参数:elementindexarray
includes接受两个参数:searchElementfromIndex

你可以试着自己弄清楚这两者是如何与其他参数相互作用的,从而产生不同的结果。。。

问题是includes(element, fromIndex)方法在filter(value, index, currArray)中调用时会占用不必要的第二个参数fromIndex。这会中断includes()方法的执行。

为了使您的代码工作(仅用于研究,不用于生产),可以使用以下方法:

var oldIncludes = Array.prototype.includes;
Array.prototype.includes = function(element) { 
  //use only the first argument: the element
  return oldIncludes.call(this, element);
};
var a = [1,2,3];
var b = [2,3,4];
var binc = b.includes.bind(b);
var intersection = a.filter(binc);
console.log(interesection); //prints "[2, 3]"