为什么我必须访问使用构造函数创建的 Number 的[[PrimitiveValue]]
属性,而不是String:
var n1 = 0;
var n2 = new Number(0);
console.log(n1);
console.dir(n2); //only the [[PrimitiveValue]] contains 0:"t", 1:"e", 2:"s", 3:"t"
console.log(n1 == n2) //true
var s1 = "test";
var s2 = new String("test");
console.log(s1);
console.dir(s2); //[PrimitiveValue]] contains "test", but there are also the 4 propeties
console.log(s1 == s2); //true
另外如何访问该值?:console.log(s2[[PrimitiveValue]]);
会抛出错误。
答案 0 :(得分:1)
在Javascript中,访问对象原始值的方式是X.prototype.valueOf
,其中X
是对象类型。
所以,例如:
var n1 = 0;
var n2 = new Number(0);
console.log(n2.valueOf()); // logs 0
console.log(n2.valueOf() === n1); // logs true
对于字符串和其他类型的对象也是如此。请注意,自定义对象不会以相同的方式实现此功能,或者甚至可能实现此功能。
你也问你的问题为什么n1 == n2
。首先,请注意n1 === n2
返回false
。
===
表示“严格平等”。也就是说,它们是平等的,不需要任何类型转换。
==
测试是否相等,但允许在必要时进行类型转换。来自the MDN docs:
如果两个操作数的类型不同,JavaScript会转换操作数,然后应用严格的比较。如果操作数是数字或布尔值,操作数将尽可能转换为数字;
由于n1
是数字基元,因此在完成比较之前,n2
将转换为数字基元。这个数字原语是0
,所以它们是相等的。
答案 1 :(得分:0)
您正在寻找n2.valueOf()
。 ECMAScript spec says about valueOf
:
返回此Number值。
其中"此数字值"是described previously:
......短语"此数字值"指...此Number对象表示的Number值,即此Number对象的
[[PrimitiveValue]]
内部属性的值...
标有[[ ]]
的EMCAScript规范中的属性不是真实的,可通过编程方式访问的属性;它们是所谓的"internal" properties,有助于描述规范的行为:
此规范使用各种内部属性来定义对象值的语义。这些内部属性不是ECMAScript语言的一部分。它们仅由出于说明目的而由本规范定义。 ECMAScript的实现必须表现得就像它以此处描述的方式在内部属性上生成和操作一样。内部属性的名称用双方括号[[]]括起来。