Javascript 一个对象怎么可能既是字符串又不是字符串?

Javascript 一个对象怎么可能既是字符串又不是字符串?,javascript,Javascript,我有一个方法的参数,我需要确保它是一个字符串。使用var instanceof String失败,所以我做了一个console.log(var.constructor.name,var instanceof String)并得到以下输出: String false 为什么JavaScript认为构造函数的名称是“代码>字符串”,但不考虑变量是“代码>字符串的实例吗?字符串是一个原语,所以您可以通过使用 Type of < /COD>关键字.< /P>来检查类型。 console.log(typ

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

String false

为什么JavaScript认为构造函数的名称是“代码>字符串”<代码>,但不考虑变量是“代码>字符串的实例吗?

字符串是一个原语,所以您可以通过使用<代码> Type of < /COD>关键字.< /P>来检查类型。
console.log(typeof 'some string')
您可以将其用作:

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

字符串是一个原语,因此可以使用
typeof
关键字检查类型

console.log(typeof 'some string')
您可以将其用作:

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

String
是Javascript中的类/对象。因此
newstring('hello')
返回一个对象,该对象是字符串的
实例

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'
下面是所说的内容,并加上重点

字符串文本(用双引号或单引号表示)和在非构造函数上下文中从字符串调用返回的字符串(即,在不使用new关键字的情况下调用)是基元字符串。JavaScript自动将基元转换为字符串对象,因此可以对基元字符串使用字符串对象方法。在基元字符串上调用方法或进行属性查找的上下文中,JavaScript将自动包装字符串基元并调用该方法或执行属性查找


String
是Javascript中的类/对象。因此
newstring('hello')
返回一个对象,该对象是字符串的
实例

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'
下面是所说的内容,并加上重点

字符串文本(用双引号或单引号表示)和在非构造函数上下文中从字符串调用返回的字符串(即,在不使用new关键字的情况下调用)是基元字符串。JavaScript自动将基元转换为字符串对象,因此可以对基元字符串使用字符串对象方法。在基元字符串上调用方法或进行属性查找的上下文中,JavaScript将自动包装字符串基元并调用该方法或执行属性查找


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

现在,如果
var
(它不是有效的标识符)确实是一个基本字符串,那么执行
var.constructor.name
将使用一个中间值,该值是
string
对象(通常称为自动装箱)。这将是
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'

但是,当使用
instanceof
时,没有“自动装箱”。因此,从来没有对象。因此,没有任何构造函数的实例。

instanceof
尝试在对象(左侧操作数)中查找构造函数(右侧操作数)原型(如
prototype
属性中所示)原型链。如果左手操作符不是一个对象,那么它并没有被任何构造函数实例化,所以任何不是对象的左手操作符都会返回false

现在,如果
var
(它不是有效的标识符)确实是一个基本字符串,那么执行
var.constructor.name
将使用一个中间值,该值是
string
对象(通常称为自动装箱)。这将是
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'

但是,当使用
instanceof
时,没有“自动装箱”。因此,从来没有对象。因此,没有任何构造函数的实例。

关于
instanceof
如何工作的精彩解释。关于
instanceof
如何工作的精彩解释。