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
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
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. –
@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. –