你真的瞭解javascript中的null和undefined嗎

來源:互聯網
上載者:User

這段時間一直在學習JavaScript,在學習數組的時候碰到這麼一個問題。

給了一段代碼:


書上解析:
但是我在測試的時候,發現week[0]~week[3]好像並沒有被初始化為null。為了驗證我的猜想,我做了以下一個例子:
<html><head><title>編寫JavaScript指令碼</title> <script type="text/javascript" > var week = new Array(); week[4] = "Thursday"; week[6] = null; document.write("a[0]的值為:"+a[0]+"<br>");document.write("a[0]的類型為:"+typeof(a[0])+"<br>");  document.write("<b>a[0]是否為null:"+(a[0]==null) +"</b><br>"); document.write("<b>a[0]是否為undefined:"+(a[0]== undefined) +"</b><br><br>"); document.write("a[4]的值為:"+a[3]+"<br>");  document.write("a[4]的類型為:"+typeof(a[3])+"<br><br>"); document.write("a[6]的值為:"+a[6]+"<br>");   document.write("a[3]的類型為:"+typeof(a[6])+"<br>"); </script></head><body></body></html>
結果顯示為:
如果按書上解釋的那樣,給week[4]賦值時,會自動把week[0]~week[3]初始化為null,而如果week[0]為null的話,返回都應該跟week[6]一樣,值為null,類型為object,但是結果卻是與預想的不符!且在測試week[0]否是為null和undefined,都返回了true,很讓人費解。
研究了半天,突然間對於null和undefined很模糊,趕緊去查資料。終於找到幾個可以解惑的觀點:
null :表示無值;undefined : 表示一個未聲明的變數,或已聲明但沒有賦值的變數,或一個並不存在的對象屬性。
根據這個觀點,對null和undefined又做了如下的測試:
        document.write(typeof(null)+"<br>");        document.write(typeof(undefined)+"<br>");         document.write((null == undefined)+"<br>");

輸出了:object undefined true 這3個值。再深入研究發現,原來null是一個對象,所以在傳回型別到時候,會返回object。null 是 JavaScript 保留關鍵字。 null 參與數值運算時其值會自動轉換為 0 ,因此,下列運算式計算後會得到正確的數值: 運算式:123 + null    結果值:123 運算式:123 * null    結果值:0 
而undefined則是Global對象(window)的一個特殊屬性,其值是未定義的。但 typeof undefined 返回 'undefined' 。這個在JScript手冊中查詢“undefined 屬性”可以找到解釋。我們可以通過下面的例子來驗證undefined是否為window的屬性。

alert('undefined' in window);//輸出:true var anObj = {}; alert('undefined' in anObj); //輸出:false 

儘管undefined是有特殊含義的屬性,但卻不是JavaScript的保留關鍵字。 
那麼null和undefined到底是什麼關係呢。可以說如果一個變數的undefined為true,那麼它與null比較也一定為true。只要變數沒有初始化,那麼它的undefined一定為true。所以,只有變數初始化了,undefined和null才為false。看下面這個例子:
var a=123;document.write("a的值為:"+a+"<br>");document.write("a的類型為:"+typeof(a)+"<br>");document.write("a是否為null:"+(a==null)+"<br>");document.write("a是否為undefined:"+(a==undefined)+"<br><br>");var b=null;document.write("b的值為:"+b+"<br>");document.write("b的類型為:"+typeof(b)+"<br>");document.write("b是否為null:"+(b==null)+"</br>");document.write("b是否為undefined:"+(b==undefined)+"<br>");

結果為:看到這個結果,是不是感覺有點不對勁呢,是不是覺得“b的類型不是undefined,而是object,說明這時它已經初始化了,按上面關於undefined的解釋。這時候b的undefined和與null的比較應該為false呢”?別著急,聽我慢慢道來,我一開始也著了這個道兒了,但是仔細想了想,發現有一個問題。首先說運行結果肯定是沒有錯誤的,上面的undefined解釋也是沒有問題的。那麼為什麼b的類型是object呢,var
b=null首先在形式上,也可以看出是一個初始化的過程,但是因為初始化為了null,這個初始化又變得不那麼真實。初始化分為2步,①分配空間,②賦值。var b=null完成了分配空間這一步,但是在賦值到時候卻賦值為null,相當於沒有賦值。所以從嚴格意義上,又沒有完成正常初始化的“手續”,所以其undefined和與null的比較,依舊為true。你可以在var a=123;後面加上這麼一句話,a=null;運行後,你會發現,結果跟b顯示的一模一樣。這說明,如果一個變數為null,那麼undefined為true。所以從某種意義上來說null==undefined。  綜上所述可以推斷出,最開始的例子中的week[0]只是一個聲明但沒有賦值的變數,所以undefined為true,進而null也為true。但是它並沒有初始化為null,如果初始化為null了,其值肯定為null。所以說書上的觀點錯了。
所以用week[0]==null來判斷week[0]的值是不科學的,因為week[0]未定義或者未初始化時,其與null比較,結果為true,若初始化後,又賦值為null,其結果與null比較,正好相等,所以還是返回true。

再說幾句題外話,其實我寫這篇部落格借這個部落格,讓大家幫我解答疑惑,只是在寫的過程中,突然間好像自己理解了一些。一開始查的那些資料也很多,但是還是沒有理解,但是寫著寫著,突然靈光一閃,茅塞頓開呀,不過,這隻是我的愚見而已,不一定正確,如果大家發現有什麼錯誤的地方,請及時為我指正。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.