声明JavaScript数组时,“ Array()”和“ \[\]”之间有什么区别?

JavaScript

谷若汐

2020-03-10

声明这样的数组之间的真正区别是什么:

var myArray = new Array();

var myArray = [];

第466篇《声明JavaScript数组时,“ Array()”和“ \[\]”之间有什么区别?》来自Winter(https://github.com/aiyld/aiyld.github.io)的站点

13个回答
小胖番长 2020.03.10

正如我所知道的性差异u能找到切片(或阵列的其他funcitons)像编码1。而代码2显示ü 阵列和他的实例

代码1:

[].slice; // find slice here
var arr = new Array();
arr.slice // find slice here
Array.prototype.slice // find slice here

代码2:

[].__proto__ == Array.prototype; // true
var arr = new Array();
arr.__proto__ == Array.prototype; // true

结论:

如您所见,[]new Array()创建了一个新的Array实例。Array.prototype

它们只是Array。的不同实例,所以这解释了为什么 [] != []

:)

樱Harry 2020.03.10

使用Array构造函数将创建一个具有所需长度的新数组,并使用未定义的值填充每个索引,将一个数组分配给一个变量将创建您为其提供信息的索引。

仲羽蛋蛋 2020.03.10

除了眼神之外,这还不止于此。其他大多数答案也是正确的,但是 ..

new Array(n)

  • 允许引擎为n元素重新分配空间
  • 针对数组创建进行了优化
  • 创建的数组被标记为稀疏,其执行的数组性能最低,这是因为每次索引访问都必须检查边界,查看值是否存在并遍历原型链
  • 如果将数组标记为稀疏,则无法回退(至少在V8中如此),即使在1ms或2小时后填充了内容(压缩数组),它在其生命周期中也总是会变慢,这没关系

[1, 2, 3] || []

  • 创建的数组标记为已打包(除非您使用delete使用[1,,3]语法)
  • 优化阵列操作for ..forEachmap等)
  • 引擎需要随着数组的增长重新分配空间

可能是在旧的版本的浏览器/浏览器的情况。

Mandy猿 2020.03.10

我使用[]产生了奇怪的行为。

我们有模型“类”,其字段已初始化为某个值。例如:

require([
  "dojo/_base/declare",
  "dijit/_WidgetBase",
], function(declare, parser, ready, _WidgetBase){

   declare("MyWidget", [_WidgetBase], {
     field1: [],
     field2: "",
     function1: function(),
     function2: function()
   });    
});

我发现,使用字段初始化时[],所有Model对象都将共享它。对一个进行更改会影响所有其他更改。

