2012-12-20 87 views
3

無法完全理解此原因。在以下代碼中,項目的localStorage會提示爲undefined,但如果我使用if(x==undefined)語法,則不起作用。有人可以解釋什麼是問題。謝謝。localStorage警報未定義,但是如果undefined爲false

alert(localStorage["x"]); 

if(localStorage["x"]=="undefined"){alert("y");} 

頂行提醒不確定

的底線,我不提醒ÿ

+0

[Duplicate?](http://stackoverflow.com/questions/4706347/javascript-comparing-2-checks-for-localstorage)。使用'if(typeof window.localStorage ['x']!='undefined')' – elclanrs

+0

''undefined'!== undefined' –

回答

5

它不包含字符串"undefined",它包含了類型undefined值:

if (localStorage["x"] == undefined) { alert("y"); } 

undefined有可能在舊的瀏覽器來改變,所以好的做法是檢查,而不是類型:

if (typeof localStorage["x"] == 'undefined') { alert("y"); } 
+0

你是如此的正確。謝謝您的幫助。 –

+0

爲什麼downvote?如果你不解釋你認爲是錯誤的,它不能改善答案。 – Guffa

+0

我用過這個,但是當我在瀏覽器上按下刷新時,它會從我想要定義的文本開始。如果我清除本地存儲,它會返回到我想要的消息,然後再次按刷新後未定義。 – daddycardona

1

嘗試:

if(typeof(localStorage["x"]) == 'undefined'){alert("y");} 

OR

if(localStorage["x"] == undefined){alert("y");} 

OR

if(!localStorage["x"]){alert("y");} 
1

檢查的東西是undefined的兩種方式是:

typeof foo === "undefined" 

foo === undefined 

在第一種情況下,它將是true如果foo從未定義foo的值是undefined

在第二種情況下,也只會是true如果foo被定義(否則它會打破)其值爲undefined

檢查其對字符串"undefined"的值是不一樣的!

UPDATE:

當我說,如果你嘗試在一個沒有被定義對象文本的屬性進行操作,我想我的意思是,如果它是不確定的一切,我的意思是什麼更多類似這樣:

obj["x"].toLowerCase() 
// or 
obj["x"]["y"] 

您試圖訪問/操作本來是undefined的東西。在這種情況下,簡單地在if語句中進行比較應該沒問題,因爲對象字面值報告值的方式......但與正常的Javascript變量非常不同。

使用對象常量,如果一個密鑰(說的「x」)沒有被定義,則

obj["x"] 

返回undefined的值,所以無論是typeof和基本=== 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"]既定義的,並不具有價值undefined

在您的代碼中,由於對象文字報告屬性未定義的方式,因此可以使用typeofin檢查(基於您想知道的內容)。使用基本的=== undefined也是可以的,但如Guffa指出,可能會覆蓋undefined的實際值,然後在此比較中不起作用。當涉及到正常的Javascript變量時,typeof=== undefined檢查是不一樣的。

+0

非常詳細的答案。非常感謝! –

+0

對不起,您在這裏有一個錯誤:*「在第二種情況下,只有當foo被定義(否則它會中斷)它的值纔會成立,並且它的值是未定義的。」*這是不正確的。讀取未定義的屬性將返回值undefined。演示:http://jsfiddle.net/Guffa/9usJJ/ – Guffa

+0

@Guffa感謝您指出。我不知道我在想什麼。我想我非常關注如何將正常變量報告爲「未定義」,以致於我忘記了這些對象文字是如何處理的......雖然只要你這麼說,那是一個「哦,我怎麼可能忘記」時刻。真正的問題是比較字符串「undefined」。我更新了我的答案,希望能夠首先展示我的內容,並且更準確 – Ian