本文探讨JavaScript中判断字符串存在与非空的多种方法。针对new String()创建的对象,typeof返回object,需结合valueOf()获取原始值进行准确类型判断,从而避免将null、数组或普通对象误判为字符串。
字符串存在与非空判断的常见误区
面对这一需求,常见的思路是先通过typeof检查类型,再验证length属性。
if(typeof unknownVariable ==='string' && unknownVariable.length){
...
}
这种方法是否足够完善?
new String()对象的类型检测问题
若字符串由new String()构造,typeof检测结果将显示为object。此时需先确认类型是否为object,但需注意null的typeof值同样为object,因此还需额外判断变量是否存在。即便确认为非空对象,由于typeof为object的变量可能是数组、JSON对象或其他自定义对象,仅凭此无法确定其是否为字符串。
利用valueOf获取原始类型值
此时可引入较少使用但关键的valueOf方法,该方法能返回变量的原始类型值。
let str1="test"
let str2=new String('test2')
let arr1=[1,2,3]
let fn1=function(){
console.log('this is a function')
}
let obj1={
name:'gpd'
}
let obj2=new Object()
obj2.name='gpd'
str1.valueOf() // "test"
str2.valueOf() //"test2"
arr1.valueOf() //[1,2,3]
fn1.valueOf() //fn1(){}
obj1.valueOf() // {name:"gpd"}
obj2.valueOf() // {name:"gpd"}
无论字符串是字面量形式还是通过new String()生成的对象,调用valueOf()后均返回字符串字面量,且其typeof值均为string。
完整的字符串判断逻辑
因此,最终的判断逻辑应基于此原理构建。
if(typeof unknownVariable !=undefined
&& unknownVariable
&& typeof unknowVariable.valueOf() === "string")
{
...
}