【问题标题】:Easy way to check if a variable is a string?检查变量是否为字符串的简单方法?
【发布时间】:2012-08-28 14:31:46
【问题描述】:

这个问题是[] 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
}

【问题讨论】:

  • 您真的在代码中使用new String() 还是只是一个理论问题?
  • 他可能不得不处理其他人的代码,只是想确保在不阅读(甚至无法访问)所有代码的情况下捕获所有 String 类型。
  • @zerkms 这是一个理论问题。但如果两个程序员一起工作,一个使用"",另一个使用new String(),这可能是一个实际问题。
  • jQuery 在检查传入参数的类型时只使用typeof s === "string"。我怀疑这通常可以正常工作,因为很少有人从new String() 显式编码字符串对象。

标签: javascript string


【解决方案1】:

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

【讨论】:

  • ( foo.constructor == String ) 会不会更干净?这两种情况似乎都对我有用,但我还没有在所有引擎中测试过
【解决方案2】:

你是对的:

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

best ways 之一,用于检查变量是否为字符串。

【讨论】:

    【解决方案3】:

    您可能会感到困惑,因为[] 是一个array initialiser(通常称为数组字面量),它被定义为创建一个数组对象,而'' 是一个string literal,即定义为创建一个字符串primitive

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

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

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

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

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

    【讨论】:

    • 当我想到一个根据参数类型执行不同操作的函数时,我想到了这个问题。
    • 所以现在你走上了 isFunctionisObject 等函数的老路。 :-) Javascript 的丢失类型意味着此类测试只能在有限的情况下工作,因此请记录限制并继续前进。
    猜你喜欢
    • 2012-07-13
    • 2023-04-09
    • 2011-12-28
    • 2010-09-27
    • 1970-01-01
    • 2020-05-28
    • 2012-04-13
    • 1970-01-01
    • 2011-01-27
    相关资源
    最近更新 更多