2016-08-02 5 views
0

Teil eines größeren Programms AngularJS verwenden, das Codefragment:x = {} erzeugt spontanes Objekt

var thePortList = $scope.ipPortList; // an array of objects 
... 
... 
console.log("before", $scope.ipPortList, thePortList); 
thePortList[i] = {}; 
console.log("after", $scope.ipPortList, thePortList); 

Schaff diese Ausgabe:

before [] [] 
after [2: Object] [2: Object] 

Ich habe keine Ahnung, warum. Ich könnte erwarten, dass etwas in einem Multi-Thread-Programm, aber nicht in Javascript zu sehen.

x = {} sollte diesem Element im Array ein neues, leeres Objekt zuweisen. Recht? Ich bin verblüfft über dieses Verhalten. Kann jemand etwas Licht abwerfen?

Getestet in Chrome auf meinem lokalen Rechner und Plunkr.

Plunkr hier:

komplette plunkr Konsolenausgabe: Plunker Link

Event tracked Multipane Show Preview Toolbar undefined undefined 
editor-0.11.1.js:2 URL visited /?p=preview 
VM631:29 portList [] 
VM631:34 processing 0 [] undefined 
VM631:39 skipping 0 
VM631:34 processing 1 [] undefined 
VM631:39 skipping 1 
VM631:34 processing 2 [] undefined 
VM631:45 before [] [] 
VM631:47 after [2: Object] [2: Object] 
+3

Was ist Ihre erwartete Ausgabe? Ist das Problem, dass das Objekt in * beiden * von '$ scope.ipPortList' und' thePortList' auftritt? Weil das korrekte Verhalten ist, da beide auf das gleiche Array verweisen. – nnnnnn

+0

Können Sie uns sagen, was Ihr erwartetes Verhalten war? –

Antwort

1

Es ist ein richtiges Verhalten, ich glaube, Sie die Bedeutung von Log-Informationen falsch verstehen. Sie können diesen Code in der Konsole versuchen, und das Ergebnis:

var a=[]; 
a[2]={}; 
a 

output: [undefined × 2, Object__proto__: Object] 

Das Konsolenprotokoll info ‚[2: Object]‘ 2 undefined weggelassen, in JavaScript, wenn Sie Wert auf ein Array-Element zuordnen, die aus Seine Länge wird nicht definiert, wenn versucht wird, auf das Element von der Ursprungslänge bis zum Index zuzugreifen, und nicht, weil das Array automatisch undefiniert gefüllt wird, da dies die Standardantwort auf den Zugriff auf eine nicht vorhandene Eigenschaft ist. In Wirklichkeit hat sich nichts verändert außer der Array-Länge.

+2

* "Wenn Sie einem Array-Element einen Wert außerhalb seiner Länge zuweisen, wird undefined automatisch abgeschlossen, bis der Elementindex" * - JS keine Elemente mit dem Wert undefined erstellt 'um die Lücke zu füllen. Das heißt, es gibt einen Unterschied zwischen einem fehlenden Element, das nie einen Wert hatte, und einem Element, dem explizit der Wert "undefiniert" zugewiesen wurde. (Aber die Konsole lässt Sie wissen, wie viele Elemente fehlen.) – nnnnnn

+0

@nnnnnn ein interessanter Beweis dafür ist, dass "Array (2) .forEach (i => console.log (i))" und "[undefined, undefined ] .forEach (i => console.log (i)) 'erzeugt unterschiedliche Ausgaben. Einer ist ein leeres Array, dessen Länge auf 2 gesetzt wurde, das andere ist ein Array mit 2 tatsächlichen undefinierten in ihm –

+0

@nnnnnn ist richtig, ich habe die Antwort korrigiert. – jarvanJiang

Verwandte Themen