为什么(“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'