不太明白这其中的道理。在以下代码中localStorage
,项目的警告为undefined,但如果我使用if(x==undefined)
语法它不起作用。有人可以解释是什么问题。谢谢你。
alert(localStorage["x"]);
if(localStorage["x"]=="undefined"){alert("y");}
顶行警报未定义
底线不会提醒我。
不太明白这其中的道理。在以下代码中localStorage
,项目的警告为undefined,但如果我使用if(x==undefined)
语法它不起作用。有人可以解释是什么问题。谢谢你。
alert(localStorage["x"]);
if(localStorage["x"]=="undefined"){alert("y");}
顶行警报未定义
底线不会提醒我。
它不包含字符串"undefined"
,它包含类型的值undefined
:
if (localStorage["x"] == undefined) { alert("y"); }
该值undefined
可能在旧浏览器中更改,因此最好的做法是检查类型:
if (typeof localStorage["x"] == 'undefined') { alert("y"); }
尝试:
if(typeof( localStorage["x"]) == 'undefined'){alert("y");}
或者
if( localStorage["x"] == undefined){alert("y");}
或者
if( !localStorage["x"] ){alert("y");}
检查某物的两种方法undefined
是:
typeof foo === "undefined"
和
foo === undefined
在第一种情况下,它将是true
iffoo
从未定义或值为foo
is undefined
。
在第二种情况下,它只会是true
iffoo
被定义(否则它会中断)并且它的值是undefined
.
根据字符串检查它的值"undefined"
根本不一样!
更新:
当我说如果您尝试对未定义的对象文字的属性执行操作时,我想我的意思是它是否完全未定义,而我的意思更像是这样:
obj["x"].toLowerCase()
// or
obj["x"]["y"]
您尝试访问/操作原本是undefined
. 在这种情况下,简单地在if
语句中进行比较应该没问题,因为对象文字报告值的方式......但与普通的 Javascript 变量有很大不同。
对于对象字面量,如果未定义键(例如“x”),则
obj["x"]
返回 的值undefined
,因此 thetypeof
和 basic=== undefined
检查都将起作用并且是true
。
未定义或具有值的整体undefined
差异与正常变量不同。
如果你有:
var a;
// or
var a = undefined;
那么我之前提供的检查typeof
和基本检查都可以正常工作。但是,如果您甚至从未声明过,那么只有支票才能起作用。支票会坏掉。=== undefined
true
a
typeof
true
=== undefined
看看:http: //jsfiddle.net/7npJx/
如果您在控制台中注意到,它会说出b is not defined
并打破该if
声明。
由于您基本上是使用 来查看对象文字localStorage
,因此区分项目是否未定义或具有值的方法undefined
是首先使用in
。所以,你可以使用:
if (!("x" in localStorage)) {
检查“x”是否根本不是定义的属性,并且:
else if (localStorage["x"] === undefined) {
然后检查它是否已定义但值为undefined
. 然后,使用:
else {
将表示localStorage["x"]
已定义且不具有 value undefined
。
但是,在您的代码中,可以使用typeof
orin
检查(基于您想知道的内容),因为对象文字报告未定义属性的方式。使用基本=== undefined
也可以,但正如Guffa指出的那样,实际值可能undefined
会被覆盖,然后在此比较中不起作用。当涉及到普通的 Javascript 变量时,typeof
检查=== undefined
是不一样的。