Javascript 为什么localStorage[";…";]未定义,但localStorage.getItem(";…";)为空?

Javascript 为什么localStorage[";…";]未定义,但localStorage.getItem(";…";)为空?,javascript,null,local-storage,undefined,Javascript,Null,Local Storage,Undefined,上次我检查时,以下两行返回了true: null == localStorage["foo"]; null == localStorage.getItem("foo"); 将null替换为undefined时同样适用。 所以第一个问题是,为什么有两种方法来解决本地存储?为什么 localStorage["foo"] 返回未定义的while localStorage.getItem("foo") 返回null 在开发JS时我需要注意这一点吗?localStorage[“…”]对localSt

上次我检查时,以下两行返回了
true

null == localStorage["foo"];
null == localStorage.getItem("foo");
null
替换为
undefined
时同样适用。 所以第一个问题是,为什么有两种方法来解决本地存储?为什么

localStorage["foo"]
返回
未定义的
while

localStorage.getItem("foo")
返回
null

在开发JS时我需要注意这一点吗?

localStorage[“…”]
对localStorage的使用是无效的。您正在尝试访问
localstorage
对象的方法,而不是访问实际的数据库

你必须使用

localStorage.getItem("...")

访问存储数据库的方法。

对于未知键,
.getItem()
返回
null

但是请注意,
.getItem()
.setItem()
在IDL中被明确定义为
存储接口的
getter
setter
,因此它们也是访问存储内容的完全受支持的方式

但是,
[]
语法更类似于普通的对象和/或数组属性getter,类似于为未知属性名返回
未定义的

不使用
[]
语法的原因是,它将首先对对象属性进行操作,并允许您覆盖
本地存储
对象的实际属性和方法,c.f:

> localStorage['getItem'] = function() { return 0 }
> localStorage.getItem('getItem')
0

在javascript中,对于对象中不存在的键,总是会得到一个
未定义的

a = {}; //new object
alert(a["test"]); // you get 'undefined' because "test" keys is not found
在localStorage中,
.getItem
是一种方法,它检查localStorage对象内的键,如果未找到,则返回
null


不要责怪javascript,这只是本地存储对象的行为

啊,javascript的乐趣。@RobertHarvey语言很好,是实现变体杀死了它:(当然,无论它返回
未定义的
还是
空的
,你还是要处理它。为什么不检查两者呢?另请看@RobertHarvey,如果必要的话,我会这样做,但我想避免不必要的开销,这就是为什么像这样的问题困扰着我。如果未定义的东西总是返回
真的
再次检查
null
,为什么我要(另外)检查它是否未定义?请参阅下面的muchweb的答案。另外,检查我在上面发布的链接;使用
==
null
也检查
未定义的
。但是你可以“交叉使用”这两个语法。使用
setItem()
进行设置,并使用
[]
的工作原理与另一种方法一样好。事实上,在我的Chrome(41?)上,当前的键都出现在
对象中。键(本地存储)
.getItem
显然更安全,但很难断言
[]
方法无效。@jaySon使用
本地存储['foo']='bar';
不应该返回错误,但它只是在localStorage对象中创建了一个项很抱歉,但我看不出使用这两种语法创建的项之间有什么区别。它们的外观和行为完全相同,那么“它只是创建了一个项”是什么意思?@vihan1086这显然是不正确的。如果我写
localStorage['foo']='bar'然后,我不仅可以在调试器中检查该值,而且
.length`属性也会更改,最重要的是,该值将保留在我的浏览器中!关于覆盖“真实”本地存储属性的最后一句话是否仍然适用?到今天为止,我无法重现(在Firefox Developer Edition中)。在当前Chrome(51.0.2704.79)上,执行代码会给我
“function(){return 0}”
@jaySon,它仍然返回零。@jaySon,Chrome 55.0.2883也一样。95@jaySon仍然是铬68.0.3440.106
a = {}; //new object
alert(a["test"]); // you get 'undefined' because "test" keys is not found