Coffeescript / Javascript 为什么,克隆数组中的对象在传递给方法时似乎丢失了它们的引用?

Coffeescript / Javascript Why, do the objects in a cloned array seem to lose their references when passed to a method?

我正在使用 slice() 克隆一个对象数组,但是当我将该克隆的数组传递给另一个方法时,该数组的内容正在丢失它们的引用并变成 undefined.

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

第一个 console.debug 给了我预期的结果:

Choosing 10 items from [Item, Item]

其中 ItemItem 正是我所期望的。

但是接下来的 console.debug 行给了我

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

我知道 @items.slice() 创建了 @items 浅层 副本,因此数组中的对象是对相同 Item 对象。 Item 对象显然仍然存在,因为它们仍在原始 @items 数组中。

为什么,克隆数组中的对象似乎在 process 方法中丢失了一次引用?

看到这个Working example of the problem converted to Javascript

查看此答案以了解您的代码中发生的情况:

如您所见,切片工作正常:

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

您看到的是您的数组在您在控制台中展开之前被移动了。如果你真的将对象字符串化,你可以看到它已成功传入。

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