Gibt es einen wesentlichen Unterschied bei beiden?
delete a.x;
vs.
a.x = undefined;
wo
a = {
x: 'boo'
};
könnte man sagen, dass sie gleichwertig sind?
(Ich berücksichtige keine Dinge wie "V8 verwendet nicht gerne delete
besser" )
javascript
bevacqua
quelle
quelle
undefined
als Wert zu, der immer noch ein ..Antworten:
Sie sind nicht gleichwertig. Der Hauptunterschied ist diese Einstellung
bedeutet, dass
a.hasOwnProperty("x")
immer noch true zurückgegeben wird und daher immer noch in einerfor in
Schleife und in angezeigt wirdObject.keys()
bedeutet, dass
a.hasOwnProperty("x")
false zurückgegeben wirdDie Art und Weise, wie sie identisch sind, besteht darin, dass Sie durch Testen nicht feststellen können, ob eine Eigenschaft vorhanden ist
Was Sie nicht tun sollten, wenn Sie feststellen möchten, ob eine Eigenschaft vorhanden ist, sollten Sie immer verwenden
Wenn Sie der Prototypenkette folgen (von zzzzBov erwähnt )
delete
, können Sie durch Aufrufen die Prototypenkette hochfahren , während beim Festlegen des Werts auf undefiniert nicht nach der Eigenschaft in den verketteten Prototypen gesucht wird. Http://jsfiddle.net/NEEw4/1/Löschen geerbter Eigenschaften Wenn die Eigenschaft, die Sie löschen möchten, vererbt
delete
wird, hat dies keine Auswirkungen. Das heißt, es werdendelete
nur Eigenschaften aus dem Objekt selbst gelöscht, keine geerbten Eigenschaften.Wenn Sie daher sicherstellen müssen, dass der Wert eines Objekts undefiniert ist
delete
und bei der Vererbung der Eigenschaft nicht funktioniert, müssen Sie ihnundefined
in diesem Fall festlegen (überschreiben) . Es sei denn, der Ort, der danach sucht, wird verwendethasOwnProperty
, aber es wäre wahrscheinlich nicht sicher anzunehmen, dass überall, wo es überprüft wird, es verwendet wirdhasOwnProperty
quelle
"x" in a
wird auchtrue
mit dem ersteren undfalse
mit dem letzteren zurückkehren. Die Ausgabe vonObject.keys
wird auch unterschiedlich sein.undefined
, können Sie auch einfach nachsehenif (a.x)
, es sei denn, es ist für Zahlen und 0 ist gültigUm die Frage zu paraphrasieren:
Nein.
Ersteres entfernt den Schlüssel aus der Variablen, letzteres setzt den Schlüssel mit dem Wert von
undefined
. Dies macht einen Unterschied, wenn Sie über Eigenschaften von Objekten iterieren und wann siehasOwnProperty
verwendet werden.Darüber hinaus wird dies einen signifikanten Unterschied machen, wenn die Prototypenkette beteiligt ist.
quelle
delete
zuzulassen, dass es die Prototypenkette hinaufgehtWenn
a.x
es sich um eine Setterfunktion handelt,a.x = undefined
wird die Funktion aufgerufen, während die Funktiondelete a.x
nicht aufgerufen wird.quelle
Ja, da gibt es einen Unterschied. Wenn Sie
delete a.x
das x verwenden, ist es keine Eigenschaft von a mehr, aber wenn Sie es verwendena.x=undefined
, ist es eine Eigenschaft, aber sein Wert ist undefiniert.quelle
Die Namen sind etwas verwirrend.
a.x = undefined
Setzt nur die Eigenschaft aufundefined
, aber die Eigenschaft ist immer noch da:delete
löscht es tatsächlich:quelle
Diese REPL vom Knoten sollte den Unterschied veranschaulichen.
quelle
Ich bin sicher, Sie können den Unterschied zwischen
var o1 = {p:undefined};
und sehenvar o2 = {};
.In beiden Fällen
o.p
wird esundefined
aber im ersten Fall sein, weil das der Wert ist und im zweiten Fall, weil es keinen Wert gibt .delete
ist der Operator, mit dem Sie vono1
(oder einem anderen Objekt, dem einep
Eigenschaft zugewiesen ist ) aufo2
diese Weise gelangen :delete o1.p;
.Die umgekehrte Operation wird durchgeführt, indem
undefined
der Eigenschaft einfach ein Wert zugewiesen wird ( in diesem Beispiel könnte es sich jedoch um etwas anderes handeln)o1.p = undefined;
.Also nein , sie sind nicht gleichwertig.
delete o.p;
werdenEntfernen Sie die Eigenschaft
p
aus dem Objekt, falls vorhandensonst nichts tun
o.p = undefined;
werdenFügen Sie
p
dem Objekt eine Eigenschaft hinzu , falls noch keine vorhanden ist, und setzen Sie den Wert aufundefined
Ändern Sie einfach den Wert der Eigenschaft, wenn das Objekt ihn bereits hat
Aus Sicht der Leistung
delete
ist dies schlecht, da dadurch die Struktur des Objekts geändert wird (genau wie beim Hinzufügen einer neuen Eigenschaft, wenn Sie diese nicht im Konstruktor initialisiert haben).Wenn Sie den Wert so einstellen, dass auch
undefined
der Inhalt freigegeben wird, ohne die Struktur zu ändern.quelle
Objekt ist einfach eine Baumdarstellung, dh im Speicher zeigt der Stamm auf verschiedene Speicherorte, an denen Schlüssel dieses Objekts gespeichert sind. und dieser Ort zeigt auf einen anderen Ort, an dem der tatsächliche Wert dieses Schlüssels gespeichert ist, oder auf Orte, an denen die untergeordneten Schlüssel gespeichert sind, oder auf Orte, an denen die Array-Werte gespeichert sind.
Wenn Sie einen Schlüssel mit delete aus einem Objekt löschen, wird tatsächlich die Verknüpfung zwischen diesem Schlüssel und seinem übergeordneten Objekt gelöscht, und die Speicherorte des Schlüssels und sein Wert werden freigegeben, um weitere Informationen zu speichern.
Wenn Sie versuchen, einen Schlüssel zu löschen, indem Sie undefined als Wert festlegen, legen Sie nur seinen Wert fest und löschen diesen Schlüssel nicht. Dies bedeutet, dass der Speicherort des Schlüssels weiterhin mit dem übergeordneten Objekt und dem Wert verknüpft ist, wenn der Schlüssel nicht definiert ist.
Die Verwendung von undefined anstelle von delete keyword ist eine schlechte Vorgehensweise, da der Speicherort dieses Schlüssels nicht freigegeben wird.
Selbst wenn der Schlüssel nicht vorhanden ist und Sie ihn als undefiniert festlegen, wird dieser Schlüssel mit Wert erstellt
undefined
.z.B
delete kann nicht mit geerbten Eigenschaften bearbeitet werden, da diese Eigenschaft nicht Teil dieses untergeordneten Objekts ist.
quelle
as a general rule of thumb, using 'delete' makes thing slower.
und developer.google.com/v8/designTo reduce the time required to access JavaScript properties, V8 does not use dynamic lookup to access properties. Instead, V8 dynamically creates hidden classes behind the scenes. In V8, an object changes its hidden class when a new property is added.
und schließlich smashingmagazine.com/2012/11/…Wenn ich ein Array anstelle eines Objekts verwende, kann ich zeigen, dass das Löschen weniger Heapspeicher als undefiniert benötigt.
Dieser Code wird beispielsweise nicht beendet:
Es erzeugt diesen Fehler:
Wie Sie sehen,
undefined
nimmt der Heap-Speicher tatsächlich in Anspruch.Wenn Sie jedoch auch
delete
das ary-Element verwenden (anstatt es nur auf zu setzenundefined
), wird der Code langsam beendet:Dies sind extreme Beispiele, aber sie weisen darauf hin,
delete
dass ich nirgendwo jemanden erwähnt habe.quelle