当我在控制台中编写new Array(new Number(3))
时,它将生成一个长度为1的数组,该项目是一个Number
= 3的valueOf
对象。为什么数组构造函数将new Number(3)
与原始版本3
不同?
Array
行为的标准文档吗?谢谢!
答案 0 :(得分:2)
如果传递给Array构造函数的唯一参数是整数 在0到2 32 -1(包括)之间,这将返回一个新的JavaScript数组 并将其length属性设置为该数字
new Number(3)
的实例不是整数(数字)。
Number.isInteger(3) // -> true
Number.isInteger(Number(3)) // -> true
Number.isInteger(new Number(3)) // -> false
答案 1 :(得分:2)
由于在new Array(new Number(3))
中,参数new Number(3)
返回object
而不是number
。
在new Array(Number(3))
的情况下,Number(3)
将返回数字3。
感谢@Andreas' comment,这是规范:ECMAScript 22.1.1.2 Array (len)
第7步:“如果Type(len)不是Number,则
- 让defineStatus为CreateDataProperty(array,“ 0”,len)。
- 声明:defineStatus为true。
- 让intLen为1。
答案 2 :(得分:1)
从JavaScript控制台:
> typeof(3)
"number"
> typeof(new Number(3))
"object"
以下两个产品单元素数组:
new Array(new Number(3))
new Array(new Date())
因为您传递的是object
,而不是number
。
(这不是直接回答您的问题,但希望在任何情况下都能使您清楚。)
答案 3 :(得分:0)
数组可以采用代表其元素的n个参数,也可以采用带有数组长度(syntax)的数字。
新数组(element0,element1 [,... [,elementN]])
elementN 使用给定的元素初始化JavaScript数组, 除非将单个参数传递给数组 构造函数,该参数是一个数字(请参见arrayLength 参数如下)。请注意,此特殊情况仅适用于 使用Array构造函数而不是array创建的JavaScript数组 用方括号语法创建的文字。
新 Array(arrayLength)
arrayLength (如果只有) 传递给Array构造函数的参数是介于0和之间的整数 232-1(含),将返回其长度的新JavaScript数组 属性设置为该数字(注意:这暗示着一个数组 arrayLength空插槽,而不是具有实际未定义值的插槽)。如果 该参数是任何其他数字,会引发RangeError异常。
如果控制台记录以下值,您将看到new Number(3);
不是整数。
typeof 3
"number"
typeof Number(3)
"number"
typeof new Number(3)
"object"
由于new Number(3)
是一个对象,它认为您正在传递数组的第一个元素的elementN场景。
但是,如果您使用new Array(Number(3));
,则可以使用,因为Number(3)
是数字类型。
您还可以参考新Number()(syntax)的定义:
值
正在创建的对象的数值。
很明显,它从这个解释中返回一个对象。当您执行Number(x)时,会发生类型转换:
在非构造函数上下文中(即,没有new运算符),Number可用于执行类型转换。
这解释了为什么Number(3)可以正常工作,因为它将3(或“ 3”)强制转换为数字。
console.log(typeof 3); // number
console.log(typeof Number(3)); // number
console.log(typeof Number("3")); // number
console.log(typeof new Number(3)); // object
console.log(new Array(3)); // [,,]
console.log(new Array(Number(3))); // [,,]
console.log(new Array(Number("3"))); // [,,]
console.log(new Array(new Number(3))); // [{}]
答案 4 :(得分:0)
因为new Number()
是一个创建类型为Number
的对象的构造函数。如果使用带有对象的构造函数new Array()
初始化数组,它将成为该数组的成员。如果使用带有数字值的构造函数new Array()
初始化数组,则会创建该大小的空数组。
只需在控制台中输入
var n = new Number(3);
您获得的类型为Number
的对象的原始值为3,这不同于
var n = 3;