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

如何适配String.prototype.capitalize处理null、undefined及空字符串

错误原因

你目前只在String.prototype上挂载了capitalize方法,只有字符串类型的值才能访问到该方法。undefined和null不属于字符串类型,原型链上也没有挂载这个方法,直接调用undefined.capitalize()自然会抛出「无法读取undefined的capitalize属性」的类型错误。
另外你修改后的逻辑也不满足空格字符串调用返回空的要求:" ".capitalize()执行后会返回" ",空格属于真值,走不到|| ""的分支。

推荐解决方案:使用独立工具函数(不污染原生原型)

最稳妥的实现方式是写独立的工具方法,不要修改原生原型避免全局污染,代码如下:

function capitalize(target) {
  // 先处理null、undefined、非字符串、全空格场景
  if (target == null || typeof target !== 'string' || target.trim() === '') {
    return ''
  }
  return target.charAt(0).toUpperCase() + target.slice(1)
}

调用方式和返回结果完全符合你的要求:

  • capitalize(" ") 返回 ""
  • capitalize(undefined) 返回 ""
  • capitalize(null) 返回 ""
  • 普通字符串调用:capitalize("hello") 返回 "Hello"

不推荐方案:挂载到Object.prototype(仅满足链式调用写法)

如果你一定要保留xxx.capitalize()的调用形式,只能将方法挂载到Object.prototype上,但该方案会污染全局对象原型,可能引发很多不可预期的问题,生产环境不建议使用。而且即使这么修改,也无法直接调用undefined.capitalize()、null.capitalize(),因为这两个原始值无法被自动装箱为包装对象,还是会抛出类型错误,只有工具函数的方案能完美适配所有要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.05 20:57:00