字符串与switch语句的工作机制及代码TypeError报错排查求助
先直接说你代码报错的核心原因,再逐一解答你的疑问,最后给你修复好的代码。
为什么会出现 TypeError: Cannot read property '0' of undefined?
这个报错和switch的全等半毛钱关系都没有!问题出在数组初始化上:
你声明了空数组cookedArr,但在循环里直接写cookedArr[i][j].push(...)——此时cookedArr[i]根本不存在(是undefined),你试图访问undefined的下标[j],自然就触发了这个错误。另外你内层的for(let j=0;j<3;j++)完全多余,每个碱基只需要生成一组配对,根本不需要循环三次。
先给你修复好的代码,你可以直接用:
function pairElement(str) { let matched = str.match(/[A-Z]/g); // 将字符串拆分为单个碱基的数组 let cookedArr = []; // 存储最终配对结果的数组 for(let i=0; i<matched.length; i++){ // 根据当前碱基生成对应的配对数组,直接推入结果数组 switch(matched[i]){ case 'A': cookedArr.push(['A', 'T']); break; case 'T': cookedArr.push(['T', 'A']); break; case 'C': cookedArr.push(['C', 'G']); break; case 'G': cookedArr.push(['G', 'C']); break; default: // 可选:处理非ATCG的无效字符 cookedArr.push([matched[i], '未知碱基']); } } return cookedArr; } console.log(pairElement("GCG")); // 输出 [['G','C'], ['C','G'], ['G','C']]
疑问1:switch语句如何处理字符串?
switch处理字符串的逻辑和处理数字、布尔值完全一致:它会把switch后面的表达式(这里就是matched[i],一个字符串)和每个case后的值做**全等(===)**比较,一旦找到完全匹配的case,就执行对应的代码块,直到遇到break或者switch语句结束。
举个例子:当matched[i]是字符串'C'时,它会精准匹配case 'C',然后执行cookedArr.push(['C', 'G'])这行代码,之后break跳出switch,不会再往下执行其他case。
疑问2:已知switch使用全等(===)比较,为何代码会出现该错误?
再强调一次:这个报错和switch的全等比较没有任何关系!错误的根源是你在操作未初始化的数组元素——你还没给cookedArr添加任何子数组,就想往子数组里push元素,就像你还没买柜子,就想往柜子的抽屉里放东西一样,肯定会出问题。
switch的全等比较在这里是正常工作的,但还没轮到它发挥作用,代码就因为数组未初始化的问题提前报错了。
内容的提问来源于stack exchange,提问作者blyatscript

