javascript null 與undefined區別與總結

來源:互聯網
上載者:User

這裡收藏了關於js中null與undefined兩個提示的區別分析,對各個初學者應該會有不小的用處哦。

總所周知:
null == undefined
但是:
null !== undefined
那麼這兩者到底有啥區別呢?
null
這是一個對象,但是為空白。因為是對象,所以 typeof null 返回 'object' 。
null 是 JavaScript 保留關鍵字。
null 參與數值運算時其值會自動轉換為 0 ,因此,下列運算式計算後會得到正確的數值:
運算式:123 + null結果值:123
運算式:123 * null結果值:0
undefined
undefined是全域對象(window)的一個特殊屬性,其值是未定義的。但 typeof undefined 返回 'undefined' 。
雖然undefined是有特殊含義的,但它確實是一個屬性,而且是全域對象(window)的屬性。請看下面的代碼:
複製代碼 代碼如下:
alert('undefined' in window); //輸出:true
var anObj = {};
alert('undefined' in anObj); //輸出:false

從中可以看出,undefined是window對象的一個屬性,但卻不是anObj對象的一個屬性。
注意:儘管undefined是有特殊含義的屬性,但卻不是JavaScript的保留關鍵字。
undefined參與任何數值計算時,其結果一定是NaN。
隨便說一下,NaN是全域對象(window)的另一個特殊屬性,Infinity也是。這些特殊屬性都不是JavaScript的保留關鍵字!
提高undefined效能
當我們在程式中使用undefined值時,實際上使用的是window對象的undefined屬性。
同樣,當我們定義一個變數但未賦予其初始值,例如:

var aValue;
這時,JavaScript在所謂的先行編譯時會將其初始值設定為對window.undefined屬性的引用,
於是,當我們將一個變數或值與undefined比較時,實際上是與window對象的undefined屬性比較。這個比較過程中,JavaScript會搜尋window對象名叫‘undefined'的屬性,然後再比較兩個運算元的引用指標是否相同。
由於window對象的屬性值是非常多的,在每一次與undefined的比較中,搜尋window對象的undefined屬性都會花費時 間。在需要頻繁與undefined進行比較的函數中,這可能會是一個效能問題點。因此,在這種情況下,我們可以自行定義一個局部的undefined變 量,來加快對undefined的比較速度。例如:
複製代碼 代碼如下:
function anyFunc()
{
var undefined; //自訂局部undefined變數
if(x == undefined) //範圍上的引用比較
while(y != undefined) //範圍上的引用比較
};

其中,定義undefined局部變數時,其初始值會是對window.undefined屬性值的引用。新定義的局部undefined變 量存在與該函數的範圍上。在隨後的比較操作中,JavaScript代碼的書寫方式沒有任何的改變,但比較速度卻很快。因為範圍上的變數數量會遠遠少 於window對象的屬性,搜尋變數的速度會極大提高。
這就是許多前端JS架構為什麼常常要自己定義一個局部undefined變數的原因!
希望通過本文的介紹,能給你帶來協助

null,對象不存在
var ii= document.getElementById("id");
alert(ii);
當前頁面不存在id對象

   undefined
   var i;
alert(i);
  聲明的變數沒有初始化
   alert(document.oiji);
   或者對象屬性,方法不存在

   空
   <asp教程:TextBox ID="name" runat="server" Width="100px" Text=""></asp:TextBox>
var iab = document.getElementById("name").value;
alert(iab);
   id=name的值為空白

js null,undefined,字串小結


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>null,undefined,字串的記憶體佔有情況隨談</title>
<style type="text/css教程">
body{font-size:12px;}
pre{padding:5px;border:solid 2px #dfdfdf;color:#fff; background-color:#666;}
</style>
</head>
<body>
<pre>
<strong>總結:</strong>
//還一個要注意的就是null雖然是Object型 但是它非常特殊,本身存放在stack棧中。你可以理解成它是Object的一種特殊形式。
//還有就是在其他物件導向的語言中一般情況下字串都是存放在heap堆中,但在js中這個存放在棧stack中
//到這以後 突然想到一個問題 聲明和定義的區別,想了想 感覺本身是一個東西,兩種說法而已。此時,我突然想當聲明一個變數時,
//它是否在棧中呢 既是是否佔用記憶體,(當然所有的代碼會存在程式碼片段,但用記憶體,可我說的不是這),我是指未定義的變數是否在棧中存在
//想了一會 我認為存在,原因就是undefined類型只有一個值undefined,當聲明的變數未初始化時,當然預設值是undefined的字面量。
//講一講null,其實它本來應該存在堆中 但是js堆ECMAscript實現錯了,然後現在也被標準接受 成為一個Object的預留位置
</pre>
<script language="網頁特效" type="text/javascript">
alert(NaN == NaN);//false
alert(undefined === undefined);//true
alert(undefined == null);//true,原因是undefined時從null派生過來的。
alert(typeof null);
alert(undefined === null); //false
//通過上面的例子,可以寫個判斷是否為undefined的函數如下
var isUndefined = function (param) {
return param === undefined;
};
//還一個要注意的就是null雖然是Object型 但是它非常特殊,本身存放在stack棧中。你可以理解成它是Object的一種特殊形式。
//還有就是在其他物件導向的語言中一般情況下字串都是存放在heap堆中,但在js中這個存放在棧stack中
</script>
</body>
</html>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.