Utworzyć pusty obiekt w JavaScript za pomocą {} lub new Object ()?

Istnieją dwa różne sposoby tworzenia pustego obiektu w JavaScript:

var objectA = {}
var objectB = new Object()

Czy jest jakaś różnica w tym, jak silnik skryptów sobie z nimi radzi? Czy jest jakiś powód, by używać jednego nad drugim?

Podobnie można również utworzyć pustą tablicę używając innej składni:

var arrayA = []
var arrayB = new Array()
Author: Alireza, 2008-10-30

9 answers

Obiekty

Nie ma żadnej korzyści z używania new Object(); -- podczas gdy {}; może sprawić, że Twój kod będzie bardziej zwarty i czytelny.

Do definiowania pustych obiektów są technicznie takie same. Składnia {} jest krótsza, schludniejsza (mniej Java-owska) i pozwala na natychmiastowe wypełnienie obiektu w linii-w ten sposób:

var myObject = {
        title:  'Frog',
        url:    '/img/picture.jpg',
        width:  300,
        height: 200
      };

Tablice

Dla tablic, nie ma prawie żadnej korzyści z używania new Array(); przez []; -- z jednym drobnym wyjątkiem:

var emptyArray = new Array(100);

Tworzy tablica o długości 100 pozycji ze wszystkimi slotami zawierającymi undefined -- które mogą być miłe/przydatne w pewnych sytuacjach (np. (new Array(9)).join('Na-Na ') + 'Batman!').

Moja rekomendacja

  1. nigdy nie używaj new Object(); -- jest bardziej clunkierne niż '{} ' i wygląda głupio.
  2. Zawsze używaj []; -- z wyjątkiem sytuacji, gdy trzeba szybko utworzyć "pustą" tablicę o predefiniowanej długości.
 413
Author: Már Örlygsson,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-09-28 14:17:59

Tak, jest różnica, nie są takie same. To prawda, że uzyskasz te same wyniki, ale silnik działa w inny sposób dla obu z nich. Jednym z nich jest obiekt dosłowny, a drugim konstruktor, dwa różne sposoby tworzenia obiektu w javascript.

var objectA = {} //This is an object literal

var objectB = new Object() //This is the object constructor

W JS wszystko jest obiektem, ale należy pamiętać o następującej rzeczy z new Object(): może on otrzymać parametr i w zależności od tego parametru utworzy łańcuch znaków, liczbę, albo po prostu pusty obiekt.

Na przykład: new Object(1), zwróci liczbę. new Object("hello") zwróci łańcuch znaków, to znaczy, że konstruktor obiektu może delegować - w zależności od parametru-wytworzenie obiektu innym konstruktorom, takim jak string, number, itd... Bardzo ważne jest, aby mieć to na uwadze podczas zarządzania dynamicznymi danymi w celu tworzenia obiektów..

Wielu autorów zaleca, aby nie używać konstruktora obiektu, gdy zamiast tego można użyć pewnej dosłownej notacji, gdzie będziesz pewien to, co tworzysz, jest tym, czego oczekujesz w swoim kodzie.

Sugeruję dalsze zapoznanie się z różnicami między literalną notacją a konstruktorami w javascript, aby znaleźć więcej szczegółów.

 81
Author: Guillermo Snipe,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-01-09 08:46:15

Mają ten sam efekt końcowy, ale chciałbym po prostu dodać, że używanie składni dosłownej może pomóc przyzwyczaić się do składni JSON (podzbiór dosłownej składni obiektu JavaScript), więc może być dobrą praktyką.

Jeszcze jedno: możesz mieć subtelne błędy, jeśli zapomnisz użyć operatora new. Tak więc korzystanie z literałów pomoże Ci uniknąć tego problemu.

Ostatecznie zależy to zarówno od sytuacji, jak i preferencji.
 11
Author: Jason Bunting,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 19:40:32

Składnia obiektu i tablicy {} / [] została wprowadzona w JavaScript 1.2, więc nie jest dostępna (i spowoduje błąd składni) w wersjach Netscape Navigator sprzed 4.0.

Moje palce nadal domyślnie mówią new Array (), ale jestem bardzo stary. Na szczęście Netscape 3 nie jest przeglądarką, którą wiele osób musi dziś rozważyć...

 7
Author: bobince,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 20:08:00
var objectA = {}

Jest o wiele szybszy i, z mojego doświadczenia, częściej używany, więc prawdopodobnie najlepiej jest przyjąć "standard" i zaoszczędzić trochę pisania.

 7
Author: Bobby Jack,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 20:13:51

Uważam, że {[2] } został zalecony w jednym z filmów Javascript na tutaj jako dobra konwencja kodowania. new jest konieczne do dziedziczenia pseudoklasycznego. sposób var obj = {}; pomaga przypomnieć, że nie jest to klasyczny obiektowo zorientowany język, ale prototypowy. Tak więc jedynym czasem, który naprawdę potrzebujesz new jest używanie funkcji konstruktorów. Na przykład:

var Mammal = function (name) {
  this.name = name;
};

Mammal.prototype.get_name = function () {
  return this.name;
}

Mammal.prototype.says = function() {
  return this.saying || '';
}

Wtedy używa się go tak:

var aMammal = new Mammal('Me warm-blooded');
var name = aMammal.get_name();

Kolejną zaletą używania {} jako przeciwstawnego new Object czy można go używać do pisania literałów obiektów w stylu JSON.

 7
Author: Thedric Walker,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-31 13:10:27

Array instantiation performance

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;

Dla benchmarków kliknij: https://jsfiddle.net/basickarl/ktbbry5b/

nie znam jednak śladu pamięci obu, mogę sobie wyobrazić, że new Array() zajmuje więcej miejsca.

 7
Author: Karl Morrison,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-06 01:29:52

To w zasadzie to samo. Użyj tego, co uznasz za wygodniejsze.

 2
Author: Tomalak,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2008-10-30 19:23:30

OK , są tylko 2 różne sposoby, aby zrobić to samo! Jeden nazywa się 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, podczas tworzenia instancji Object lub innych wbudowanych funkcji, które nie są zalecane...

Również funkcja obiektu pobiera parametry, ponieważ jest funkcją, jak Object(params)... ale {[5] } jest czystym sposobem na uruchomienie obiektu w JavaScript...

Używanie dosłownego obiektu sprawia, że Twój kod wygląda dużo czystiej i jest łatwiejszy do odczytania dla innych programistów i jest zgodny z najlepszymi praktykami w JavaScript...

Podczas gdy obiekt w Javascript może być prawie wszystkim, {} wskazuje tylko na obiekty javascript, aby przetestować, jak to działa, wykonaj poniżej w kodzie javascript lub konsoli:

var n = new Object(1); //Number {[[PrimitiveValue]]: 1}

O dziwo, tworzy liczbę!

var a = new Object([1,2,3]); //[1, 2, 3]

I to jest tworzenie tablicy!

var s = new Object('alireza'); //String {0: "a", 1: "l", 2: "i", 3: "r", 4: "e", 5: "z", 6: "a", length: 7, [[PrimitiveValue]]: "alireza"}

I to dziwne wynik dla String!

Więc jeśli tworzysz obiekt, zalecane jest użycie dosłownego obiektu, aby mieć standardowy kod i uniknąć jakiegokolwiek wypadku kodu, jak powyżej, również wydajność przy użyciu {} jest lepsza z mojego doświadczenia!

 1
Author: Alireza,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-11-25 21:13:36