CodeWars创建Kata时JavaScript测试报Unexpected Token错误求助
嘿,我明白你这会儿的困扰——代码在IE和Chrome里跑都没问题,偏偏到CodeWars的Node.js环境就报Unexpected Token错误,哪怕把forEach和map换成for循环也没搞定。让我帮你拆解下问题根源:
为什么会出现这个错误?
先看你贴的报错信息:
[eval]:59 }); ^ SyntaxError: Unexpected token ) at createScript (vm.js:56:10) at Object.runInThisContext (vm.js:97:10) at Object.
([eval]-wrapper:6:22) at at evalScript (bootstrap_node.js:353:27) at run (bootstrap_node.js:122:11) at run (bootstrap_node.js:389:7) at startup (bootstrap_node.j
这个错误的核心原因有两个:
- 初始代码里的
<script>标签:浏览器里的JS是放在<script>标签里执行,但Node.js是后端JS环境,完全不认识这个HTML语法标签。当CodeWars用Node环境eval你的代码时,遇到<script>直接就触发语法错误了——哪怕你后来换成for循环,如果粘贴代码时不小心带了残留的标签或格式,也会出问题。 - 测试调用代码的位置不对:CodeWars的Kata解决方案区只需要你提交核心函数
birdCode,测试用例要放在专门的Test Cases面板里,不能和函数写在一起。虽然测试调用本身语法没问题,但混在函数代码里可能在CodeWars的eval流程里触发意外解析问题。
另外我检查了你修改后的for循环代码,还发现一个逻辑小问题:三字名称的处理里,你在内部for循环里每次都重置str并累加nameBuild,会导致重复拼接,这也可能影响结果正确性。
修正后的可提交代码
我帮你整理了纯净的函数代码,去掉了所有浏览器专属语法,还修正了逻辑问题,确保能在Node环境正常运行:
function birdCode(arr){ var matchArr = []; var str = ""; var arrReturn = []; for(var i = 0; i < arr.length; i++){ str = ""; // 把连字符替换为空格并转大写 const birdName = arr[i].replace("-", " ").toUpperCase(); if(!/\s/.test(birdName)){ // 单字名称:取前四位 arrReturn.push(birdName.slice(0, 4)); } else if(birdName.match(/\s/g).length === 1){ // 双字名称:每个单词取前两位 const [first, second] = birdName.split(" "); arrReturn.push(first.slice(0,2) + second.slice(0,2)); } else if(birdName.match(/\s/g).length === 2){ // 三字名称:前两个单词首字母+第三个单词前两位 const [first, second, third] = birdName.split(" "); arrReturn.push(first[0] + second[0] + third.slice(0,2)); } else if(birdName.match(/\s/g).length === 3){ // 四字名称:每个单词首字母 const nameParts = birdName.split(" "); const code = nameParts.map(part => part[0]).join(""); arrReturn.push(code); } } return arrReturn; }
我还把原来的正则匹配逻辑改成了更直观的字符串拆分,不仅可读性更高,也减少了正则可能带来的意外问题,完全符合你给出的Kata规则:
- 单字取前四位
- 双字各取前两位
- 三字前两个首字母+第三个前两位
- 四字各取首字母
- 连字符转空格,结果大写
提交到CodeWars的正确姿势
- 只提交上面的
birdCode函数代码,不要加<script>标签,也不要加测试调用语句。 - 测试用例单独放在CodeWars Kata设置的「Test Cases」区域,示例如下:
describe("Bird Code Conversion", function() { it("should pass sample inputs", function() { Test.assertDeepEquals(birdCode(["American Redstart", "Northern Cardinal", "Pine Grosbeak", "Barred Owl", "Starling", "Cooper's Hawk", "Pigeon"]), ["AMRE", "NOCA", "PIGR", "BAOW", "STAR", "COHA", "PIGE"]); Test.assertDeepEquals(birdCode(["Great Crested Flycatcher", "Bobolink", "American White Pelican", "Red-Tailed Hawk", "Eastern Screech Owl", "Blue Jay"]), ["GCFL", "BOBO", "AWPE", "REHA", "ESOW", "BLJA"]); // 其他测试用例依次添加 }); });
这样操作后,Node.js环境的语法错误应该就彻底解决了,代码也能正确执行所有转换逻辑~
内容的提问来源于stack exchange,提问作者user9209408

