为什么`new Array(new Number(3))`不产生长度为3的数组?

时间:2018-09-30 17:31:13

标签: javascript

当我在控制台中编写new Array(new Number(3))时,它将生成一个长度为1的数组,该项目是一个Number = 3的valueOf对象。为什么数组构造函数将new Number(3)与原始版本3不同?

  1. 有人可以将我链接到指定了此Array行为的标准文档吗?
  2. 这是我通常需要注意的东西,还是特定于Array构造函数?

谢谢!

5 个答案:

答案 0 :(得分:2)

From the MDN

  

如果传递给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,则

     
      
  1. 让defineStatus为CreateDataProperty(array,“ 0”,len)。
  2.   
  3. 声明:defineStatus为true。
  4.   
  5. 让intLen为1。
  6.   

答案 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;