Es gibt zwei verschiedene Möglichkeiten, ein leeres Objekt in JavaScript zu erstellen:
var objectA = {}
var objectB = new Object()
Gibt es einen Unterschied darin, wie die Skript-Engine damit umgeht? Gibt es einen Grund, einen über den anderen zu verwenden?
In ähnlicher Weise ist es auch möglich, ein leeres Array mit unterschiedlicher Syntax zu erstellen:
var arrayA = []
var arrayB = new Array()
javascript
arrays
object
javascript-objects
new-operator
Jonas Pegerfalk
quelle
quelle
var objectA = {} var objectB = new Object()
einem dritten Konstrukt das gleiche Ergebnis gibt:var objectC = Object.create(Object.prototype);
{}
und[]
Verwenden Sie{}
anstelle vonnew Object()
. Verwenden Sie[]
anstelle vonnew Array()
. Verwenden Sie Arrays, wenn die Mitgliedsnamen sequentielle Ganzzahlen sind. Verwenden Sie Objekte, wenn die Mitgliedsnamen beliebige Zeichenfolgen oder Namen sind. Quellenew Object()
und{}
sind nicht ganz leere Objekte, sondern Objekte mit dem Object.prototype. Sie könnenObject.create(null)
für ein wirklich leeres Objekt verwenden (zumindest gemäß den Mozilla-Dokumenten: developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/… )Antworten:
Objekte
Es gibt keinen Nutzen zu verwenden
new Object();
- während{};
können Sie den Code kompakter und besser lesbar machen.Für die Definition leerer Objekte sind sie technisch gleich. Die
{}
Syntax ist kürzer, übersichtlicher (weniger Java-artig) und ermöglicht es Ihnen, das Objekt sofort inline zu füllen - wie folgt:Arrays
Bei Arrays hat die Verwendung von
new Array();
Over fast keinen Vorteil[];
- mit einer kleinen Ausnahme:Erstellt ein 100 Elemente langes Array mit allen Slots, die enthalten
undefined
- was in bestimmten Situationen (z. B.(new Array(9)).join('Na-Na ') + 'Batman!'
) hilfreich sein kann .Meine Empfehlung
new Object();
- es ist klobiger als{};
und sieht albern aus.[];
- außer wenn Sie schnell ein "leeres" Array mit einer vordefinierten Länge erstellen müssen.quelle
new Array(100)
. Lesen Sie die Literatur: developer.mozilla.org/en/JavaScript/Reference/Global_Objects/…[]
. Kein Argument da. Sie haben jedoch argumentiert, dass diesnew Array(100)
irgendwie "ungültig" ist, was nicht wahr ist.new Array(1,2,3)
Ergebnisse in[1,2,3]
, abernew Array(1)
nicht nicht zur Folge[1]
; Daher ist die Semantik vonArray
inkonsistent und unnötig verwirrend.Object.create(null)
dies nützlich sein kann, um ein leeres Objekt zu erstellen, während es{ }
vom Objektprototyp erbt.Ja, es gibt einen Unterschied, sie sind nicht gleich. Es ist wahr, dass Sie die gleichen Ergebnisse erzielen, aber die Engine funktioniert für beide unterschiedlich. Einer von ihnen ist ein Objektliteral und der andere ist ein Konstruktor, zwei verschiedene Arten, ein Objekt in Javascript zu erstellen.
In JS ist alles ein Objekt, aber Sie sollten bei new Object () Folgendes beachten: Es kann einen Parameter empfangen und abhängig von diesem Parameter wird eine Zeichenfolge, eine Zahl oder nur ein leeres Objekt erstellt.
Beispiel:
new Object(1)
Gibt eine Nummer zurück.new Object("hello")
Wenn eine Zeichenfolge zurückgegeben wird, bedeutet dies, dass der Objektkonstruktor - abhängig vom Parameter - die Objekterstellung an andere Konstruktoren wie Zeichenfolge, Nummer usw. delegieren kann. Dies ist sehr wichtig, wenn Sie dynamische Daten verwalten Objekte erstellen ..Viele Autoren empfehlen, den Objektkonstruktor nicht zu verwenden, wenn Sie stattdessen eine bestimmte Literalnotation verwenden können, bei der Sie sicher sein werden, dass das, was Sie erstellen, das ist, was Sie in Ihrem Code erwarten.
Ich empfehle Ihnen, die Unterschiede zwischen der wörtlichen Notation und den Konstruktoren in Javascript weiter zu lesen, um weitere Einzelheiten zu erfahren.
quelle
Diese haben das gleiche Endergebnis, aber ich möchte einfach hinzufügen, dass die Verwendung der Literal-Syntax dazu beitragen kann, sich an die Syntax von JSON (eine string-ified-Teilmenge der JavaScript-Literal-Objekt-Syntax) zu gewöhnen .
Eine andere Sache: Sie können subtile Fehler haben, wenn Sie vergessen, den
new
Operator zu verwenden. Die Verwendung von Literalen hilft Ihnen also, dieses Problem zu vermeiden.Letztendlich wird es sowohl von der Situation als auch von den Vorlieben abhängen.
quelle
Die Literal-Syntax {} / [] für Objekte und Arrays wurde in JavaScript 1.2 eingeführt und ist daher in Versionen von Netscape Navigator vor 4.0 nicht verfügbar (und führt zu einem Syntaxfehler).
Meine Finger sagen immer noch standardmäßig neues Array (), aber ich bin ein sehr alter Mann. Zum Glück ist Netscape 3 kein Browser, den viele Menschen heute jemals in Betracht ziehen müssen ...
quelle
ist viel schneller und wird meiner Erfahrung nach häufiger verwendet, daher ist es wahrscheinlich am besten, den 'Standard' zu übernehmen und etwas Tipparbeit zu sparen.
quelle
new Object
sie zur Laufzeit ausgeführt werden müssen.Ich glaube,
{}
wurde in einem der Javascript-Videos hier als gute Codierungskonvention empfohlen .new
ist für die pseudoklassische Vererbung notwendig. Dervar obj = {};
Weg erinnert Sie daran, dass dies keine klassische objektorientierte, sondern eine prototypische Sprache ist. Das einzige Mal, das Sie wirklich brauchen würden,new
ist, wenn Sie Konstruktorfunktionen verwenden. Zum Beispiel:Dann wird es so verwendet:
Ein weiterer Vorteil der Verwendung
{}
im Gegensatz zunew Object
ist, dass Sie damit Objektliterale im JSON-Stil erstellen können.quelle
Array-Instanziierungsleistung
Wenn Sie ein Array ohne Länge erstellen möchten:
var arr = [];
ist schneller alsvar arr = new Array();
Wenn Sie ein leeres Array mit einer bestimmten Länge erstellen möchten:
var arr = new Array(x);
ist schneller alsvar arr = []; arr[x-1] = undefined
;Für Benchmarks klicken Sie auf Folgendes: https://jsfiddle.net/basickarl/ktbbry5b/
Ich kenne jedoch nicht den Speicherbedarf von beiden, ich kann mir vorstellen, dass dies
new Array()
mehr Platz beansprucht.quelle
arr = new Array(x)
ist gleichbedeutend mitarr = []; arr.length = x;
, denx-1
Index nicht zuzuweisen mitundefined
.Dies ist im Wesentlichen das gleiche. Verwenden Sie alles, was Sie bequemer finden.
quelle
Object
null, während das {proto} von{}
'Object.prototype' ist?Object
ist null, das ist richtig. Das liegt daranObject
, dass die Prototypenkette beendet wird. Objektinstanzen jedoch nicht über einen Prototyp, haben nur Konstrukteure ein. Und(new Object()).constructor === ({}).constructor
->true
new Object()
ergibt eine leere Objektinstanz.{}
ergibt eine leere Objektinstanz. Beide Fälle sind absolut nicht zu unterscheiden. Das Beispiel, auf das Sie verlinken, macht etwas anderes (es modifiziert die Prototypenkette) und trifft hier nicht wirklich zu - oder ich verstehe Ihr Argument nicht.OK , es gibt nur zwei verschiedene Möglichkeiten, dasselbe zu tun! Einer heißt
object literal
und der andere ist eine Funktionconstructor
!Aber lesen Sie weiter, es gibt einige Dinge, die ich gerne teilen möchte:
Durch
{}
die Verwendung wird Ihr Code besser lesbar, während InstanzenObject
oder andere integrierte Funktionen erstellt werden, die nicht empfohlen werden ...Außerdem erhält die Objektfunktion Parameter, da es sich um eine Funktion handelt, wie
Object(params)
... aber es{}
ist eine reine Möglichkeit, ein Objekt in JavaScript zu starten ...Durch die Verwendung von Objektliteral sieht Ihr Code für andere Entwickler viel sauberer und leichter lesbar aus und entspricht den Best Practices in JavaScript ...
Während Objekt in Javascript fast alles sein kann, zeigt es
{}
nur auf Javascript-Objekte. Führen Sie für den Test, wie es funktioniert, die folgenden Schritte in Ihrem Javascript-Code oder in Ihrer Javascript-Konsole aus:Überraschenderweise wird eine Zahl erstellt!
Und das schafft ein Array!
und dieses seltsame Ergebnis für
String
!Wenn Sie also ein Objekt erstellen, wird empfohlen, ein Objektliteral zu verwenden, einen Standardcode zu verwenden und einen Codeunfall wie oben zu vermeiden. Auch die Verwendung
{}
in Bezug auf die Leistung ist meiner Erfahrung nach besser!quelle