【问题标题】:Javascript variable acts like reference instead of objectJavascript 变量就像引用而不是对象
【发布时间】:2014-01-29 20:27:56
【问题描述】:

我有一个无法完全解决的问题。

var records = dataView.getItems();

for (var i = 0; i < records.length; i++) {
    var date = records[i].RecordCreated;
    records[i].RecordCreated = new Date(parseInt(date.replace('/Date(', '')));
}

records = JSON.stringify(records);

这是一个小循环,它从 SlickGrid 数据视图中获取现有数据并将 /Date(###)/ 格式转换为适当的日期格式,以便在服务器上进行反序列化。这很好用。

奇怪的问题是var records = dataView.getItems(); 定义更像是一个引用,而不是一个单独的、唯一的对象。考虑以下代码:

var records = dataView.getItems();

// Debug Code [A]
console.log(records);
console.log(dataView.getItems());

for (var i = 0; i < records.length; i++) {
    var date = records[i].RecordCreated;
    records[i].RecordCreated = new Date(parseInt(date.replace('/Date(', '')));
}

// Debug Code [B]
console.log(records);
console.log(dataView.getItems());

records = JSON.stringify(records);

[B] 处的控制台日志都是相同的,但人们会认为它们会有所不同。意思不是看到第二个日志没有更改 /Date(###)/ 格式日期,而是打印正确的日期对象。

更奇怪的是,在 [A] 处,控制台日志正在打印,就好像循环异步运行并在调用 console.log() 命令之前完成。

这一切都包含在一个函数中,其中包含一些条件语句来执行不同的循环,这并不疯狂。我需要知道的是records 定义如何/为什么不能正常工作(内存中的一个唯一变量,可以在不影响原始对象的情况下进行编辑)。

解决方案


所以问题是记录从 SlickGrid 库接收原始对象。我解决此问题的方法是在将对象分配给记录之前对其进行克隆。

克隆功能:

function clone(obj) {
    if (obj == null || typeof (obj) != 'object')
        return obj;
    var temp = new obj.constructor();
    for (var key in obj)
        temp[key] = clone(obj[key]);
    return temp;
}

用法:

var __data = dataView.getItems();
records = clone(__data);

希望这对以后查看此问题的其他人有所帮助。

【问题讨论】:

  • 当您在控制台中展开这些记录的数组时,您是否看到一条消息“第一次展开时捕获下面的对象状态”?
  • @DCoder 这会在原型扩展中的某个地方吗?我在预期对象的展开视图中的任何地方都没有看到该消息。
  • 它通常显示为对象旁边的蓝色“i”图标,但在这种情况下,这不是真正的问题。根据 SlickGrid 的来源,Caleb 的回答是正确的。

标签: javascript variables syntax reference slickgrid


【解决方案1】:

看起来您的records 变量是一个从dataView.getItems() 返回的数组。该变量是对数组对象的引用,因此对该对象的更改将反映在对该对象的所有引用中。

【讨论】:

  • 我不知道您可以像在 javascript 中那样将变量声明为引用。我真的需要在某个时候深入研究一下这种语言的复杂性......感谢您的建议。
【解决方案2】:

您应该确保dataView.getItems() 在它返回的任何集合上调用Array.protototype.slice

【讨论】:

    猜你喜欢
    • 2015-08-30
    • 2011-06-14
    • 2018-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-23
    • 1970-01-01
    相关资源
    最近更新 更多