В чем реальная разница между объявлением массива следующим образом:
var myArray = new Array();
а также
var myArray = [];
javascript
arrays
declaration
Амр Элгархи
источник
источник
[]
лексем:ARRAY_INIT
;new Array
жетоны:NEW, IDENTIFIER
;new Array()
жетоны:NEW, IDENTIFIER, CALL
Ответы:
Разница есть, но в этом примере нет разницы.
Использование более подробного метода:
new Array()
имеет один дополнительный параметр в параметрах: если вы передадите число конструктору, вы получите массив такой длины:Чтобы проиллюстрировать различные способы создания массива:
Другое отличие состоит в том, что при использовании
new Array()
вы можете установить размер массива, который влияет на размер стека. Это может быть полезно, если вы получаете переполнение стека ( Performance of Array.push vs Array.unshift ), что происходит, когда размер массива превышает размер стека, и его необходимо создать заново. Таким образом, на самом деле, в зависимости от варианта использования, может быть увеличение производительности при использовании,new Array()
потому что вы можете предотвратить переполнение.Как указано в этом ответе , на
new Array(5)
самом деле не будет добавлять пятьundefined
элементов в массив. Это просто добавляет место для пяти предметов. Помните, что использованиеArray
этого способа затрудняет использованиеarray.length
расчетов.источник
Разница между созданием массива с неявным массивом и конструктором массива невелика, но важна.
Когда вы создаете массив с помощью
Вы говорите интерпретатору создать новый массив времени выполнения. Никакой дополнительной обработки не требуется вообще. Выполнено.
Если вы используете:
Вы говорите интерпретатору, я хочу вызвать конструктор "
Array
" и сгенерировать объект. Затем он просматривает ваш контекст выполнения, чтобы найти конструктор для вызова, и вызывает его, создавая ваш массив.Вы можете подумать: «Ну, это совсем не важно. Они одинаковые!». К сожалению, вы не можете гарантировать это.
Возьмите следующий пример:
В приведенном выше примере, первый звонок предупредит 'SPARTA', как и следовало ожидать. Второго не будет. В итоге вы увидите неопределенное. Вы также заметите, что b содержит все встроенные функции объекта Array, такие как
push
, а другие нет.Хотя вы можете ожидать, что это произойдет, это просто иллюстрирует тот факт, что
[]
это не то же самое, чтоnew Array()
.Лучше всего просто использовать,
[]
если вы знаете, что хотите просто массив. Я также не предлагаю идти вокруг и переопределять Массив ...источник
Есть важное отличие, о котором пока не упоминается ни один ответ.
Из этого:
Вы можете подумать, что
new Array(2)
это эквивалентно[undefined, undefined]
, но это не так!Давайте попробуем с
map()
:Видеть? Семантика совершенно другая! Так почему это так?
Согласно ES6 Spec 22.1.1.2, работа
Array(len)
заключается в создании нового массива, свойствоlength
которого установлено в качестве аргумента,len
и это все, что означает, что внутри этого вновь созданного массива нет никаких реальных элементов .Функция в
map()
соответствии со спецификацией 22.1.3.15 сначала проверяет, аHasProperty
затем вызывает обратный вызов, но получается, что:И поэтому вы не можете ожидать, что итеративные функции будут работать как обычно с массивами, созданными из
new Array(len)
.Кстати, Safari и Firefox гораздо лучше «печатают» эту ситуацию:
Я уже отправил вопрос в Chromium и попросил их исправить эту запутанную печать: https://bugs.chromium.org/p/chromium/issues/detail?id=732021
ОБНОВЛЕНИЕ: Это уже исправлено. Chrome теперь печатается как:
источник
[...Array(2)]
которая эквивалентна[undefined, undefined]
с точки зрения результатов.undefined
как обычно.Как ни странно,
new Array(size)
это почти в 2 раза быстрее, чем[]
в Chrome, и примерно столько же в FF и IE (измеряется путем создания и заполнения массива). Это имеет значение, только если вы знаете приблизительный размер массива. Если вы добавите больше элементов, чем указали длину, повышение производительности будет потеряно.Точнее:
Array(
быстрая операция с постоянным временем, которая не выделяет память, тогда[]
как операция с линейным временем, которая устанавливает тип и значение.источник
new Array(length)
на 0 <= размер <= ~ 1000, на размер> ~ 1000 побед[]
Для получения дополнительной информации на следующей странице описано, почему вам никогда не нужно использовать
new Array()
Также ознакомьтесь с комментариями -
new Array(length)
форма не служит какой-либо полезной цели (по крайней мере, в сегодняшних реализациях JavaScript).источник
Для того, чтобы лучше понять
[]
иnew Array()
:Вышеуказанный результат получен из консоли Google Chrome в Windows 7.
источник
Array(3)
илиnew Array(3)
не такие, как[3]
.Первый - это вызов конструктора объекта по умолчанию. Вы можете использовать его параметры, если хотите.
Второй дает вам возможность создавать не пустой массив:
источник
var array = [5]
использовать квадратные скобки, но не использовать конструктор, так какvar array = Array(5)
создает пустой массив из 5 элементов.Я могу объяснить более конкретно, начиная с этого примера, основанного на хорошем примере Фредрика.
Я просто добавил еще одно значение в массивы и сделал четыре предупреждения: первое и второе - дать нам значение, хранящееся в каждом массиве, чтобы быть уверенным в значениях. Они вернутся так же! Теперь попробуйте третий, он возвращает ложь, потому что
Первое отличие в том, что когда мы вызываем test1, он вызывает переменную, не задумываясь, он просто возвращает значения, которые хранятся в этой переменной, независимо от ее типа данных! Но, когда мы называем test2 он вызывает Array () функцию , а затем он хранит наши «Толкаемые» значения в «Значение» собственности, и то же самое происходит , когда мы начеку test2, он возвращает «Value» свойство объекта массива.
Поэтому, когда мы проверяем, равно ли test1 равен test2, они, конечно, никогда не вернут true, один - функция, а другой - переменная (с типом массива), даже если они имеют одинаковое значение!
Чтобы быть уверенным в этом, попробуйте 4-е предупреждение с добавлением .value; это вернет истину. В этом случае мы сообщаем JS «Независимо от типа контейнера, будь то функция или переменная, сравните значения, хранящиеся в каждом контейнере, и скажите нам, что вы видели!» именно так и происходит.
Надеюсь, я четко сформулировал эту идею, и извините за мой плохой английский.
источник
[]
иnew Array()
идентичен;.value
будетundefined
в обоих случаях, и сравнение их всегда будет ложным.array.value
. и то и другоеtypeof []
иtypeof new Array()
вернутьobject
. Это одна из причин, почему существует функция с именемArray.isArray
Нет разницы, когда вы инициализируете массив без какой-либо длины. Так
var a = []
иvar b = new Array()
есть то же самое.Но если вы инициализируете массив с такой же длиной
var b = new Array(1);
, он установит длину объекта массива равной 1. Так что это эквивалентноvar b = []; b.length=1;
.Это будет проблематично всякий раз, когда вы делаете array_object.push, он добавляет элемент после последнего элемента и увеличивает длину.
против
источник
Первый - это конструктор объекта по умолчанию call.most, используемый для динамических значений.
второй массив используется при создании статических значений
источник
Большой разницы нет, они в основном делают одно и то же, но делают это по-разному, но читайте дальше, посмотрите на это утверждение на W3C:
а также
Но в то же время создание нового массива с использованием
new Array
синтаксиса считается плохой практикой:Таким образом, в принципе не считается лучшей практикой, также есть одно небольшое отличие, вы можете передать длину,
new Array(length)
как это, что также не рекомендуется.источник
new Array(40).fill(123)
Разница в использовании
Или
Как достаточно обсуждалось в этом вопросе.
Я хотел бы добавить вопрос скорости - текущий быстрый путь, на
google chrome
второй один.Но обратите внимание, эти вещи, как правило, сильно меняются с обновлениями. Также время выполнения будет отличаться в разных браузерах.
Например, второй вариант, который я упомянул, работает со скоростью 2 миллиона [операций в секунду]
chrome
, но если вы попробуете его,mozilla dev.
вы получите удивительно более высокий показатель - 23 миллиона.В любом случае, я бы посоветовал вам проверять это время от времени на разных браузерах (и машинах), используя сайт как таковой.
источник
Как я знаю, различие вы можете найти срез (или другие функции массива), такие как code1. И code2 показывают u Array и его экземпляры :
code1:
code2:
вывод:
как вы можете видеть
[]
иnew Array()
создавать новый экземпляр Array. И все они получают функции прототипа изArray.prototype
Они просто разные экземпляры Array.so это объясняет, почему
[] != []
:)
источник
Я столкнулся со странным поведением, используя [].
У нас есть «классы» модели с полями, инициализированными до некоторого значения. Например:
Я обнаружил, что когда поля инициализируются,
[]
тогда они будут общими для всех объектов модели. Внесение изменений в один влияет на всех остальных.Этого не происходит, инициализируя их
new Array()
. То же самое для инициализации объектов ({}
против новыхObject()
)TBH Я не уверен, если это проблема с фреймворком, который мы использовали ( Dojo )
источник
Это больше, чем кажется на первый взгляд. Большинство других ответов верны, НО ТАКЖЕ ..
new Array(n)
n
элементов[1, 2, 3] || []
delete
или[1,,3]
синтаксис)for ..
,forEach
,map
и т.д.)источник
Я обнаружил одно различие между двумя конструкциями, которое меня сильно укусило.
Допустим, у меня есть:
В реальной жизни, если я делаю это:
В итоге я получаю вот что:
Я не знаю, что должно произойти в спецификации языка, но если я хочу, чтобы мои два объекта имели уникальные массивы свойств в моих объектах, я должен использовать
new Array()
.источник
[]
иnew Array()
конструктор, что приводит к одному элементу на массив на свойство. В вашем коде должно быть что-то еще, чтобы в итоге вы получили результат, показанный выше.var property1static=[];
function MyClass(){ this.property1=property1static; this.property2=new Array(); };
Использование конструктора Array создает новый массив требуемой длины и заполняет каждый из индексов неопределенным, назначенный массив переменной создает индексы, для которых вы предоставляете ему информацию.
источник