尝试使用具有高阶函数的String方法时,我遇到了一个奇怪的事情.这会抛出一个错误:
['a', 'b'].some('boo'.includes)
Run Code Online (Sandbox Code Playgroud)
我必须将谓词包装在另一个函数中以使其工作.但是还不'boo'.includes是一个功能?
这适用于普通函数:
const boo = {
includes: () => true
};
['a', 'b'].some(boo.includes)
Run Code Online (Sandbox Code Playgroud)
是否有一些String方法的特殊属性阻止它们像这样组成?
ASD*_*rte 13
"boo".includes没什么别的String.prototype.includes.然后在字符串"boo"上调用它设置this为"boo",它为函数提供了正确的上下文.例如"boo".includes("b")和String.prototype.includes.call("boo", "b").
将其作为参数传递,例如['a', 'b'].some('boo'.includes),与之相同['a', 'b'].some(String.prototype.includes),然后缺乏适当this的上下文.
当然你也可以使用例如bind:['a', 'b'].some(String.prototype.includes.bind("boo")),或使用可选的第二个参数thisArg为some:['a', 'b'].some(String.prototype.includes, "boo").这将摆脱错误.但是,您会注意到,不仅some传递元素,而且传递索引作为第二个参数,数组本身传递为第三个参数.这是一个问题,因为includes起始位置也需要一个可选的第二个参数.这导致可能不希望的行为,例如数组元素"b"在索引1处,和"boo".includes("b", 1) === false.
总而言之,你需要一个与众不同的功能String.prototype.includes,它更容易将它包装在一个实际完成你想要的新功能中:
['a', 'b'].some(e => "boo".includes(e))正如你已经注意到的那样.
| 归档时间: |
|
| 查看次数: |
377 次 |
| 最近记录: |