Jaka jest prawdziwa różnica między deklarowaniem tablicy takiej jak ta:
var myArray = new Array();
i
var myArray = [];
javascript
arrays
declaration
Amr Elgarhy
źródło
źródło
[]
Token:ARRAY_INIT
;new Array
tokeny:NEW, IDENTIFIER
;new Array()
tokeny:NEW, IDENTIFIER, CALL
Odpowiedzi:
Jest różnica, ale w tym przykładzie nie ma różnicy.
Używając bardziej szczegółowej metody:
new Array()
ma jedną dodatkową opcję w parametrach: jeśli przekażesz liczbę do konstruktora, otrzymasz tablicę o tej długości:Aby zilustrować różne sposoby tworzenia tablicy:
Kolejna różnica polega na tym, że podczas używania
new Array()
możesz ustawić rozmiar tablicy, co wpływa na rozmiar stosu. Może to być przydatne, jeśli występują przepełnienia stosu ( Wydajność Array.push vs. Array.unshift ), co dzieje się, gdy rozmiar tablicy przekracza rozmiar stosu i należy go ponownie utworzyć. Tak więc, w zależności od przypadku użycia, może wystąpić wzrost wydajności,new Array()
ponieważ można zapobiec przepełnieniu.Jak wskazano w tej odpowiedzi ,
new Array(5)
tak naprawdę nie doda pięciuundefined
elementów do tablicy. Po prostu dodaje miejsce na pięć przedmiotów. Należy pamiętać, że korzystanie zArray
tej metody utrudnia poleganie naarray.length
obliczeniach.źródło
Różnica między tworzeniem tablicy za pomocą tablicy niejawnej a konstruktorem tablicy jest subtelna, ale ważna.
Podczas tworzenia tablicy za pomocą
Mówisz tłumaczowi, aby utworzył nową tablicę wykonawczą. Żadne dodatkowe przetwarzanie w ogóle nie jest konieczne. Gotowy.
Jeśli użyjesz:
Mówisz tłumaczowi, że chcę wywołać konstruktor
Array
i wygenerować obiekt. Następnie przegląda kontekst wykonania, aby znaleźć konstruktora do wywołania, i wywołuje go, tworząc tablicę.Możesz pomyśleć: „Cóż, to wcale nie ma znaczenia. Są takie same!”. Niestety nie możesz tego zagwarantować.
Weź następujący przykład:
W powyższym przykładzie pierwsze połączenie ostrzeże „SPARTA”, jak można się spodziewać. Drugi nie. Skończysz na niezdefiniowanym. Zauważysz również, że b zawiera wszystkie natywne funkcje obiektu Array, takie jak
push
, gdzie inne nie.Chociaż możesz się spodziewać, że tak się stanie, to po prostu ilustruje fakt, że
[]
to nie to samo, conew Array()
.Prawdopodobnie najlepiej jest po prostu użyć,
[]
jeśli wiesz, że chcesz tylko tablicę. Nie sugeruję też chodzenia i redefiniowania Array ...źródło
Istnieje ważna różnica, o której jeszcze nie wspomniano w żadnej odpowiedzi.
Od tego:
Możesz myśleć, że to
new Array(2)
jest równoważne[undefined, undefined]
, ale NIE jest!Spróbujmy z
map()
:Widzieć? Semantyka jest zupełnie inna! Dlaczego tak jest?
Zgodnie z ES6 Spec 22.1.1.2, zadaniem
Array(len)
jest po prostu tworzenie nowej tablicy, której właściwośćlength
jest ustawiona na argumentlen
i to wszystko, co oznacza, że nie ma żadnego prawdziwego elementu w tej nowo utworzonej tablicy.Funkcja
map()
, zgodnie ze specyfikacją 22.1.3.15, najpierw sprawdza,HasProperty
a następnie wywołuje oddzwonienie, ale okazuje się, że:I dlatego nie można oczekiwać, że jakiekolwiek funkcje iterujące będą działać normalnie na tablicach utworzonych z
new Array(len)
.BTW, Safari i Firefox mają znacznie lepsze „drukowanie” w tej sytuacji:
Już przesłałem problem do Chromium i poprosiłem go o naprawienie tego mylącego drukowania: https://bugs.chromium.org/p/chromium/issues/detail?id=732021
AKTUALIZACJA: Jest już naprawione. Chrome jest teraz drukowany jako:
źródło
[...Array(2)]
co jest równoważne[undefined, undefined]
z punktu widzenia wyników.undefined
jak zwykle.Co dziwne,
new Array(size)
jest prawie dwa razy szybszy niż[]
w Chrome i mniej więcej taki sam w FF i IE (mierzony poprzez utworzenie i wypełnienie tablicy). Ma to znaczenie tylko wtedy, gdy znasz przybliżony rozmiar tablicy. Jeśli dodasz więcej elementów niż podana długość, zwiększenie wydajności zostanie utracone.Dokładniej:
Array(
jest to szybka operacja w stałym czasie, która nie przydziela pamięci, wheras[]
jest liniową operacją w czasie, która ustawia typ i wartość.źródło
new Array(length)
na 0 <= rozmiar <= ~ 1000, na rozmiar> ~ 1000 wygrywa[]
Aby uzyskać więcej informacji, na następnej stronie opisano, dlaczego nigdy nie musisz go używać
new Array()
Zobacz także komentarze -
new Array(length)
formularz nie służy żadnemu przydatnemu celowi (przynajmniej w dzisiejszych implementacjach JavaScript).źródło
Aby lepiej zrozumieć
[]
inew Array()
:Powyższy wynik pochodzi z konsoli Google Chrome w systemie Windows 7.
źródło
Array(3)
lubnew Array(3)
nie jest taki sam jak[3]
.Pierwszy to domyślne wywołanie konstruktora obiektów. Możesz użyć jego parametrów, jeśli chcesz.
Drugi daje możliwość utworzenia niepustej tablicy:
źródło
var array = [5]
za pomocą nawiasów kwadratowych, ale nie używając konstruktora, ponieważvar array = Array(5)
tworzy pustą tablicę 5 elementów.Mogę wyjaśnić w bardziej konkretny sposób, zaczynając od tego przykładu opartego na dobrym przykładzie Fredrika.
Właśnie dodałem kolejną wartość do tablic i wysłałem cztery alarmy: pierwszy i drugi mają dać nam wartość przechowywaną w każdej tablicy, aby mieć pewność co do wartości. Zwrócą to samo! Teraz wypróbuj trzeci, zwraca false, to dlatego, że
Pierwszą różnicą jest to, że gdy wywołujemy test1, to wywołuje zmienną bez zastanowienia, po prostu zwraca wartości zapisane w tej zmiennej bez względu na jej typ danych! Ale kiedy wywołujemy test2, wywołuje on funkcję Array (), a następnie przechowuje nasze wartości „Push” we właściwości „Value” , i to samo dzieje się, gdy ostrzegamy test2, zwraca właściwość „Value” obiektu tablicy.
Kiedy więc sprawdzimy, czy test1 jest równy test2, oczywiście nigdy nie zwrócą wartości true, jedna jest funkcją, a druga zmienną (z rodzajem tablicy), nawet jeśli mają tę samą wartość!
Aby się upewnić, wypróbuj 4. alert z dodaną wartością .value; zwróci prawdę. W takim przypadku mówimy JS „Niezależnie od typu kontenera, czy był to funkcja czy zmienna, porównaj wartości przechowywane w każdym kontenerze i powiedz nam, co widziałeś!” dokładnie tak się dzieje.
Mam nadzieję, że jasno wyraziłem ten pomysł i przepraszam za mój zły angielski.
źródło
[]
inew Array()
jest identyczny;.value
będzieundefined
w obu przypadkach, a porównywanie ich zawsze będzie fałszywe.array.value
. i obatypeof []
itypeof new Array()
powrotuobject
. Jest to jeden z powodów, dla których istnieje funkcja o nazwieArray.isArray
Nie ma różnicy przy inicjalizacji tablicy bez jakiejkolwiek długości. Więc
var a = []
&var b = new Array()
jest taki sam.Ale jeśli zainicjujesz tablicę o długości podobnej
var b = new Array(1);
, ustawi ona długość obiektu tablicy na 1. Więc jest to odpowiednikvar b = []; b.length=1;
.Będzie to problematyczne za każdym razem, gdy wykonasz array_object.push, dodasz element po ostatnim elemencie i zwiększysz długość.
vs
źródło
Pierwszym z nich jest domyślne wywołanie konstruktora obiektów. Używane głównie do wartości dynamicznych.
druga tablica jest używana podczas tworzenia wartości statycznych
źródło
Nie ma dużej różnicy, w zasadzie robią to samo, ale robią to na różne sposoby, ale czytaj dalej, spójrz na to oświadczenie na W3C:
i
Ale jednocześnie tworzenie nowej tablicy przy użyciu
new Array
składni uważanej za złą praktykę:Więc zasadniczo nie jest uważany za najlepszą praktykę, jest też jedna drobna różnica, możesz podać długość, aby
new Array(length)
to polubić, co również nie jest zalecanym sposobem.źródło
new Array(40).fill(123)
Różnica użycia
Lub
Jak już zostało wystarczająco omówione w tym pytaniu.
Chciałbym dodać problem prędkości - obecnie najszybszym sposobem
google chrome
jest drugi.Ale zwróć uwagę, te rzeczy często zmieniają się wraz z aktualizacjami. Również czas działania będzie różny dla różnych przeglądarek.
Na przykład - druga opcja, o której wspomniałem, działa przy 2 milionach [operacji / sekundę]
chrome
, ale jeśli spróbujeszmozilla dev.
, otrzymasz zaskakująco wyższą stawkę 23 milionów.W każdym razie sugeruję, abyś sprawdzał to, co jakiś czas, w różnych przeglądarkach (i maszynach), używając witryny jako takiej
źródło
Jak znam diference u można znaleźć kawałek (lub inne funcitons Array), jak kod1 .i code2 pokazać u Array i jego wystąpienia :
kod1:
kod2:
wniosek:
jak możesz zobaczyć
[]
inew Array()
utworzyć nową instancję Array. I oni wszyscy otrzymują prototypowe funkcje odArray.prototype
Są po prostu inną instancją Array. Więc to wyjaśnia dlaczego
[] != []
:)
źródło
Dziwnie się zachowałem, używając [].
Mamy „klasy” modelu z polami zainicjowanymi do pewnej wartości. Na przykład:
Odkryłem, że po zainicjowaniu pól
[]
będą one współdzielone przez wszystkie obiekty Modelu. Wprowadzanie zmian w jednym wpływa na wszystkie pozostałe.Nie zdarza się to przy ich inicjowaniu
new Array()
. To samo dotyczy inicjalizacji obiektów (w{}
porównaniu z nowymiObject()
)TBH Nie jestem pewien, czy jest to problem z używanym frameworkiem ( Dojo )
źródło
Jest w tym coś więcej niż na pierwszy rzut oka. Większość innych odpowiedzi jest poprawnych, ALE TAKŻE ..
new Array(n)
n
elementów[1, 2, 3] || []
delete
lub[1,,3]
składnia)for ..
,forEach
,map
, etc.)źródło
Znalazłem jedną różnicę między tymi dwiema konstrukcjami, które mocno mnie ugryzły.
Powiedzmy, że mam:
W prawdziwym życiu, jeśli to zrobię:
Skończyłem z tym:
Nie wiem, co ma powiedzieć specyfikacja języka, ale jeśli chcę, aby moje dwa obiekty miały unikalne tablice właściwości w moich obiektach, muszę użyć
new Array()
.źródło
[]
inew Array()
konstruktorze, co daje jeden element na tablicę na właściwość. Musisz mieć coś innego w swoim kodzie, aby skończyć z wynikiem, który pokazałeś powyżej.var property1static=[];
function MyClass(){ this.property1=property1static; this.property2=new Array(); };
Użycie konstruktora Array tworzy nową tablicę o pożądanej długości i zapełnia każdy indeks niezdefiniowanym, przypisana tablica do zmiennej tworzy indeksy, dla których podajesz informacje.
źródło