是localStorage.getItem( '项目'),比localStorage

2019-06-18 08:43发布

最近,我问一个关于localStorage的问题 。 使用JSON.parse(localStorage.item)JSON.parse(localStorage['item'])没有工作,返回NULL时,该项目是尚未设置。

然而, JSON.parse(localStorage.getItem('item')所做的工作。而事实证明, JSON.parse(localStorage.testObject || null)也适用。

一位评论基本上说, localStorage.getItem()localStorage.setItem()应始终优先考虑:

getter和setter提供一致的,标准化和跨浏览器兼容的方式与LS API的工作,应始终优先于其他方式。 - 克里斯托夫

我来喜欢用简写点和支架符号用于本地存储,但我很好奇,想知道别人拿到这个。 是localStorage.getItem(“项目”)优于localStorage.item或localStorage的[“项目”]或者只要他们的工作是速记符号好吗?

Answer 1:

直接属性访问( localStorage.itemlocalStorage['item']并使用所述功能接口( getItem('item')很好地工作。 两者都是标准的,跨浏览器兼容。 *根据规范 :

存储对象所支持的属性名称是每个键/值对的密钥目前存在于与对象相关联的列表中,在为了使添加到存储区的键上次。

他们只是不同的表现时没有键/值对发现请求的名称。 例如,如果键'item'不存在, var a = localStorage.item; 会导致aundefined ,而var a = localStorage.getItem('item'); 将导致a具有值null 。 正如你所发现的, undefinednull都没有在JavaScript / EcmaScript的互换。 :)

编辑:由于在克里斯托弗指出他的回答 ,功能接口是可靠地存储并在等于所述预定义的属性键检索值的唯一方法localStoragelengthkeysetItemgetItemremoveItem ,和clear )。 所以,举例来说,下面将始终工作:

localStorage.setItem('length', 2);
console.log(localStorage.getItem('length'));

请特别注意,第一个语句不会影响物业localStorage.length (也许除了递增,如果没有关键的'length'已经在localStorage )。 在这方面,该规范似乎是相互矛盾的。

但是,以下可能不会做你想要的:

localStorage.length = 2;
console.log(localStorage.length);

有趣的是,首先是一个无操作在浏览器,但与在Firefox功能呼叫同义。 第二个将随时登录出现在按键的数量localStorage

* 这是支持摆在首位的网络存储浏览器真的。 (这包括几乎所有的现代桌面和移动浏览器。)对于使用cookie或其他技术来模拟本地存储环境中,行为取决于所使用的垫片。 几个polyfills localStorage可以发现在这里 。



Answer 2:

现在的问题是已经很老了,但因为我已经在这个问题被引用,我想我应该说我的发言两个字。

存储对象比较特殊,它是一个对象,它提供了访问键/值对的列表。 因此它不是一个普通的物体或阵列。

例如,它具有长度属性,它不像数组长度属性为只读属性,并返回到存储的密钥的数量。

对于数组,你可以这样做:

var a = [1,2,3,4];
a.length // => 4
a.length = 2;
a // => [1,2]

在这里,我们必须使用getter / setter方法的第一个原因。 如果你想设置称为项目length

localStorage.length = "foo";
localStorage.length  // => 0
localStorage.setItem("length","foo");
// the "length" key is now only accessable via the getter method:
localStorage.length  // => 1
localStorage.getItem("length") // => "foo"

与存储对象的其他成员,它甚至更为重要,因为它们是可写的,你可以不小心覆盖类似方法getItem 。 使用API​​方法防止任何这些可能出现的问题,并提供一致的界面。

另外有趣的一点是在规范(由我强调)以下内容:

的setItem()和removeItem()方法必须是原子相对于故障。 在失败的情况下,该方法不起作用。 也就是说,更改数据存储区必须是成功的,或者数据存储区域不得发生任何变化。

从理论上讲,应该有一个getter / setter方法和没有什么区别[]的访问,但你永远不知道...



Answer 3:

我知道这是一个老的文章,但因为没有人真正提到的性能我设置一些JsPerf测试基准,并以及作为一个连贯接口getItemsetItem也始终快于使用点符号或支架,以及作为更容易阅读。

下面是我的测试上JsPerf



Answer 4:

至于有人提到,有除不存在的关键的几乎没有差别。 在性能差而变化取决于什么浏览器/操作系统您使用。 但它是不是真的那么不同。

我建议你使用标准接口,只是因为它是使用它的推荐方式。



文章来源: Is localStorage.getItem('item') better than localStorage.item or localStorage['item']?