2013-10-18 56 views
2

表現不同,我只是想這個JS代碼 -不確定型JS

if(a){ 
    console.log("a IS DEFINED") 
} else { 
    console.log("a IS UNDEFINED") 
} 

,我得到錯誤 -

ReferenceError: a is not defined 

但是當我添加var a它打印a IS UNDEFINED

var a; 
if(a){ 
    console.log("a IS DEFINED") 
} else { 
    console.log("a IS UNDEFINED") 
} 

// prints a IS UNDEFINED 

爲什麼它在兩種情況下的行爲都不一樣aundefined

+0

'if(typeof a!=='undefined')' – elclanrs

+0

它的類型在這兩種情況下都是未定義的。 –

+0

在第一種情況下,未定義a,但在第二個實例中聲明瞭a,但它攜帶未定義的值。 如果你把一個= 0或一個=「」,它仍然會給你「一個IS未定義」。 希望我很清楚。 – Rayon

回答

5

你的困惑是完全可以理解的:這是「未定義」這個詞的兩種不同用法。

有一個未定義的標識符undefined之間的差。

當你

if (a) 

...你想採取標識符a的價值。如果您還沒有定義標識符,那麼這是ReferenceError的全部。 JavaScript引擎不知道a是什麼意思。

與此相反,這樣的:

var a; 

限定標識符(作爲變量),並賦予它的初始值undefined。所以,那麼,當你做

if (a) 

... JavaScript引擎知道你在說什麼:它轉到變量a並得到其價值。

如果由於某種原因,你需要知道,如果一個標識符被定義,你不想要捕獲錯誤,你被允許採取一個未定義的標識符的類型:

if (typeof a === "undefined") 

即使a完全未定義,這也可以工作(沒有錯誤)。但是,它沒有區分這兩件事情(一個未定義的標識符和一個已定義的標識符,其值爲undefined)。現在


,彷彿這還不夠混亂,在「寬鬆模式」 JavaScript有一個很奇怪的行爲,我稱之爲The Horror of Implicit Globals:如果您分配給一個未定義的標識符(而不是嘗試讀取它的值),而不是給出ReferenceError,它會創建一個新的全局變量。值得慶幸的是,我們現在擁有ES5的「嚴格模式」,這使得它始終應該發生錯誤。:-)

0

我會建議你使用:

if (typeof a === 'undefined') { 
    console.log('a IS UNDEFINED'); 
} else { 
    console.log('a IS DEFINED'); 
} 

一個變量的undefined類型,如果它有沒有價值,或者如果它沒有前宣佈。

0

總之,當你不聲明一個變量,但使用它的代碼裏面,它得到的ReferenceError因爲你是指向變量不能簡稱。但是當你聲明變量,但沒有初始化它,那麼值不是定義爲

例子:

第一種情況:

if(j){ 
    //do something 
} 

沒有申報Ĵ,而是指it.So它會給,因爲沒有得到Ĵ的未定義錯誤作爲聲明/已知變量。

第二種情況:

var j; 
if(j){ 
    //do something 
} 

這裏Ĵ== NULL真正,但如果(J)將相當於如果(空)是一樣的,如果(假) ,不是因爲jnull。而是因爲jundefined