零、寒暄
翻翻自己的博客,上一篇竟然是六月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過程中就不易出錯。我是一枚前端菜鳥,希望這篇文章能對大家有所啟發,文中有理解錯誤的地方,希望大家指正。如果各位基友和軟妹子覺得文章對您有所幫助,你的留言和推薦將對我是莫大的鼓舞!各位,午安!