我最近问了关于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兼容的一致、标准化和跨浏览器兼容的方法,应该总是比其他方法更好。-克里斯多夫
我开始喜欢使用localStorage的速记点和括号符号,但我很想知道其他人对此的看法。是localStorage.getItem('item')比localStorage.item或localStorage'item‘or只要它们是速记符号,好吗?
发布于 2014-07-23 07:59:15
这个问题已经很老了,但既然问题中引用了我的话,我想我应该就我的发言说两句话。
Storage对象非常特殊,它是一个对象,它提供对键/值对列表的访问。因此,它不是一个普通的对象或数组。
例如,它有length属性,与数组length属性不同,它是只读的,并返回存储中的键数。
通过数组,您可以:
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和[]
访问之间应该没有区别,但是您永远不知道.
发布于 2013-06-09 09:57:00
我知道这是一篇老文章,但由于没有人真正提到性能,我设置了一些JsPerf测试来对其进行基准测试,getItem
和setItem
作为一个连贯的接口,也总是比使用点符号或括号更快,而且更容易阅读。
这是我的测试论JsPerf
发布于 2014-03-23 05:45:14
正如前面提到的,除了不存在的键外,几乎没有任何区别。取决于所使用的浏览器/操作系统的性能差异。但这并没有那么大的不同。
我建议您使用标准接口,因为这是推荐的使用方法。
https://stackoverflow.com/questions/12632463
复制相似问题