为什么它不将 join() 识别为函数?



我正在尝试将给定字符串的每个首字母大写,但是每次运行代码时都会收到以下错误:

TypeError: val[i].charAt(...).到大写(...)。联接不是函数

function titleCase(str) {
var strArry = str.toLowerCase().split(' ');
strArry.map(function (val) {
    for (var i = 0; i < val.length; i++) {
        return val[i].charAt(0).toUpperCase().join(' ') + strArry[i].splice(1);
    };
  });
}
titleCase("I'm a little tea pot");

>String.protoype.toUpperCase()返回一个字符串,Array.prototype.join()在数组原型上,而不是字符串上。

你可能想要这样的东西...

return val[i].charAt(0).toUpperCase() + val[i].slice(1);

。甚至可能更好(至少更短)...

function titleCase(str) {
    return str.replace(/b[a-z]/g, function(match) { return match.toUpperCase(); });
}

在这里,我使用正则表达式来匹配单词边界后的第一个小写字母,然后使用自定义替换器将其返回大写。

如果您支持的不仅仅是拉丁语,请使用 Unicode 范围来选择字符。

toUpperCase返回一个Stringjoin不是该原型上的方法。

如果你运行代码并在处理字符串之前进行typeof检查,你可以看到:

function titleCase(str) {
  var strArry = str.toLowerCase().split(' ');
  strArry.map(function (val) {
    for (var i = 0; i < val.length; i++) {
      var temp = val[i].charAt(0).toUpperCase();
      console.log(typeof temp);
      return temp;
    };
  });
}
titleCase("I'm a little tea pot");

您需要在映射Arrayjoin以生成最终的组合值。

我提出了这段运行良好的简短代码:

 var titleCase = (str) => str.split(" ").map(el => el[0].toUpperCase().concat(el.substr(1))).join(" ");
 console.log(titleCase("I'm a little tea pot"));

通过一些研究弄清楚了,发现使用 val 与我一起尝试使用 mpa()

function titleCase(str) {
  var strArry = str.toLowerCase().split(' ');
  var convert = strArry.map(function(val) {
    return val.replace(val.charAt(0), val.charAt(0).toUpperCase());
  });
  return convert.join(' ');
}
titleCase("I'm a little tea pot");
我不

熟悉Javascript,这就是为什么我不知道它是否在char和string之间有区别。

我很确定你的意思是做一件完全不同的事情,即返回一个由大写字母连接的字符串。然而,你在这里(尝试)做的是在你的 for 循环的第一个循环之后返回你的表达式的结果 (val[i].andsoonandsoforth)。

表达式不起作用的原因是 join(string) 通常在字符串或字符数组上调用。但是,您是在单个字符上调用它!

解决方案是首先将 uf 字符串拆分为字符,将它们大写,将它们存储到一个数组中,在该数组上调用 join 然后返回该内容。

或者只是在字符串上使用可能存在的内置大写函数。

最新更新