2015-05-23 2 views
5

Ich klonen ein Array von Objekten mit slice(), aber wenn ich das geklonte Array in eine andere Methode übergeben, verlieren die Inhalte des Arrays ihre Referenzen und werden undefined.Coffeescript/Javascript Warum verlieren die Objekte in einem geklonten Array ihre Referenzen, wenn sie an eine Methode übergeben werden?

class Chooser 
    constructor: (@order, @items) -> 
    # do stuff 

    choose: -> 
    console.debug "Choosing", @order.size, "from", @items.slice() 
    @process(@order.size, @items.slice()) 
    # do stuff 

    process: (count, items) -> 
    console.debug "count", count 
    console.debug "items", items 
    console.debug "@items", @items 
    # do recursive stuff that includes an items.shift() 

Die erste console.debug gibt mir, wie erwartet:

Choosing 10 items from [Item, Item] 

wo Item und Item sind genau das, was ich erwartet hatte.

Aber dann die nächsten console.debug Linien geben Sie mir

count 10 
items [undefined x 2] 
@items [Item, Item] 

Ich verstehe, dass @items.slice() eine flache Kopie @items, und als solche die Objekte innerhalb des Arrays sind Verweise auf die gleiche Item Objekte erstellt. Die Objekte Item sind offensichtlich noch vorhanden, da sie immer noch im ursprünglichen @items Array sind.

Warum scheinen die Objekte im geklonten Array ihre Referenzen einmal innerhalb der process Methode zu verlieren?

Sehen Sie diese Working example of the problem converted to Javascript

+2

Bitte einen Link zu einem Beispiel Post läuft auf jsfiddle, jsbin, codepen, requirebin oder so ähnlich und dann sagen Sie uns, was Sie sehen und was Sie stattdessen erwarten. Es macht nicht viel Sinn, ein Problem zu debuggen, von dem Sie sagen, dass es existiert, aber andere in den Kommentaren sagen, dass es das nicht gibt. – rsp

+1

Ich habe es geschafft, den Fehler zu reproduzieren, aber konnte nicht die Kaffee-Skript-Website eine sinnvolle URL erstellen. siehe [this jsfiddle] (http://jsfiddle.net/k0quf8v2/) aber was aus Javascript in Javascript konvertiert wird. Es reproduziert den Fehler. –

+0

@DaveSag: Ich schlage vor, den relevanten Code von der Geige ** in ** die Frage zu kopieren, da der Code dort nicht das Bit hat, das die Einträge aus dem Array entfernt, was später das Problem mit der Konsole verursacht. Dies stellt sicher, dass Fragen für Menschen in der Zukunft nützlich bleiben, da externe Links verrotten und SO im Wesentlichen in sich abgeschlossen sein soll. –

Antwort

2

für diese Antwort Sehen Sie, was in Ihrem Code geschieht:

https://stackoverflow.com/a/24176638/635411

Wie Sie das Aufschneiden sehen adaequat:

var MyClass = (function() { 
 
    
 
    function MyClass(items) { 
 
    this.items = items; 
 
    } 
 
    
 
    MyClass.prototype.fn1 = function() { 
 
    console.log(this.items); 
 
    this.fn2(this.items.slice()); 
 
    }; 
 
    
 
    MyClass.prototype.fn2 = function(items){ 
 
    console.log(items); 
 
    }; 
 
    
 
    return MyClass; 
 
})(); 
 

 
new MyClass([{id:1, name:'a'}, {id:2, name:'b'}]).fn1();

Sie sehen, dass Ihr Array verschoben wird, bevor Sie es in der Konsole erweitert haben. Wenn Sie das Objekt tatsächlich stringify können Sie sehen, dass es erfolgreich in geben wurde.

var MyClass = (function() { 
 
    
 
    function MyClass(items) { 
 
    this.items = items; 
 
    } 
 
    
 
    MyClass.prototype.fn1 = function() { 
 
    console.log(this.items); 
 
    this.fn2(this.items.slice()); 
 
    }; 
 
    
 
    MyClass.prototype.fn2 = function(items){ 
 
    console.log(items); 
 
    console.log(JSON.stringify(items, null, 2)); 
 
    items.shift(); 
 
    items.shift(); 
 
    }; 
 
    
 
    return MyClass; 
 
})(); 
 

 
new MyClass([{id:1, name:'a'}, {id:2, name:'b'}]).fn1();

Verwandte Themen