You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

CodeWars创建Kata时JavaScript测试报Unexpected Token错误求助

解决CodeWars Kata的Node.js语法错误问题

嘿,我明白你这会儿的困扰——代码在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

这个错误的核心原因有两个:

  1. 初始代码里的<script>标签:浏览器里的JS是放在<script>标签里执行,但Node.js是后端JS环境,完全不认识这个HTML语法标签。当CodeWars用Node环境eval你的代码时,遇到<script>直接就触发语法错误了——哪怕你后来换成for循环,如果粘贴代码时不小心带了残留的标签或格式,也会出问题。
  2. 测试调用代码的位置不对: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的正确姿势

  1. 只提交上面的birdCode函数代码,不要加<script>标签,也不要加测试调用语句。
  2. 测试用例单独放在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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:03:14