gpt4 book ai didi

javascript - 有没有一种直接的方法可以将字符串方法映射到 JavaScript 中的字符串数组?另外,为什么这不起作用的解释是什么?

转载 作者:行者123 更新时间:2023-11-30 07:33:13 25 4
gpt4 key购买 nike

我不禁注意到不可能做类似的事情

["cat", "dog"].map(String.prototype.toUpperCase);

抛出

Uncaught TypeError: String.prototype.toUpperCase called on null or undefined

下面的代码有效(为了我打字的方便,在 es6 箭头符号中),但看起来奇怪地间接:

["cat", "dog"].map(s=>s.toUpperCase())

奇怪的是间接的,因为它创建了一个额外的匿名函数,只是为了包装一个已经存在的完美函数。也许这是一个人必须忍受的东西,但它的味道不对。

所以我有两个问题:

  1. 有没有一种直接的方法可以将字符串方法映射到字符串数组上,而无需将其包装在匿名函数中?

  2. 为什么我首先尝试的代码不起作用的技术解释是什么?我有两个猜测,但不知道哪个是对的。

猜测 (a):这是因为装箱,即字符串文字与字符串对象不同,并且出于某种原因,将方法映射到它们之上不会执行与仅调用字符串上的方法。

猜想 (b):这是因为虽然函数是一等对象,但方法的方式不同,永远无法映射?

猜猜 (c):我应该使用其他一些语法?! ("".prototype.toUpperCase??) 因为 JavaScript gremlins?因为 null 既是又不是对象?在 ES2025 中修复了吗?只用 lodash 就万事大吉了?

谢谢!

最佳答案

1. Is there a direct way to map a string method over an array of strings without wrapping it in an anonymous function?

否(假设“不将其包装在匿名函数中”更通常的意思是“不创建附加函数”)。

2. What's the technical explanation for why the code I tried first doesn't work? I have two guesses, but don't know which is right.

“问题”在于 toUpperCase 本质上是一个实例方法。它期望 this 引用应该更改的值。然而,.map 会将值作为参数 传递给函数。你的第一个例子基本上是在做

String.prototype.toUpperCase("dog")

这根本不是该功能的工作原理。以下将起作用

 String.prototype.toUpperCase.call("dog")

但这不是 .map 的工作方式。

不用猜a和b。关于 c,您应该使用的语法是您的第二个解决方案。当然还有其他方法。你可以写一个辅助函数:

function toUpper(s) {
return s.toUpperCase();
}

但这与使用箭头函数没有太大区别。

因为 toUpperCase 不接受参数,你甚至可以疯狂地做类似的事情

["cat", "dog"].map(String.prototype.toUpperCase.call.bind(String.prototype.toUpperCase));

但是那个

  • 还创建了一个新函数
  • 可能不太容易理解
  • 不普遍适用

关于javascript - 有没有一种直接的方法可以将字符串方法映射到 JavaScript 中的字符串数组?另外,为什么这不起作用的解释是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43645649/

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