像这样声明一个数组的真正区别是什么:
var myArray = new Array();
and
var myArray = [];
像这样声明一个数组的真正区别是什么:
var myArray = new Array();
and
var myArray = [];
当前回答
正如我所知道的区别,你可以找到切片(或数组的其他函数),如code1。和代码2显示u数组和他的实例:
code1:
[].slice; // find slice here
var arr = new Array();
arr.slice // find slice here
Array.prototype.slice // find slice here
code2:
[].__proto__ == Array.prototype; // true
var arr = new Array();
arr.__proto__ == Array.prototype; // true
结论:
如你所见[]和new Array()创建一个Array的新实例。它们都从array。prototype中获得原型函数
它们只是数组的不同实例。这就解释了为什么 [] != []
:)
其他回答
我在使用[]时出现了奇怪的行为。
我们有模型“类”,字段初始化为一些值。例如:
require([
"dojo/_base/declare",
"dijit/_WidgetBase",
], function(declare, parser, ready, _WidgetBase){
declare("MyWidget", [_WidgetBase], {
field1: [],
field2: "",
function1: function(),
function2: function()
});
});
我发现当字段用[]初始化时,它将被所有Model对象共享。对其中一项进行更改会影响所有其他项。
用new Array()初始化它们时不会发生这种情况。对象的初始化也是一样({}vs new Object())
TBH我不确定这是否是我们使用的框架(Dojo)的问题
有一个重要的区别,目前还没有答案提到。
从这个:
new Array(2).length // 2
new Array(2)[0] === undefined // true
new Array(2)[1] === undefined // true
你可能认为新的Array(2)等同于[undefined, undefined],但事实并非如此!
让我们尝试使用map():
[undefined, undefined].map(e => 1) // [1, 1]
new Array(2).map(e => 1) // "(2) [undefined × 2]" in Chrome
看到了吗?语义完全不同!为什么呢?
根据ES6 Spec 22.1.1.2, Array(len)的任务只是创建一个新数组,其属性长度设置为参数len,这就意味着在这个新创建的数组中没有任何实际元素。
函数map(),根据规范22.1.3.15将首先检查HasProperty然后调用回调,但结果是:
new Array(2).hasOwnProperty(0) // false
[undefined, undefined].hasOwnProperty(0) // true
这就是为什么你不能期望任何迭代函数像往常一样在new Array(len)创建的数组上工作。
顺便说一句,Safari和Firefox在这种情况下有更好的“打印”:
// Safari
new Array(2) // [](2)
new Array(2).map(e => 1) // [](2)
[undefined, undefined] // [undefined, undefined] (2)
// Firefox
new Array(2) // Array [ <2 empty slots> ]
new Array(2).map(e => 1) // Array [ <2 empty slots> ]
[undefined, undefined] // Array [ undefined, undefined ]
我已经向Chromium提交了一个问题,并要求他们修复这个令人困惑的打印: https://bugs.chromium.org/p/chromium/issues/detail?id=732021
更新:已经修复了。Chrome现在打印为:
new Array(2) // (2) [empty × 2]
使用Array构造函数创建一个所需长度的新数组,并将每个下标填充为undefined,将赋值给变量one的数组创建您为其提供信息的下标。
第一个是默认的对象构造函数调用。主要用于动态值。
var array = new Array(length); //initialize with default length
第二个数组用于创建静态值
var array = [red, green, blue, yellow, white]; // this array will contain values.
奇怪的是,new Array(size)几乎比Chrome中的[]快2倍,在FF和IE中也差不多(通过创建和填充数组来衡量)。只有知道数组的大致大小才重要。如果添加的项比给定的长度多,性能提升就会丧失。
更准确地说:Array(是一个不分配内存的快速常量时间操作,而[]是一个设置类型和值的线性时间操作。