2015-05-23 13 views
5

Sto clonando una matrice di oggetti usando slice() ma quando passo quell'array clonato in un altro metodo i contenuti dell'array perdono i loro riferimenti e diventano undefined.Coffeescript/Javascript Perché, gli oggetti in una matrice clonata sembrano perdere i loro riferimenti quando vengono passati a un metodo?

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() 

Il primo console.debug mi dà, come ci si aspettava:

Choosing 10 items from [Item, Item] 

dove Item e Item sono esattamente quello che mi aspettavo.

Ma poi i prossimi console.debug linee mi danno

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

Capisco che @items.slice() crea una copia superficiale di @items, e come tale gli oggetti all'interno della matrice sono riferimenti agli stessi oggetti Item. Gli oggetti Item ovviamente esistono ancora in quanto sono ancora nell'array @items originale.

Perché, gli oggetti nell'array clonato sembrano perdere i loro riferimenti una volta all'interno del metodo process?

Vai a questa Working example of the problem converted to Javascript

+2

Si prega di inviare un link ad un esempio in esecuzione su jsfiddle, jsbin, codepen, requirebin o qualcosa del genere e poi dicci cosa vedi e cosa ti aspetti invece. Non ha molto senso eseguire il debug di un problema che dici esiste ma altri nei commenti dicono che non lo è. – rsp

+1

Sono riuscito a riprodurre l'errore ma non sono riuscito a ottenere il sito di script per il caffè per generare un URL ragionevole. vedi [questo jsfiddle] (http://jsfiddle.net/k0quf8v2/) comunque che viene convertito in javascript dal copione del caffè. Riproduce l'errore. –

+0

@DaveSag: Suggerisco di copiare il codice pertinente dal violino ** nella ** domanda, poiché il codice non ha il bit che rimuove le voci dall'array, il che causa il problema con la console in un secondo momento. Questo assicura che le domande rimangano utili per le persone in futuro, poiché i link esterni marciscono e SO è pensato per essere essenzialmente autosufficiente. –

risposta

2

Vai a questa risposta per ciò che sta accadendo nel codice:

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

Come si può vedere l'affettamento sta lavorando bene:

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();

Quello che state vedendo è che il vostro array viene spostato prima di estenderlo nella console. Se effettivamente stringa i l'oggetto che si può vedere che è stato superato con successo in.

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();

Problemi correlati