检查变量是否为字符串的简便方法?

时间:2012-09-03 23:00:17

标签: javascript string

这个问题是[] is an instance of Array but "" isn't of String

的副产品

鉴于此

"" instanceof String; /* false */
String() instanceof String; /* false */
new String() instanceof String; /* true */

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

然后,如果我有一个变量abc并且我想知道它是否是一个字符串,我可以做

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

是否有更简单,更短和本地的方法,或者我必须创建自己的功能吗?

function isStr(s){
    return typeof s === "string" || s instanceof String;
}
if(isStr(abc)){
    // do something
}

3 个答案:

答案 0 :(得分:7)

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

答案 1 :(得分:1)

你是对的:

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

是检查变量是否为字符串的best ways之一。

答案 2 :(得分:1)

您可能会感到困惑,因为[]array initialiser(通常称为数组文字),定义为创建数组对象,而''string literal定义为创建字符串原语

基元不是任何类型对象的实例,但为方便起见,它可能会被强制转换为相关对象。

一个更重要的问题是为什么isString函数应该对字符串基元和字符串对象都返回true?字符串对象的使用是(极其?)罕见,我会认为它们的使用会推断出特殊处理,并且你想要区分它们并且不要对它们进行相同的处理。

忽略变量的类型更为常见,并且在其类型可能不同的情况下,无条件地将其转换为所需的类型,例如,如果你想要一个字符串原语:

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

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