JS实现驼峰转换函数在CodeWars报toUpperCase未定义错误
错误产生原因
报错的核心触发点是代码未兼容空字符串的边界输入场景:
- CodeWars的测试用例包含传入空字符串
""的情况,此时执行const arrChar = Array.from(str)[0],空字符串转换得到的数组长度为0,取索引0的元素返回值为undefined - 后续代码执行
arrChar !== arrChar.toUpperCase()判断时,相当于对undefined调用toUpperCase()方法,直接抛出你看到的TypeError: Cannot read property 'toUpperCase' of undefined - 本地VS Code环境运行正常,是因为你仅测试了题目给出的两个常规示例,没有覆盖空输入的边界用例,所以没有复现问题。
现有代码的其他冗余问题
除了触发报错的边界漏洞,代码还有几处可优化的问题:
- 两个分支的判断条件完全互斥,首字符要么是大写、要么不是大写,不需要额外写
else if做相等判断,直接走else分支即可 - 正则匹配范围写的是
[^a-zA-Z0-9]+,会把所有非字母数字的字符都识别成分隔符,而题目明确分隔符只有短横线-和下划线_,匹配范围过宽 - 首字母小写分支直接对整个字符串执行
toLowerCase(),会把原字符串中非首位置本来大写的字符强制转小写,鲁棒性不足
更简洁的符合要求的实现
function toCamelCase(str) { // 空字符串直接返回,避免报错 if (!str) return '' // 保留原首字符大小写,后续匹配分隔符+字符的组合,将分隔符移除、后续字符转大写 return str[0] + str.slice(1).replace(/[-_](.)/g, (_, c) => c.toUpperCase()) }
这个实现完全符合题目规则:第一个单词的首字母保留原大小写,后续所有短横线/下划线分隔的单词首字母大写,同时兼容空字符串输入,能通过所有测试用例。
内容的提问来源于stack exchange,提问作者BorisWho
相关产品推荐
相关产品推荐

