2012-04-09 6 views
0

Ich habe experimentiert mit Javascript Objekt Literal Notation vs Funktionen mit Prototypen und habe in einen Fehler, den ich nicht herausfinden kann laufen.Unerwartete Verhalten mit Javascript Objekt Literal Notation

Hier ist der entsprechende Code:

var MyTestObj = { 

    myTestFunction: function() { 
    var myArray = [] 

    console.log('Before:'); 
    console.log(myArray); 
    console.log(myArray.length); 
    console.log('---'); 

    for (var mi = 0; mi < 5; mi++) { 
     myArray.push(1); 
    } 

    return myArray; 
    } 
} 

Wenn ich rufe console.log (arr) ich es erwartet hatte Ausgang [], sondern ich dieses:

> MyTestObj.myTestFunction() 
    Before: 
    [1, 1, 1, 1, 1] 
    0 
    --- 
    [1, 1, 1, 1, 1] 

Kann jemand erklären, warum myArray hat bereits einen Wert, wenn ich es vor der Schleife ausgab? Und warum gibt es unmittelbar danach die richtige Länge (0) aus?

Schätzen Sie die Hilfe.

+2

http://stackoverflow.com/a/8249333/798880 – Saxoier

+0

Protokollierung auf der Konsole ein weirdly langsamer Vorgang ist, ich denke, es ist nur ein Leistungsproblem gibt ... Als es um tatsächlich bekommt zu schreiben Es ist bevölkert. Geschieht mir gelegentlich, wo ich ein Objekt protokollieren werde, das zerstört/gelöscht wird, und ich kann auf keine seiner Eigenschaften zugreifen. – JKing

Antwort

3

Es ist eine Eigenart von Chrome und Safari-Konsole. Das Array wird nicht sofort zur Anzeige ausgewertet.

Wenn Sie .slice() es, wird es ordnungsgemäß angezeigt, da das Array nur Primitive hat.

console.log('Before:'); 
console.log(myArray.slice()); // <-- copy the Array 
console.log(myArray.length); 
console.log('---'); 
+0

Chrome Konsole, richtig? Ich denke, Firebug macht das nicht. – bfavaretto

+0

@bfavaretto: Ich denke du hast Recht damit. Definitiv in Chrome. Ich werde aktualisieren. –

+1

Perfekt, danke Jungs. –