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

为何toUpperCase()会将空格识别为匹配项?spinal case转换代码疑问

你的问题出在判断条件上——空格的toUpperCase()结果还是空格,所以newStr[i] === newStr[i].toUpperCase()这个条件对空格来说也成立,自然会把空格当成大写字母替换成-。

要解决这个问题,首先得先判断当前字符是大写字母,而不是只要等于自身大写就处理。另外你的逻辑还存在两个漏洞:第一个字符如果是大写会被替换成-,导致结果开头多符号;同时没处理转小写和其他分隔符(比如下划线)的情况。

给你两种修正方案:

方案一:修复原有循环逻辑

function spinalCase(str) {
  let newStr = str.split("");
  for (let i = 0; i < newStr.length; i++) {
    // 只匹配大写字母,且不是第一个字符
    if (newStr[i].match(/[A-Z]/) && i !== 0) {
      // 在大写字母前插入-,并把大写字母转小写
      newStr.splice(i, 1, "-", newStr[i].toLowerCase());
      // 插入字符后索引跳一位,避免重复处理
      i++;
    } else if (newStr[i].match(/[A-Z]/)) {
      // 第一个字符是大写,直接转小写
      newStr[i] = newStr[i].toLowerCase();
    } else if (newStr[i] === " " || newStr[i] === "_") {
      // 把空格或下划线替换成-
      newStr[i] = "-";
    }
  }
  return newStr.join("");
}

console.log(spinalCase('This Is Spinal Tap')); // 输出 "this-is-spinal-tap"

方案二:用正则简洁实现

正则可以一次性处理所有分隔符和大写字母的情况:

function spinalCase(str) {
  return str
    .replace(/(^[A-Z])|[\s_]|([A-Z])/g, (match, firstCap, upperCase) => {
      if (firstCap) return firstCap.toLowerCase();
      if (upperCase) return "-" + upperCase.toLowerCase();
      return "-";
    });
}

console.log(spinalCase('This Is Spinal Tap')); // 输出 "this-is-spinal-tap"

内容的提问来源于stack exchange,提问作者user20762759

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 20:30:41