【问题标题】:How can a object both be a string and not be a string? [duplicate]一个对象如何既是字符串又不是字符串? [复制]
【发布时间】:2021-03-28 17:43:47
【问题描述】:

我有一个方法的参数,我需要确保它是一个字符串。使用var instanceof String 失败了,所以我做了一个console.log(var.constructor.name, var instanceof String 并得到了这个输出:

String false

为什么 JavaScript 认为构造函数的名称是 'String',但不认为变量是 String 的实例?

【问题讨论】:

    标签: javascript


    【解决方案1】:

    instanceof 尝试在对象(左手操作数)原型链中找到构造函数(右手操作数)原型(如在prototype 属性中)。如果左手运算符不是对象,那么它并没有真正被任何构造函数实例化,因此任何不是对象的左手运算符都会返回 false。

    现在,如果var(它不是一个有效的标识符)确实是一个原始字符串,那么执行var.constructor.name 将使用一个中间值,即String 对象(通常称为自动装箱)。那将是String 的一个实例。

    但是在使用instanceof 时没有“自动装箱”。因此永远不是一个对象。因此不是任何构造函数的实例。

    【讨论】:

    • 很好地解释了instanceof 的工作原理。
    【解决方案2】:

    String 是一个原始类型,因此您可以使用 typeof 关键字检查类型。

    console.log(typeof 'some string')
    

    您可以将其用作:

    if (typeof variable === 'string') {
      // the `variable` is definitely a string.
    }
    

    【讨论】:

      【解决方案3】:

      String 是 Javascript 中的类/对象。所以new String('hello') 返回一个对象,它是一个instanceof String

      let x = 'hello'
      typeof x === 'string' // returns true
      x instanceof String  // returns false
      x.constructor.name // returns 'String'
      
      let y = new String('a')
      typeof y === 'string' // returns false
      y instanceof String  // returns true
      y.constructor.name // returns 'String'
      

      这是String object - MDN上的内容,重点添加了

      字符串字面量(用双引号或单引号表示)和从非构造函数上下文中的 String 调用返回的字符串(即不使用 new 关键字调用)是原始字符串。 JavaScript 自动将原语转换为 String 对象,因此可以将 String 对象方法用于原语字符串。在要对原始字符串调用方法或发生属性查找的上下文中,JavaScript 将自动包装字符串原始并调用方法或执行属性查找。

      【讨论】:

        猜你喜欢
        • 2012-01-02
        • 2012-08-12
        • 1970-01-01
        • 1970-01-01
        • 2011-07-05
        • 2023-04-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多