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
}
4

3 回答 3

7

我认为Object.prototype.toString.call(a) === "[object String]"是这样做的最短/最原始的方式

于 2012-09-03T23:08:10.107 回答
1

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

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

一个更重要的问题是,为什么一个isString函数应该对字符串原语和字符串对象都返回 true?字符串对象的使用(非常?)很少见,我原以为它们的使用会推断出特殊处理,并且您希望区分两者而不是相同对待它们。

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

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

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

于 2012-09-04T02:09:44.253 回答
1

你是对的:

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

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

于 2012-09-03T23:25:18.720 回答