2014-01-29 39 views
1

我有一個問題,我不能完全把我的手指放在。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); 

希望這有助於任何人在將來別人看這個問題。

+0

當您在控制檯中擴大這些記錄的數組,你看到一條消息「對象狀態下面是在第一膨脹捕獲」? – DCoder

+0

@DCoder這是原型擴展中的某個地方嗎?我沒有在預期對象的展開視圖中的任何位置看到該消息。 –

+0

它通常顯示爲物體旁邊的藍色「i」圖標,但在這種情況下,它不是真正的問題。根據SlickGrid的來源,Caleb的答案是正確的。 – DCoder

回答

3

看起來像你的records變量是從dataView.getItems()返回的數組。這個變量是對數組對象的引用,所以對該對象的改變將反映在對象的所有引用中。

+0

我不知道你可以在javascript中聲明一個變量作爲參考。我真的需要在某種程度上深入研究這種語言的複雜性......感謝您的建議。 –

1

您應該確保dataView.getItems()電話上的任何集合Array.protototype.slice它返回