如何适配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
相关产品推荐
相关产品推荐

