为何在if...else结构中使用match方法触发TypeError错误?
错误原因分析与修复方案
问题代码
for (let i = 0; i < string.length; i++){ if(string[i].match(/a/)){ final += 1 } else if (string[i].match(/A/) && string[i - 1].match(/A/)){ final += 1 } else if (string[i].match(/A/)){ final += 2 } }
报错信息
else if (string[i].match(/A/) && string[i - 1].match(/A/)){ ^ TypeError: 无法读取未定义的属性(读取'match') at typist (c:\Users\123\Desktop\JavaScriptLearningProjects\27_06_2023.js:827:59) at Object.<anonymous> (c:\Users\123\Desktop\JavaScriptLearningProjects\27_06_2023.js:837:13) at Module._compile (node:internal/modules/cjs/loader:1103:14) at Object.Module._extensions..js (node:internal/modules/cjs/loader:1157:10) at Module.load (node:internal/modules/cjs/loader:981:32) at Function.Module._load (node:internal/modules/cjs/loader:822:12) at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:77:12) at node:internal/main/run_main_module:17:47
错误原因
循环从i=0开始,当i=0时,string[i-1]等价于string[-1],JavaScript中字符串的负索引无法获取有效字符,返回undefined。对undefined调用match()方法就会抛出上述类型错误。
修复方案
方案一:增加索引有效性判断
在访问string[i-1]前先判断i是否大于0,避免访问无效索引:
for (let i = 0; i < string.length; i++){ if(string[i].match(/a/)){ final += 1 } // 先确保i>0,再检查前一个字符 else if (i > 0 && string[i].match(/A/) && string[i - 1].match(/A/)){ final += 1 } else if (string[i].match(/A/)){ final += 2 } }
方案二:简化字符判断逻辑(优化版)
直接用字符比较替代正则match(),逻辑更直观且性能更好:
for (let i = 0; i < string.length; i++){ const currentChar = string[i]; if (currentChar === 'a') { final += 1; } else if (currentChar === 'A') { // 仅当i>0时才检查前一个字符 if (i > 0 && string[i-1] === 'A') { final += 1; } else { final += 2; } } }
注意事项
- 字符串索引从0开始,负索引会返回
undefined,访问前必须判断索引有效性。 - 单个字符的判断场景,直接用字符全等比较比正则
match()更高效。
内容的提问来源于stack exchange,提问作者Joldas Izbergenov
相关产品推荐
相关产品推荐

