4

我需要在 localStorage 中存储一个对象——我知道为了这样做,我必须将对象转换为字符串。都很酷。

我的问题是首先创建对象:我在 sessionStorage 中有两个值需要添加到对象中,然后将其传递给 localStorage。但是,当我尝试创建对象时,一个值被存储为变量名,而不是它的(数字)值。知道这里发生了什么吗?

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

第一个警报确认 siteID 确实是数字类型,但第二个警报显示存储变量名称 (siteID) 而不是其数值。

4

2 回答 2

4

这一行:

var temp = {siteID:siteName};

...创建一个包含属性的对象,该属性siteId使用从siteName变量中获取的值调用。

如果您希望从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;

... in 中的数字siteID将转换为字符串,并将成为属性名称,其中 valuesiteName是 value。

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

(属性名称在 JavaScript [暂时] 中始终是字符串。)

于 2012-05-16T13:21:39.427 回答
2

改成这样。

var temp = {};

temp[siteName] = siteID;

或者,如果typeof测试旨在显示属性名称,您可以反转它们。

var temp = {};

temp[siteID] = siteName;

但请注意,siteID从那时起,它被视为一个字符串。

于 2012-05-16T13:21:30.837 回答