Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/367.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 使用构造函数创建的数字没有作为属性的值,请从构造函数中取消行字符串_Javascript - Fatal编程技术网

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()
?这是一个很好的答案。非常感谢你。