Pau*_*der 1 javascript functional-programming
我不禁注意到这样的事情是不可能的
["cat", "dog"].map(String.prototype.toUpperCase);
哪个扔了
未捕获的TypeError:String.prototype.toUpperCase调用null或undefined
以下代码有效(在es6箭头符号中为我的输入方便),但似乎很奇怪间接:
["cat", "dog"].map(s=>s.toUpperCase())
奇怪的是间接的,因为它创建了一个额外的匿名函数,只是为了包装一个已经存在的完美的函数.也许这是一个人必须忍受的东西,但它的味道并不合适.
所以我有两个问题:
是否有直接的方法将字符串方法映射到字符串数组而不将其包装在匿名函数中?
为什么我首先尝试的代码不起作用的技术解释是什么?我有两个猜测,但不知道哪个是对的.
猜猜(a):这是因为拳击,即字符串文字与字符串对象不同,并且由于某种原因将方法映射到它们上并没有做同样的静默强制,只是调用方法上的字符串呢.
猜猜(b):这是因为虽然函数是第一类对象,但方法的方式不一样,并且不能映射?
猜猜(c):我应该使用其他一些语法?!("".prototype.toUpperCase??)因为JavaScript gremlins?因为null既是对象又不是对象?在ES2025中修复了吗?只要用lodash,一切都会治好吗?
谢谢!
1.是否有直接的方法将字符串方法映射到字符串数组而不将其包装在匿名函数中?
否(假设"没有将其包装在匿名函数中",您通常意味着"不创建其他函数 ").
2.为什么我首先尝试的代码不起作用的技术解释是什么?我有两个猜测,但不知道哪个是对的.
"问题" toUpperCase本质上是一种实例方法.它期望this引用应该更改的值..map但是会将值作为参数传递给函数.你的第一个例子基本上是做的
String.prototype.toUpperCase("dog")
Run Code Online (Sandbox Code Playgroud)
而这根本不是该功能的工作原理.以下是有效的
String.prototype.toUpperCase.call("dog")
Run Code Online (Sandbox Code Playgroud)
但这反过来又不起作用.map.
不要猜a和b.关于c,您应该使用的语法是您的第二个解决方案.当然还有其他方法.你可以编写一个辅助函数:
function toUpper(s) {
return s.toUpperCase();
}
Run Code Online (Sandbox Code Playgroud)
但这与使用箭头功能没什么不同.
既然toUpperCase不接受争论,你甚至可能会疯狂到类似的东西
["cat", "dog"].map(String.prototype.toUpperCase.call.bind(String.prototype.toUpperCase));
Run Code Online (Sandbox Code Playgroud)
但那
| 归档时间: |
|
| 查看次数: |
75 次 |
| 最近记录: |