這裡收藏了關於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>