关于javascript:检查变量是否为字符串的简单方法?

Easy way to check if a variable is a string?

此问题是对以下项的派生:[]是数组的实例,但"不是字符串"

鉴于此

1
2
3
"" instanceof String; /* false */
String() instanceof String; /* false */
new String() instanceof String; /* true */

1
2
3
typeof"" ==="string"; /* true */
typeof String() ==="string"; /* true */
typeof new String() ==="string"; /* false */

那么,如果我有一个变量abc,我想知道它是否是一个字符串,我可以这样做。

1
2
3
if(typeof abc ==="string" || abc instanceof String){
    // do something
}

有没有一种更简单、更简短、更本土化的方法,或者我必须创建自己的函数?

1
2
3
4
5
6
function isStr(s){
    return typeof s ==="string" || s instanceof String;
}
if(isStr(abc)){
    // do something
}


我认为Object.prototype.toString.call(a) ==="[object String]"是最短的/最本土化的方法


您可能会感到困惑,因为[]是一个数组初始化器(通常称为数组文字),定义为创建数组对象,而''是一个字符串文字,定义为创建字符串原语。

基元不是任何类型对象的实例,尽管为了方便起见,它可能被强制到相关对象。

更重要的问题是,为什么对于字符串原语和字符串对象,isString函数都应该返回true?字符串对象的使用是(非常?)很少见,我会认为他们的使用会推断出特殊的治疗方法,你会想区分这两种方法,而不是同样对待它们。

更常见的情况是忽略变量的类型,如果变量的类型可能不同,则无条件地将其转换为所需的类型,例如,如果需要字符串原语:

1
2
3
4
function foo(s) {
  s = String(s); // s is guaranteed to be a string primitive
  ...
}

例外情况是,函数被重载,并且根据特定参数是函数、对象还是其他参数,具有不同的行为。这种重载通常被认为不是一个好主意,但许多JavaScript库都依赖于它。在这些情况下,传递字符串对象而不是字符串原语可能会产生意想不到的结果。


你是对的:

1
typeof myVar == 'string' || myVar instanceof String;

是检查变量是否为字符串的最佳方法之一。