使用初始化它们不会发生new Array()与Objects的初始化相同({}与new相同Object()

TBH我不确定我们使用的框架是否有问题(Dojo

小卤蛋卡卡西 2020.03.10

第一个是默认的对象构造函数调用。您可以根据需要使用其参数。

var array = new Array(5); //initialize with default length 5

第二个使您能够创建非空数组:

var array = [1, 2, 3]; // this array will contain numbers 1, 2, 3.
小宇宙JinJinHarry 2020.03.10

第一个是默认的对象构造函数调用,主要用于动态值。

var array = new Array(length); //initialize with default length

创建静态值时使用第二个数组

var array = [red, green, blue, yellow, white]; // this array will contain values.
小卤蛋宝儿 2020.03.10

初始化没有任何长度的数组时没有区别。所以var a = []var b = new Array()一样。

但是,如果您使用length这样的长度初始化数组var b = new Array(1);,则会将数组对象的长度设置为1。因此,它等于 var b = []; b.length=1;

每当您执行array_object.push时,这都会成问题,它会在最后一个元素之后添加项目并增加长度。

var b = new Array(1);
b.push("hello world");
console.log(b.length); // print 2

var v = [];
a.push("hello world");
console.log(b.length); // print 1
null 2020.03.10

使用的区别

var arr = new Array(size);

要么

arr = [];
arr.length = size;

正如已经在这个问题上讨论得足够多了。

我想补充一下速度问题- 当前最快的方法google chrome是第二种方法。

但是请注意,这些事情会随着更新而发生很大变化。另外,不同浏览器的运行时间也不同。

例如,我提到的第二个选项在上以200万[ops / second]的速度运行chrome,但是如果您尝试在它上运行,则将mozilla dev.获得令人惊讶的2300万美元的更高速度。

无论如何,我建议你在一段时间检查出来,每一次,在不同的浏览器(和机器),利用网站这样

村村伽罗Mandy 2020.03.10

我可以从基于Fredrik的好例子的示例开始,以更具体的方式进行解释。

var test1 = [];
test1.push("value");
test1.push("value2");

var test2 = new Array();
test2.push("value");
test2.push("value2");

alert(test1);
alert(test2);
alert(test1 == test2);
alert(test1.value == test2.value);

我只是向数组添加了另一个值,并发出了四个警报:第一个和第二个是给我们存储在每个数组中的值,以确保这些值。他们将返回相同的!现在尝试第三个,它返回false,这是因为

JS将test1视为具有数组数据类型的VARIABLE,并将test2视为具有数组功能OBJECT,这里几乎没有什么区别。

第一个区别是,当我们调用test1时,它会不加考虑地调用变量,它只是返回存储在此变量中的值,而不管其数据类型!但是,当我们调用test2时,它将调用Array()函数,然后将其“推入”存储在其“ Value”属性中,并且当我们警告test2时,也会发生同样的情况,它返回数组对象“ Value”属性。

因此,当我们检查test1是否等于test2时,它们将永远不会返回true,一个是函数,另一个是变量(具有数组类型),即使它们的值相同!

为确保这一点,请尝试添加了.value的第四个警报。它将返回true。在这种情况下,我们告诉JS“不管容器的类型是功能还是变量,请比较存储在每个容器中的值,然后告诉我们您所看到的!” 正是这样。

我希望我能清楚地说出这个主意,并为我的英语不好对不起。

LEYJim 2020.03.10

两者之间没有太大的区别,它们基本上是做相同的事情,但是以不同的方式来做,但是请继续阅读W3C的以下语句:

var cars = ["Saab", "Volvo","BMW"];

var cars = new Array("Saab", "Volvo", "BMW");

上面的两个示例完全相同。无需使用新的Array()。
为了简单起见,提高可读性和执行速度,请使用第一个(数组文字方法)。

但是同时,使用new Array语法创建新数组被认为是不好的做法:

避免使用新的Array()

无需使用JavaScript的内置数组构造函数new Array()。
使用[]代替。
这两个不同的语句都创建了一个新的名为点的空数组:

var points = new Array();         // Bad
var points = [];                  // Good 

这两个不同的语句都创建一个包含6个数字的新数组:

var points = new Array(40, 100, 1, 5, 25, 10); // Bad    
var points = [40, 100, 1, 5, 25, 10];          // Good

新的关键字唯一的代码复杂化。它还可能会产生一些意外的结果:

var points = new Array(40, 100);  // Creates an array with two elements (40 and 100)

如果我删除其中一个元素怎么办?

var points = new Array(40);       // Creates an array with 40 undefined elements !!!!!

因此,基本上不认为这是最佳做法,那里也有一个细微的区别,您可以new Array(length)像这样传递长度,这也不是推荐的方法。

逆天Green古一 2020.03.10

有关更多信息,以下页面描述了为什么您永远不需要使用new Array()

您无需new Object()在JavaScript中使用。请改用对象文字{}同样,请勿使用new Array(),而应使用数组文字[]JavaScript中的数组不能像Java中的数组那样工作,使用类似Java的语法会使您感到困惑。

不要使用new Numbernew Stringnew Boolean这些形式产生不必要的对象包装。只需使用简单的文字即可。

还要检查注释- new Array(length)表单没有任何用处(至少在当今的JavaScript实现中)。

Pro番长 2020.03.10

奇怪的是,new Array(size)它几乎比[]Chrome 快2倍,而FF和IE 差不多(通过创建和填充数组来衡量)。仅当您知道数组的大致大小时才重要。如果添加的项目多于给定的长度,则性能提升将丧失。

更准确地说:Array(是一种不分配内存的快速恒定时间操作,而wheras []是设置类型和值的线性时间操作。

Eva阿飞 2020.03.10

为了更好地理解[]new Array()

> []
  []
> new Array()
  []
> [] == []
  false
> [] === []
  false
> new Array() == new Array()
  false
> new Array() === new Array()
  false
> typeof ([])
  "object"
> typeof (new Array())
  "object"
> [] === new Array()
  false
> [] == new Array()
  false

以上结果来自Windows 7上的Google Chrome控制台。

问题类别

JavaScript Ckeditor Python Webpack TypeScript Vue.js React.js ExpressJS KoaJS CSS Node.js HTML Django 单元测试 PHP Asp.net jQuery Bootstrap IOS Android