JS运行报TypeError: val.replaceAll is not a function如何解决
问题原因
1. replaceAll is not a function报错原因
replaceAll是ES2021标准新增的字符串方法,如果你的代码运行环境(比如旧版Node.js、低版本浏览器)不支持该ES版本,就会抛出这个类型错误。
2. 用replace()得到错误结果的原因
你当前写法有两个核心问题:
- 非正则调用的
replace()默认只会替换第一个匹配到的字符,不会替换字符串中所有符合条件的内容,所以字符串里后续出现的元音不会被处理 - 按元音数组逐轮遍历替换的逻辑,会在前一次替换结果的基础上做后续匹配,虽然你当前场景里因为替换值是数字不会和元音字母冲突,但如果替换值包含元音的话会出现二次替换的bug,逻辑本身不严谨。
你当前代码的执行过程拆解:
- 初始转小写后字符串:
i love javascript - 替换第一个
a(对应索引0):i love j0vascript - 替换第一个
e(对应索引1):i l1ve j0vascript - 替换第一个
i(对应索引2):2 l1ve j0vascript - 替换第一个
o(对应索引3):2 l3v1 j0vascript - 未找到
u不做替换,最终输出和你描述的错误结果一致。
正确修改方案
推荐两种可靠的实现方式,都不会出现漏替换、错替换问题:
方式1:逐字符遍历处理
逻辑最直观,不存在正则兼容问题:
let val = "I love JavaScript"; val = val.toLowerCase(); const vowels = ['a', 'e', 'i', 'o', 'u']; const result = val.split('') .map(char => { const index = vowels.indexOf(char); return index !== -1 ? index : char; }) .join(''); console.log(result); // 输出 2 l3v1 j0v0scr2pt
方式2:全局正则替换
代码更简洁,执行效率更高:
let val = "I love JavaScript"; val = val.toLowerCase(); const vowels = ['a', 'e', 'i', 'o', 'u']; const result = val.replace(/[aeiou]/g, match => vowels.indexOf(match)); console.log(result); // 输出 2 l3v1 j0v0scr2pt
两种写法最终都会把所有元音字母替换为它在元音数组中对应的索引值:a对应0、e对应1、i对应2、o对应3、u对应4,符合预期需求。
内容的提问来源于stack exchange,提问作者Nagendra
相关产品推荐
相关产品推荐

