如何简单地检查一个变量是否为字符串?

6
这个问题是从 [] 是 Array 的一个实例,但 "" 不是 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
}

你在代码中真的使用new String()吗?还是这只是一个理论问题? - zerkms
1
jQueryеңЁжЈҖжҹҘдј е…ҘеҸӮж•°зҡ„зұ»еһӢж—¶еҸӘдҪҝз”Ёtypeof s === "string"гҖӮжҲ‘жҖҖз–‘иҝҷйҖҡеёёеҸҜд»ҘжӯЈеёёе·ҘдҪңпјҢеӣ дёәеҫҲе°‘жңүдәәдјҡжҳҺзЎ®ең°д»Һnew String()еҲӣе»әдёҖдёӘеӯ—з¬ҰдёІеҜ№иұЎгҖӮ - jfriend00
最简单的方法是清晰地记录您的API以要求原始字符串,然后只需使用typeof。使用instanceof可能会出现罕见但潜在的问题。 - gray state is coming
1
可能是重复的问题:检查变量是否为字符串 - tripleee
显示剩余4条评论
3个回答

7

我认为Object.prototype.toString.call(a) === "[object String]"是最简单/最原始的方法


1
(foo.constructor == String)看起来更加简洁,这样可以吗?对于我的情况似乎都可以工作,但是我没有在所有引擎上进行测试。 - Richard Marr

1

你可能会感到困惑,因为[]是一个数组初始化器(通常称为数组字面量),它被定义为创建一个Array对象,而''是一个字符串字面量,它被定义为创建一个字符串原始值

原始值不是任何类型的实例,尽管它可以被强制转换为相关的对象以方便使用。

更重要的问题是为什么isString函数应该对字符串原始值和字符串对象都返回true?字符串对象的使用非常罕见,我认为它们的使用应该会产生特殊的处理方式,而且你希望区分这两者并且不将它们视为相同的。

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

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

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


当我在思考一个函数根据参数类型执行不同操作的时候,这个问题恰好浮现在我的脑海中。 - Oriol
现在你要走的是函数的老路,比如 isFunctionisObject 等等。:-) Javascript 的松散类型意味着这些测试只能在有限的情况下起作用,因此记录限制并继续前进。 - RobG

1

你是正确的:

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接