gpt4 book ai didi

javascript:为什么有些函数可以绑定(bind)和映射,而有些则不能?

转载 作者:塔克拉玛干 更新时间:2023-11-02 21:15:47 26 4
gpt4 key购买 nike

出于好奇:

MDN教我如何像这样快捷地使用函数应用程序:

trim = Function.prototype.call.bind(String.prototype.trim)

join = Function.prototype.call.bind(Array.prototype.join)

现在,我可以映射 trim,但由于某些原因不能 joinjoin',' 作为默认参数(分隔符),所以我应该没问题,但它使用数组索引:

> trim = Function.prototype.call.bind(String.prototype.trim)
call()
> [' a','b '].map(trim)
["a", "b"]
> join = Function.prototype.call.bind(Array.prototype.join)
call()
> [['a','b'],['c','d']].map(join)
["a0b", "c1d"]

为什么?

此外,如果我真的想要一个不同的分隔符怎么办?将它传递给 bind 是行不通的,因为它被添加到现有参数之前(任何时候我映射的列表的元素之一)。然后它扮演要连接的字符串的 Angular 色,如果有东西要分开,要连接的字符串将充当分隔符:

> joins = Function.prototype.call.bind(Array.prototype.join,';')
call()
> [['a','b'],['c','d']].map(joins)
[";", ";"]

我研究并发现:

Answers explaining the thing with this and solutions equivalent to the bind shortcut I referenced

Similar explanations, the solution using thisArg again, from MDN's page about map

A duplicate question with duplicate answers

最佳答案

您传递给 map 的函数接收 3 个参数。 map 基本上是这样工作的。

Array.prototype.map = function(f) {
var result = [];
for(var i = 0; i < this.length; i++) {
result.push(f(this[i], i, this));
}
return result;
}

所以当你运行这段代码时[['a','b'],['c','d']].map(join),这就是 map

中发生的事情
join(['a', 'b'], 0, [['a','b'],['c','d']])
join(['c', 'd'], 1, [['a','b'],['c','d']])

要获得您想要的结果,您可以编写一个可以生成连接函数的函数。例如

function joinSep(separator) {
return function(array) {
return array.join(separator)
}
}
var joins = joinSep(';');
[['a','b'],['c','d']].map(joins)

关于javascript:为什么有些函数可以绑定(bind)和映射,而有些则不能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31549124/

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