В чем разница между "Array ()" и "[]" при объявлении массива JavaScript? - PullRequest
776 голосов
/ 31 мая 2009

В чем реальная разница между объявлением массива следующим образом:

var myArray = new Array();

и

var myArray = [];

Ответы [ 16 ]

1 голос
/ 13 марта 2019

Нет разницы при инициализации массива без какой-либо длины. Так что var a = [] & var b = new Array() это то же самое.

Но если вы инициализируете массив с длиной, подобной 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
1 голос
/ 19 сентября 2017

Я столкнулся со странным поведением, используя [].

У нас есть "классы" модели с полями, инициализированными до некоторого значения. Например:

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

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

Я обнаружил, что когда поля инициализируются с [], они будут общими для всех объектов модели. Внесение изменений в один влияет на всех остальных.

Этого не происходит, инициализируя их с new Array(). То же самое для инициализации объектов ({} против новых Object())

TBH Я не уверен, что это проблема с платформой, которую мы использовали ( Dojo )

1 голос
/ 27 декабря 2016

Как я знаю, вы можете найти различие (или другие функции массива), например code1 .and code2 show u Array и его экземпляры

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

Они просто разные экземпляры Array. Поэтому это объясняет, почему [] != []

:)

1 голос
/ 06 марта 2016

Разница в использовании

var arr = new Array(size);

Или

arr = [];
arr.length = size;

Как уже обсуждалось в этом вопросе.

Я хотел бы добавить проблему скорости - самый быстрый способ - current , второй * - google chrome.

Но обратите внимание, эти вещи, как правило, сильно меняются с обновлениями. Также время выполнения будет отличаться в разных браузерах.

Например, второй вариант, который я упомянул, работает со скоростью 2 миллиона [операций в секунду] на chrome, но если вы попробуете его на mozilla dev., вы получите удивительно более высокий показатель - 23 миллиона.

В любом случае, я бы посоветовал вам проверять это время от времени на разных браузерах (и машинах), используя сайт как таковой

0 голосов
/ 19 ноября 2015

Используя конструктор Array, создаем новый массив желаемой длины и заполняем каждый из индексов неопределенным, приписывая массив переменной, создаем индексы, для которых вы даете ему информацию.

0 голосов
/ 24 сентября 2015

Я обнаружил одно различие между двумя конструкциями, которое меня сильно укусило.

Допустим, у меня есть:

function MyClass(){
  this.property1=[];
  this.property2=new Array();
};
var MyObject1=new MyClass();
var MyObject2=new MyClass();

В реальной жизни, если я сделаю это:

MyObject1.property1.push('a');
MyObject1.property2.push('b');
MyObject2.property1.push('c');
MyObject2.property2.push('d');

В результате я получаю следующее:

MyObject1.property1=['a','c']
MyObject1.property2=['b']
MyObject2.property1=['a','c']
MyObject2.property2=['d']

Я не знаю, что должно произойти в спецификации языка, но если я хочу, чтобы два моих объекта имели уникальные массивы свойств в моих объектах, я должен использовать new Array().

...