![](/img/trans.png)
[英]Javascript: How to create a variable that acts like both an object and a function?
[英]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.