В чем разница между конденсированными массивами и литеральными массивами?
Как говорится в заголовке: В чем разница между конденсированными массивами и литеральными массивами?
new Array("John", "Bob", "Sue"); // condensed array
["John", "Bob", "Sue"]; // literal array
Есть ли что-то, что я могу сделать с тем, что я не могу сделать с другим? Или это так, как оно хранится в памяти?
Ответы
Ответ 1
Нет, нет никакого различия в создаваемом объекте, они одинаковы.
Во-первых, это попытка удовлетворить программистов, которые используются в "классической" среде, где вам нужно создать экземпляр "нового" объекта Array.
Следует отметить, что массивы в javascript не являются последовательным распределением памяти, а объектами с перечисляемыми именами свойств и несколькими дополнительными (полезными) методами.
Из-за этого создание массива заданной длины является бесполезным и ненужным в большинстве (если не во всех) случаях.
var array = new Array(10);
функционально то же самое, вручную задает длину вашего массива
var array = [];
array.length = 10;
Ответ 2
Существует, по крайней мере, одно известное использование конструктора Array():
String.prototype.repeat= function(n){
n= n || 1;
return Array(n+1).join(this);
}
document.writeln('/'.repeat(80))
Ответ 3
Семантика инициализатора массива приведена в разделе 11.1.4 спецификации ECMA 262 5th edition. Вы можете прочитать его там. В нем говорится, что значение инициализатора такое же, как если бы были вызваны new Array
. Но с инициализатором вы можете сделать то, что не можете с конструктором. Проверьте это:
> a = [3,,,,5,2,3]
3,,,,5,2,3
> a = new Array(3,,,,5,2,3)
SyntaxError: Unexpected token ,
Я использовал в инициализаторе то, что известно как "элиция".
Конструктор массива имеет немного гибкости своего
a = new Array(10)
,,,,,,,,,
a = new Array(1,2,30)
1,2,30
Таким образом, один аргумент для конструктора создает массив из множества неопределенных.