聊一聊js中的null、undefined與NaN


零、寒暄

  翻翻自己的博客,上一篇竟然是六月26號的,說好的更新呢?回顧剛剛過去的這個七月,整天都是公司的入職培訓加上自己的小論文,每天奮戰到凌晨1點多,這是要掛的節奏啊!但是不論怎么說,自己的時間管理還是出了問題,以后一定要好好的規划一下,不多說,來正題!

  自己為什么要寫這篇文章呢?因為在吃完早飯,消化的時候,整了幾行代碼,然后發現整掛了。。。

  大致代碼如下:

function getByClass(clsName, parent){  
    if(parent=="undefined"){
        var oParent=document;
    }else{
        var oParent=document.getElementById(parent);
    }  
    //后面代碼略去
}

上面的方法在判斷第二個可選參數的時候,如果沒有傳參,我要處理一下,然后程序在這里卡住了。最后換成undefined關鍵字就可以了,這里就要涉及到undefined和null的一些用法,具體不同的地方,請接着往下看。

一、null、undefined與NaN的概念

  1.在js中,我一直覺得undefined和null的區別不大,平時用的時候也不會太在意。總體說來:

  undefined一般表示根本”不存在“,null表示定義了,但是值是”空“。

  但是大家發現,在 Java等編譯型語言中,並不存在 undefined。這是為什么呢?Java 是一個靜態類型語言,所有的變量在初始化時都進行了嚴格的類型聲明,如果你定義一個undefined的變量,恐怕在編譯的時候就被咔擦掉了,但是java中是允許定義null來表示空值的。而 JavaScript 是一門動態解釋性語言,對於不存在的類型,只有在運行解釋的時候才會作出判斷。

  2.什么情況下會是null?

//(1)給一個變量或者對象賦值的時候,賦值null,此處不宜賦值為undefined
var parm=null;
    
//(2)當元素獲取不到時,dom返回的也是null
var dom = document.getElementById('domId');//null

//(3)另外原型鏈的終點,也是返回null的
Object.getPrototypeOf(Object.prototype)//null

  3.什么情況下使用undefined呢?

  主要有一下幾種情況:

  (1)聲明變量,但未賦值

  (2) 函數無返回值,執行后返回undefined

  (3) 函數中可選參數,沒有傳參時返回undefined

  (4)對象中不存在或未賦值的屬性

看下面的實例代碼:

var a;
console.log(a)//undefined

var foo=function(){
}
console.log(foo());//undefined

function getI(i){
    console.log(i);
}
getI();//undefined
    
var o={};
console.log(o.name);
//undefined

  4.下面看一下undefined和null轉換為數值、typeof上面的表現

Number(undefined);//NaN
Number(null);//0
typeof(undefined)//"undefined"
typeof(null)//"object"

  從上面可以看出,undefined轉換為數值是NaN,而null可以轉換為0,這是兩者的區別;另外typeof檢測之后,二者返回的分別是"undefined"、"object"

  【注】typeof 返回的是字符串,有六種可能:"number"、"string"、"boolean"、"object"、"function"、"undefined",這個后續可以為二者的檢測來服務。

  5.NaN 

  一般來說,當運算無法返回正確的數值時,其返回“NaN”值。NaN 值“不是數字”,所以在比較大小的時候,是無法處理的,更要注意的是 NaN 本身也不等於 NaN 。我們可以用JavaScript的內建函數isNaN()來檢測一個值是否是數值。

二、怎么判斷undefined、null與數值

  1.判斷undefined: 

var parm=undefined;
if (typeof(parm) == "undefined"){  
    alert("i am undefined");  
}

  注意typeof是返回的字符串,需要把undefined也變成字符串比較

  2.判斷null:

var parm = null;  
if (!parm && typeof(parm )!="undefined" && parm !=0){  
    alert("i am null");  
}

  僅僅判斷null,比較麻煩一些。首先將其轉化為bool值判斷,這里可能出現undefined、null與數值;然后利用typeof去篩選掉undefined;最后排除數值;

  3.判斷NaN:

var parm= 0/0;  
if(isNaN(parm)){  
    alert("i am NaN");  
}

  【注】isNaN() 函數可以用來檢測一些運算過后可能出現的異常,比如0作除數等等,還有檢測 parseFloat() 和 parseInt()處理以后的結果是否是數值,這樣可以減少程序可能拋出的異常

  4.同時判斷undefined和null:

var parm= undefined;  
//var parm= null;  
if (parm== undefined)  
{  
    alert("i am null or undefined");  
} 

  由於一般來說null==undefined返回的是true,所以我們可以用上述的方法去檢測。

  5.同時判斷undefined、null與數值:

var parm= null;  
//var parm= undefined;
//var parm= 0;
if (!parm)  
{  
    alert("i am null or undefined or 0");  
}

   一般來說我們js判斷中,不需要嚴格的檢測時,直接!parm就可以了。

三、總結

  總體來說,這是一個細節問題,但是對細節把握的越清楚,在實際的code過程中就不易出錯。我是一枚前端菜鳥,希望這篇文章能對大家有所啟發,文中有理解錯誤的地方,希望大家指正。如果各位基友和軟妹子覺得文章對您有所幫助,你的留言和推薦將對我是莫大的鼓舞!各位,午安!

此文章發布在本人博客園rookiebob,如需轉載本文,請務必注明來源: http://www.cnblogs.com/rookiebob/,有些勘誤我會及時更正,為了避免對您的誤解,請訪問原文!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM