为什么(“foo”=== new String(“foo”))在JavaScript中计算为false?

在比较string值的时候,我会一直使用===(triple equals,严格比较),但是现在我发现了

"foo" === new String("foo") 

是虚假的,与此相同:

 var f = "foo", g = new String("foo"); f === g; // false 

当然:

 f == g; // true 

所以build议总是使用==来进行string比较,或者在比较之前总是将variables转换为string?

"foo"是一个string原语 。 (这个概念在C#或Java中不存在)

new String("foo")是盒装string对象。

===运算符在基元和对象上的行为不同 。
比较原始types(相同types)时, ===将返回true,如果它们都具有相同的值。

比较对象时,只有当它们引用同一个对象(通过引用进行比较)时, ===才会返回true。 因此, new String("a") !== new String("a")

在你的情况下, ===返回false,因为操作数是不同的types(一个是原语,另一个是对象)。


原语根本不是物体。
typeof运算符不会返回基元的"object"

当你尝试访问一个原语的属性(使用它作为一个对象)时,Javascript语言将把它包装到一个对象中,每次创build一个新的对象。 这在说明书中描述。

这就是为什么你不能把属性放在原语上:

 var x = "a"; x.property = 2; alert(x.property) //undefined 

每次写入x.property ,都会创build一个不同的盒装String对象。

使用===

  • 一个对象从来不等于除另一个引用本身以外的任何东西。

  • 如果一个图元的types和值相同,则与另一个图元相比,图元是相等的。

这个new词在这里是一个犯罪分子( 像往常一样 ,我可以说)…

当你使用new ,你明确expression你的愿望与对象工作。 这可能会让你感到惊讶,但这是:

 var x = new String('foo'); var y = new String('foo'); x === y; 

…会给你一个强大的false 。 很简单:比较不是对象的内部,而是对象的引用。 当然,他们是不平等的,因为创造了两个不同的对象。

你可能想要使用的是转换

 var x = String('foo'); var y = String('foo'); x === y; 

…如预期的那样,这会给你带来true结果,所以你可以永远欢喜和兴旺。 )

foo是纯string, new String("foo")是对象string

从node.js REPL(命令行上的“node”,如果已安装):

 > "foo" === (new String("foo")).valueOf() true > "foo" === new String("foo") false > typeof("foo") 'string' > typeof(new String("foo")) 'object' > typeof((new String("foo")).valueOf()) 'string'