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

时间:2014-01-29 20:27:57

标签: javascript variables syntax reference slickgrid

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

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(###)/ format转换为正确的日期格式,以便在服务器上反序列化。这很好。

奇怪的问题是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]处的控制台日志都是相同的,人们会期望它们不同。意思是代替看到第二个日志没有更改/日期(###)/格式日期,正在打印正确的日期对象。

更奇怪的是,在[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);

希望这有助于将来查看此问题的其他人。

2 个答案:

答案 0 :(得分:3)

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

答案 1 :(得分:1)

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