2012-05-16 40 views
4

我需要在localStorage中存儲一個對象 - 而且我知道爲了這樣做,我必須將該對象轉換爲字符串。很酷。LocalStorage,JavaScript和Objects

我的問題是在實際上創建對象的第一個地方:我有兩個值在sessionStorage需要被添加到對象,然後傳遞到localStorage。但是,當我嘗試創建對象時,一個值將被存儲爲變量名稱而不是其(數值)值。任何想法這裏發生了什麼?

var siteName = sessionStorage['1']; 
var siteID = (+sessionStorage['2']); 
var temp = {siteID:siteName}; 
alert(typeof siteID); 
alert(JSON.stringify(temp)); 

第一警報確認的siteID確實是一個數字型的,但第二類提醒顯示,變量名稱(的siteID)被存儲,而不是它的數字值。

回答

4

這條線:

var temp = {siteID:siteName}; 

...創建包含一個稱爲siteIdsiteName變量採取的值屬性的對象。

如果你想從siteID變量,而不是採取的屬性名稱:

var temp = {}; 
temp[siteID] = siteName; 

還是在ES2015(又名「ES6」),你可以使用新的計算的屬性名語法:

// ES2015+ only! 
var temp = {[siteId]: siteName}; 

在JavaScript中,您可以通過兩種不同但相同的方式訪問/創建對象的屬性:使用帶有文字屬性名稱的虛線符號:

obj.foo = "bar"; // Creates a `foo` property on `obj` with the value `"bar"` 

...或使用括號符號和字符串:

obj["foo"] = "bar"; // Does the same thing 

在對象初始化喜歡的按鍵你var temp = {siteID:siteName};總是字面意義(雖然他們可以選擇在引號);對象初始化器沒有辦法使用從變量中取得的關鍵字。所以你必須把它作爲一個兩步過程,首先創建對象,然後設置屬性。

所以,如果你做

temp[siteID] = siteName; 

...在siteID數量將被轉換爲字符串,並會成爲樓市的名稱,與siteName是價值的價值。

var temp = {}; 
var key = 1; 
temp[key] = "value"; 
console.log(temp[1]); // "value" 
console.log(temp["1"]); // "value" 

(屬性名稱始終是JavaScript中的字符串[現在]。)

+1

現貨,謝謝! – Squishy

+0

@Squishy:不客氣,很高興幫助。 –

+0

也感謝您的解釋(首先看到您的編輯版本)) - 清楚地解釋了3個無用的教程無法做到的! – Squishy

2

將其更改爲此。

var temp = {}; 

temp[siteName] = siteID; 

或者如果typeof測試是爲了顯示屬性名稱,您可以將其取消。

var temp = {}; 

temp[siteID] = siteName; 

但要知道,siteID被認爲是從該點向前的字符串。

+1

我認爲你有鑰匙/價值倒退 – Mathletics

+0

@Mathletics:是的,你是對的。我對'typeof'測試感到困惑,認爲這應該是價值。我會更新。感謝提示。 –

+1

完美,謝謝! – Squishy