Javascript 使用构造函数创建的数字没有作为属性的值,请从构造函数中取消行字符串
为什么我必须访问用构造函数而不是字符串创建的编号的Javascript 使用构造函数创建的数字没有作为属性的值,请从构造函数中取消行字符串,javascript,Javascript,为什么我必须访问用构造函数而不是字符串创建的编号的[[PrimitiveValue]]属性: 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
[[PrimitiveValue]]
属性:
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]])
抛出错误。在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
=
表示“严格平等”。也就是说,它们是相等的,不需要任何类型转换
=
测试是否相等,但允许在必要时进行类型转换。发件人:
如果两个操作数的类型不同,JavaScript将转换操作数,然后应用严格比较。如果任一操作数是数字或布尔值,则如果可能,将操作数转换为数字
由于
n1
是数字原语,n2
在进行比较之前被转换为数字原语。此数字原语是0
,因此它们相等。您要查找的是n2.valueOf()
。ECMAScript:
返回此数值
其中“该数值”为:
…短语“此数值”指。。。此数字对象表示的数字值,即此数字对象的[[PrimitiveValue]]
内部属性的值
EMCAScript规范中标有[[]]
的属性不是真实的、可编程访问的属性;它们是所谓的帮助描述规范行为的工具:
该规范使用各种内部属性来定义对象值的语义。这些内部属性不是ECMAScript语言的一部分。本规范对它们的定义仅用于说明目的。ECMAScript的实现必须表现为它按照此处描述的方式生成和操作内部属性。内部属性的名称用双方括号[]括起来
我没有得到你从
console.dir(n2)中得到的东西
您可以使用n2.valueOf()代码>获取基本值。。。或者+n2
但是为什么n1==n2
不需要n2.valueOf()==n1.valueOf()
?这是一个很好的答案。非常感谢你。