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

标签 javascript arrays coffeescript clone slice

我正在使用 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

最佳答案

请参阅此答案以了解您的代码中发生的情况:

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

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

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

关于javascript - Coffeescript/Javascript 为什么,克隆数组中的对象在传递给方法时似乎丢失了它们的引用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30411610/

相关文章:

javascript - Coffee 脚本 - 保留类上下文和事件上下文

javascript - 响应元素显示 :none; at mobile width then brought back by javascript button but links break on display:block;

javascript - Twitter 集合网格不支持 AngularJS

javascript - 为什么我的输入值不求和?

javascript - 使用没有 sort() 方法的数字对数组进行排序

python - 逃生舱 Google Foobar 挑战 |最大流量问题

javascript - 使用咖啡 CLI,我如何将变量分配给所需的文件?

javascript - 在函数 CoffeeScript 中获取对象值

javascript - 使用回调 stub 函数

java - 如何在java中创建一个保存数组的数组