为什么在Android React Native中string.replaceAll()不是一个函数?

18

最近我遇到了这个问题,尽管在iOS上运行良好,但无法在Android上运行,即使我使用相同的代码库并在并行模式下运行。

react native 0.64.4上的错误日志

请注意,(number + '')始终返回一个字符串,在iOS上可以运行此代码。

尝试使用全局标志“g”来进行正则表达式:

string.replace(/searchString/g, replaceString)

就像一些StackOverFlow答案建议的那样,这也不起作用。

你们能猜到原因并提供解决方案吗?


2
你能检查一下安卓是否启用了Hermes,而iOS没有吗?这可能与调用Array.prototype方法时的JavaScript引擎差异有关。 - Krismu
2
什么奇怪的 bug!?我也遇到了这个问题。 - topherPedersen
同样的问题。我真的很想知道为什么。 - Francesco Bonizzi
仍然存在“react-native”:“0.65.1”的问题。 不得不使用.replace(而不是),但想了解为什么这只发生在Android上。 - julio
3个回答

22

使用 splitjoin 函数的另一种方法。

string.split("searchString").join("replaceString");

只想补充一下,这种方法也适用于正则表达式。太棒了! - Hung Vu

4

replace方法在最新的React Native版本中运行良好。请注意,您需要使用字符串字面量(`)而不是引号(")来表示字符串变量。

string.replace(`/${searchString}/g`, replaceString);

测试的React Native版本如下:

react-native-cli: 2.0.1
react-native: 0.64.3

1

简而言之:

  1. 检查 android/app/build.gradle 文件
    • 在项目中搜索:enableHermes
  2. 将其改为:true
  3. 清理并重新构建项目

我的默认设置:

project.ext.react = [
    enableHermes: false,  // clean and rebuild if changing
]

改为:

project.ext.react = [
    enableHermes: true,  // clean and rebuild if changing
]

我也遇到了这个问题。在iOS上运行良好,但在Android上会抛出错误。

根据OP问题的第一条评论建议,@Krismu,我检查了Hermes是否已启用。Hermes是一个与React-native捆绑在一起的Javascript引擎,以确保兼容性和效率。

React-native文档表示默认情况下启用了它,您可以选择退出。

https://reactnative.dev/docs/hermes#switching-back-to-javascriptcore

然而,我的 android/app/build.gradle 文件默认设置为 false,导致我的 Android 应用程序未使用 Hermes。

这对我解决了问题。无需填充,只需使用 'replace()' 或更改任何代码即可...

版本信息:

  • "react": "18.0.0",
  • "react-native": "0.69.7",

我觉得这个存在于Hermes而不是JS Core很奇怪。这个函数是JS本身的,无论在哪个平台上都应该是如此。 - Hung Vu
1
JS 标准化为 ECMAScript 标准。replaceAll 仅在最近的标准(2021 版本)中引入,因此并非所有 JS 引擎都支持它。 - user3670473

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接