繁体   English   中英

Javascript变量的作用类似于引用而不是对象

[英]Javascript variable acts like reference instead of object

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

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

希望这可以帮助其他人将来查看此问题。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM