2012-12-07 15 views
5

Rozważmy następujące JavaScript snippetdziwne zachowanie javascript z tablicami

var arr = []; 
function pushMe() 
{ 
     var temp = { "name": "me" }; 
     arr.push(temp) 
     console.log(arr) 
     temp["name"] = "you"; 
     arr.push(temp) 
     console.log(arr) 
} 

byłem zdumiony widząc wyjścia jak [Object { name="you"},Object { name="you"}]

Jak pchają odniesień, oba muszą odnosić się do tego samego obiektu. Ale przynajmniej po pierwszym wypychaniu musi być jak Object { name="me"}

Dlaczego tak się dzieje?

dzięki :)

+2

Tylko idiosyncrcrity logów konsoli w chrome – Esailija

+1

Pierwsze wyjście przychodzi jako '[Object {name =" me "}]' w Firefoksie, zgodnie z oczekiwaniami. – Sirko

Odpowiedz

6

Problem z konsolą Chrome jest to, że nie kopiuje obiekty, które przechodzą do niego.

Zanim Chrome zbuduje konsolę, zmieniły się wyświetlane obiekty.

Jeśli chcesz zobaczyć swoje „ja”, spróbuj tego:

var arr = []; 
    var temp = { "name": "me" }; 
    arr.push(temp) 
    console.log(arr) 
    setTimeout(function(){ 
     temp["name"] = "you"; 
     arr.push(temp) 
     console.log(arr) 
    }, 3000); 

i zajrzeć do środka tablicy w mniej niż 3 sekundy.

Fiddle: http://jsfiddle.net/TMDq2/

Niektórzy mogą zobaczyć go jako błąd, niektóre jako optymalizację. Jest to przynajmniej implementacja z pogranicza ...

+1

Zostałem ugryziony kilka razy z powodu tej "cechy". Jeśli korzystasz z dziennika do debugowania, w Chrome lepiej jest rejestrować jsonową reprezentację obiektu lub możesz przegapić problemy z nadpisywaniem w trakcie działania programu. – Eineki