Istnieją dwa różne sposoby utworzenia pustego obiektu w JavaScript:
var objectA = {}
var objectB = new Object()
Czy jest jakaś różnica w sposobie obsługiwania ich przez silnik skryptów? Czy jest jakiś powód, aby używać jednego nad drugim?
Podobnie można również utworzyć pustą tablicę przy użyciu innej składni:
var arrayA = []
var arrayB = new Array()
javascript
arrays
object
javascript-objects
new-operator
Jonas Pegerfalk
źródło
źródło
var objectA = {} var objectB = new Object()
istnieje trzeci konstrukt, który da ten sam rezultat:var objectC = Object.create(Object.prototype);
{}
i[]
Użyj{}
zamiastnew Object()
. Użyj[]
zamiastnew Array()
. Użyj tablic, gdy nazwy członków będą sekwencyjnymi liczbami całkowitymi. Użyj obiektów, gdy nazwy członków są dowolnymi ciągami lub nazwami. źródłonew Object()
i{}
nie są całkiem pustymi obiektami, są to obiekty, które mają Object.prototype. Możesz użyćObject.create(null)
do naprawdę pustego obiektu (przynajmniej zgodnie z dokumentacją mozilla: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )Odpowiedzi:
Obiekty
Korzystanie z niego nie przynosi żadnych korzyści
new Object();
-{};
może jednak uczynić kod bardziej zwartym i bardziej czytelnym.Do definiowania pustych obiektów są one technicznie takie same.
{}
Składnia jest krótszy, neater (mniej Java-ish) i pozwala natychmiast wypełnić inline object - tak jak poniżej:Tablice
W przypadku tablic, podobnie prawie nie ma korzyści z używania
new Array();
ponad[];
- z jednym drobnym wyjątkiem:tworzy tablicę o długości 100 elementów ze wszystkimi gniazdami,
undefined
które mogą być przydatne / przydatne w niektórych sytuacjach (np.(new Array(9)).join('Na-Na ') + 'Batman!'
).Moja rekomendacja
new Object();
- jest bardziej nieprzyjemny{};
i wygląda głupio.[];
- z wyjątkiem sytuacji, gdy musisz szybko utworzyć „pustą” tablicę o zdefiniowanej długości.źródło
new Array(100)
. Przeczytaj literaturę: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…[]
. Brak argumentów. Twierdziłeś jednak, żenew Array(100)
jest to „nieważne”, co jest nieprawdą.new Array(1,2,3)
wyniki w[1,2,3]
, alenew Array(1)
ma nie powodować[1]
; tak więc semantykaArray
jest niespójna i niepotrzebnie zagmatwana.Object.create(null)
może to być przydatne do utworzenia pustego obiektu, podczas gdy{ }
dziedziczy po prototypie Object.Tak, jest różnica, to nie to samo. To prawda, że uzyskasz te same wyniki, ale silnik działa w inny sposób dla obu z nich. Jeden z nich to dosłowny obiekt, a drugi to konstruktor, dwa różne sposoby tworzenia obiektu w javascript.
W JS wszystko jest obiektem, ale powinieneś pamiętać o następującej rzeczy z nowym Object (): Może otrzymać parametr, i w zależności od tego parametru utworzy ciąg, liczbę lub po prostu pusty obiekt.
Na przykład:
new Object(1)
zwróci liczbę.new Object("hello")
zwróci ciąg znaków, oznacza to, że konstruktor obiektu może delegować - w zależności od parametru - tworzenie obiektu innym konstruktorom, takim jak ciąg, liczba itp. ... Bardzo ważne jest, aby o tym pamiętać, zarządzając danymi dynamicznymi tworzyć obiekty ..Wielu autorów zaleca, aby nie używać konstruktora obiektów, gdy można zamiast tego użyć pewnej literalnej notacji, dzięki czemu będziesz mieć pewność, że to, co tworzysz, jest tym, czego oczekujesz w kodzie.
Sugeruję, abyś przeczytał dalej na temat różnic między notacją literalną a konstruktorami javascript, aby znaleźć więcej szczegółów.
źródło
Mają ten sam wynik końcowy, ale dodam po prostu, że użycie składni literałowej może pomóc przyzwyczaić się do składni JSON (podzbiór ciągów znaków dosłownej składni JavaScript), więc może być dobrą praktyką wchodzenie w .
Jeszcze jedno: możesz mieć subtelne błędy, jeśli zapomnisz użyć
new
operatora. Używanie literałów pomoże ci uniknąć tego problemu.Ostatecznie będzie to zależeć od sytuacji, a także preferencji.
źródło
Składnia literałów obiektowych i tablicowych {} / [] została wprowadzona w JavaScript 1.2, więc nie jest dostępna (i spowoduje błąd składniowy) w wersjach Netscape Navigator wcześniejszych niż 4.0.
Moje palce wciąż domyślnie wypowiadają nową Array (), ale jestem bardzo starym człowiekiem. Na szczęście Netscape 3 nie jest przeglądarką, którą wiele osób musi dziś rozważyć ...
źródło
jest znacznie szybsza i z mojego doświadczenia wynika, że jest częściej stosowana, więc prawdopodobnie najlepiej jest przyjąć „standard” i zaoszczędzić trochę pisania.
źródło
new Object
muszą być wykonywane w czasie wykonywania.Uważam, że
{}
został zalecony w jednym z vids Javascript tutaj jako dobra konwencja kodowania.new
jest niezbędny do dziedziczenia pseudoklasycznego.var obj = {};
sposób pomaga przypomnieć, że nie jest to klasyczny język zorientowany obiektowo, ale prototypal jeden. Tak więc jedyny czas, którego naprawdę potrzebujesznew
, to korzystanie z funkcji konstruktora. Na przykład:Następnie używa się go tak:
Kolejną zaletą używania
{}
w przeciwieństwie do tegonew Object
jest to, że można go używać do literałów obiektowych w stylu JSON.źródło
Wydajność tworzenia instancji macierzy
Jeśli chcesz utworzyć tablicę bez długości:
var arr = [];
jest szybszy niżvar arr = new Array();
Jeśli chcesz utworzyć pustą tablicę o określonej długości:
var arr = new Array(x);
jest szybszy niżvar arr = []; arr[x-1] = undefined
;Aby przeprowadzić testy porównawcze, kliknij: https://jsfiddle.net/basickarl/ktbbry5b/
Nie znam jednak śladu pamięci obu, mogę sobie wyobrazić, że
new Array()
zajmuje więcej miejsca.źródło
arr = new Array(x)
jest równoznaczne zarr = []; arr.length = x;
nieprzypisywaniemx-1
indeksu za pomocąundefined
.To jest zasadniczo to samo. Używaj tego, co uważasz za wygodniejsze.
źródło
Object
jest puste, a {proto}{}
to „Object.prototype”?Object
jest zerowy, to prawda. To dlatego, żeObject
kończy łańcuch prototypów. Instancje obiektów nie mają jednak prototypu, mają go tylko konstruktorzy. I(new Object()).constructor === ({}).constructor
->true
new Object()
zwraca pustą instancję Object.{}
zwraca pustą instancję Object. Oba te przypadki są absolutnie nie do odróżnienia. Przykład, do którego linkujesz, robi coś innego (modyfikuje łańcuch prototypów) i tak naprawdę nie ma tu zastosowania - lub nie rozumiem twojego argumentu.OK , są tylko 2 różne sposoby na zrobienie tego samego! Jeden jest wywoływany,
object literal
a drugi jest funkcjąconstructor
!Ale czytaj dalej, jest kilka rzeczy, którymi chciałbym się podzielić:
Użycie
{}
sprawia, że kod jest bardziej czytelny, a tworzenie instancjiObject
lub innych wbudowanych funkcji nie jest zalecane ...Ponadto funkcja Object pobiera parametry, ponieważ jest funkcją, na przykład
Object(params)
... ale{}
jest czystym sposobem na uruchomienie obiektu w JavaScript ...Używanie literału obiektowego sprawia, że kod wygląda na znacznie czystszy i łatwiejszy do odczytania dla innych programistów, co jest zgodne z najlepszymi praktykami w JavaScript ...
Podczas gdy obiekt w JavaScript może być prawie wszystkim,
{}
tylko wskazuje na obiekty javascript, aby sprawdzić, jak to działa, wykonaj poniżej w kodzie javascript lub konsoli:Zaskakujące, że tworzy liczbę!
I to tworzy tablicę!
i ten dziwny wynik dla
String
!Więc jeśli tworzysz obiekt, zaleca się użycie literału obiektowego, aby mieć standardowy kod i uniknąć jakiegokolwiek wypadku kodu, jak wyżej, również z punktu widzenia wydajności
{}
lepsze jest moje doświadczenie!źródło