我有一個問題,我不能完全把我的手指放在。Javascript變量像對象引用而不是對象
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數據視圖取現有的數據和/日期(###)/格式轉換成適當的日期格式,以便在服務器上被反序列化。這工作正常。
奇怪的問題是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);
希望這有助於任何人在將來別人看這個問題。
當您在控制檯中擴大這些記錄的數組,你看到一條消息「對象狀態下面是在第一膨脹捕獲」? – DCoder
@DCoder這是原型擴展中的某個地方嗎?我沒有在預期對象的展開視圖中的任何位置看到該消息。 –
它通常顯示爲物體旁邊的藍色「i」圖標,但在這種情況下,它不是真正的問題。根據SlickGrid的來源,Caleb的答案是正確的。 – DCoder