Javascript 比较结果

Javascript 比较结果,javascript,Javascript,我用Javascript声明了两个字符串,如下所示: var str1 = new String('Hello'); var str2 = 'Hello'; 比较结果: str1 == str2 // true str1 === str2 // false 我的问题是,当两个字符串的值相等并且具有相同的字符串类型时,===为什么会屈服于false。这是两种不同的类型 为更清楚起见,以下是: 作为基本体的六种数据类型: 布尔值 空的 未定义 数 串 符号(ECMAScript 6中新增)

我用Javascript声明了两个字符串,如下所示:

var str1 = new String('Hello');
var str2 = 'Hello';
比较结果:

str1 == str2 // true
str1 === str2 // false

我的问题是,当两个字符串的值相等并且具有相同的
字符串类型时,
===
为什么会屈服于false。这是两种不同的类型

为更清楚起见,以下是:

  • 作为基本体的六种数据类型:
    • 布尔值
    • 空的
    • 未定义
    • 符号(ECMAScript 6中新增)
  • 和对象
当使用
==
进行比较时,一个对象只等于它自己(因此既不等于原始值,也不等于另一个相同的对象)

当使用
=
进行比较时,EcmaScript会跟随,它调用String对象上的
toString
方法


通常没有理由显式使用字符串对象(每次代码需要对象并传递字符串时,您都会隐式使用它们,但JS引擎会为您处理升级)。您几乎应该始终坚持使用基本字符串。

您正在将字符串对象基本字符串进行比较。这是两种不同的类型

为更清楚起见,以下是:

  • 作为基本体的六种数据类型:
    • 布尔值
    • 空的
    • 未定义
    • 符号(ECMAScript 6中新增)
  • 和对象
当使用
==
进行比较时,一个对象只等于它自己(因此既不等于原始值,也不等于另一个相同的对象)

当使用
=
进行比较时,EcmaScript会跟随,它调用String对象上的
toString
方法

通常没有理由显式使用字符串对象(每次代码需要对象并传递字符串时,您都会隐式使用它们,但JS引擎会为您处理升级)。您几乎应该始终坚持使用基本字符串。

因为

typeof new String('Hello') === 'object'

前者是对象,后者是原语

=
检查之所以有效,是因为
String
对象也有
toString
方法,JS在这种情况下(以及与其他字符串连接时)调用该方法。

因为

typeof new String('Hello') === 'object'

前者是对象,后者是原语


=
检查之所以有效,是因为
String
对象也有
toString
方法,JS在这种情况下(以及与其他字符串连接时)调用该方法。

字符串对象不是基元字符串,因此使用
==
不会完全相等。 相反,如果您坚持使用
==
,您可以使用
valueOf
函数,如:

new String("hello").valueOf() === str2

字符串对象不是基本字符串,因此使用
==
不能完全相等。 相反,如果您坚持使用
==
,您可以使用
valueOf
函数,如:

new String("hello").valueOf() === str2

我想补充一点,即
var a=new String(“Hello”)
var b=new String(“Hello”)
也不是
===
,即
a====b//当然返回false
@Mortz,因为每个对象实例都有自己的指针/内存地址。就像
{}=={}
给假“是”。我只是想向OP指出(而不是添加一个单独的答案来指出这一点),仅仅因为两个对象具有相同的“值”并不意味着它们是“相同的”:)我想添加一条警告,即
var a=new String(“Hello”)
var b=new String(“Hello”)
也不是
=
,也就是说,
a===b//当然返回false
@Mortz,因为每个对象实例都有自己的指针/内存地址。就像
{}=={}
给假“是”。我只是想向OP指出(并不是为这一点添加单独的答案),仅仅因为两个对象具有相同的“值”,并不意味着它们是“相同的”: