2010-03-28 29 views
7

我在做這個惡意的JavaScript行一些嘗試:var undefined = true;var undefined = true;

在JavaScript中每一個未初始化的變量有undefined其價值僅僅是持有'undefined'特殊值的變量,所以下面應該執行alert

var undefined = true, 
    x; 

if (x) { 
    alert('ok'); 
} 

但它沒有,我的問題是爲什麼?

在進一步的實驗,我試過如下:

var undefined = true, 
    x = undefined; 

if (x) { 
    alert('ok'); 
} 

這一次,alert執行。

所以我的問題是...因爲在第一個片段x包含undefined(因爲它沒有初始化),爲什麼alert沒有執行?奇怪的是,明確說明時xundefinedx = undefined),該alert執行...

回答

17

名爲undefined的變量與名爲undefined的值之間存在差異。

var undefined = true, 
    x; 

在此示例中,變量undefined被設置爲值true,和x到的值(不變量!)undefined

var undefined = true, 
    x = undefined; 

在此示例中,變量undefined被設置爲值true,以及,x被設置爲包含在變量undefined的值(這是true)。

因此,儘管您可以聲明名爲undefined的變量,但您不能更改非初始化變量設置爲值undefined的事實。

+0

呵呵;如果變量'undefined'的值是'undefined',會發生什麼? – Pindatjuh 2010-03-28 20:03:06

+3

@Pindatjuh:就像變量有其他名字一樣。對於一個名爲'undefined'的變量沒有什麼特別之處。 – dtb 2010-03-28 20:25:42

1

僅定義了一個名爲「未定義」變量並不意味着你覆蓋了內置的什麼概念原生的「未定義」值是。

想象一下,如果Java允許您使用「null」作爲標識符。那麼,我猜Java不像Javascript一樣強制。無論如何,Javascript語句

if (x) alert("foo"); 

涉及隱式強制將「x」​​的值強制爲布爾值。該值沒有定義,所以它的強制爲「布爾」結果爲false

+0

@Andreas Grech - 奇怪的是,'「\ n \ t」== true'實際上也是'false'。 – JulianR 2010-03-28 20:04:51

+0

實際上,JavaScript中的true的概念是除了null,undefined,空字符串'','NaN','0'和'false'以外的每個值。 – 2010-03-28 20:06:50

0

未初始化的變量將獲得特殊值undefined。當你給另一個變量分配一個變量時,你給它一個引用你在當前範圍內定義的變量的字符串。在這種情況下,您已經定義了一個名爲undefined的變量,所以JavaScript引擎將首先查看變量,看到您已命名一個undefined,然後爲其分配變量。

相關問題