Jak inicializovat délku pole v JavaScriptu?

Většina výukových programů, které jsem četl o polích v JavaScriptu (včetně w3schools a devguru), naznačuje, že můžete inicializovat pole s určitou délkou předáním celého čísla konstruktoru Array pomocí var test = new Array(4); syntaxe.

Po použití této syntaxe ve svých souborech js jsem prošel jeden ze souborů přes jsLint a vyděsil se:

Chyba:Problém na řádku 1 znak 22:Očekáváno ‚)‘ a místo toho se zobrazilo ‚4‘.
var test =new Array(4);
Problém na řádku 1 znak 23:Očekáváno „;“ a místo toho bylo vidět „)“.
var test =new Array(4);
Problém na řádku 1 znak 23:Očekával se identifikátor a místo toho se zobrazil znak „)“.

Po přečtení jsLintova vysvětlení jeho chování to vypadá, že jsLint opravdu nemá rád new Array() syntaxi a místo toho preferuje [] při deklaraci polí.

Takže mám pár otázek:

Za prvé, proč? Vystavuji se nějakému riziku používáním new Array() místo toho syntaxe? Existují nějaké nekompatibility prohlížeče, o kterých bych si měl být vědom?

A za druhé, pokud přepnu na syntaxi hranatých závorek, existuje nějaký způsob, jak deklarovat pole a nastavit jeho délku na jeden řádek, nebo musím udělat něco takového:

var test = [];
test.length = 4;

Odpověď

  1. Proč chcete inicializovat délku? Teoreticky to není potřeba. Může to dokonce vést k matoucímu chování, protože všechny testy používají length Chcete-li zjistit, zda je pole prázdné nebo ne, oznámí, že pole není prázdné.
    Některé testy ukazují, že nastavení počáteční délky velkých polí může být efektivnější, pokud je pole vyplněno dodatečně, ale nárůst výkonu (pokud existuje) se zdá být v různých prohlížečích odlišný.

  2. jsLint nemá rád new Array() protože konstruktér je nejednoznačný.

    new Array(4);
    

    vytvoří prázdné pole délky 4. Ale

    new Array('4');
    

    vytvoří pole obsahující hodnotu '4' .

Pokud jde o váš komentář:V JS nemusíte inicializovat délku pole. Dynamicky roste. Délku můžete uložit do nějaké proměnné, např.

var data = [];
var length = 5; // user defined length

for(var i = 0; i < length; i++) {
    data.push(createSomeObject());
}