在javascript開發中,開始學習js的時候時常困惑個人就是null和undefined的區別,因此很想總結下我對這兩個的理解
學習過js的同窗都知道:javascript
null==undefined; true null!==undefined; true
那這個究竟是怎麼回事呢?前端
1.null
首先他是一個對象,可是是一個空對象,由於是一個對象,因此java
typeof null; "object"
null是js保留的關鍵字;
null在參與數值運算的時候將自動轉換成 0 ;例如:瀏覽器
var c = 123 + null; c 123
var a = 188*null; a 0
2.undefined
首先undefined是全局對象中的一個特殊屬性,他的值是一個未定義的,咱們來看看他是否爲全局對象的屬性:框架
alert("undefined" in window);
上述這段代碼會在瀏覽器輸出true;
然而當咱們建立一個空對象的時候:函數
var anObj = {}; alert('undefined' in anObj); //輸出:false
undefined參與的全部數值運算,其值都會返回 NaN性能
var h=123+undefined; h; NaN
當咱們在程序中使用undefined值時,實際上使用的是window對象的undefined屬性。 一樣,當咱們定義一個變量但未賦予其初始值,例如:
var vaule ; undefined
這個時候JavaScript預編譯會將其初始值的設置爲 window.undefined 的引用。
因而,當咱們將一個變量或值與undefined比較時,其實是與window對象的undefined屬性比較。這個比較過程當中,JavaScript會搜索window對象名叫‘undefined'的屬性,而後再比較兩個操做數的引用指針是否相同。
因爲window對象的屬性值是很是多的,在每一次與undefined的比較中,搜索window對象的undefined屬性都會花費時 間。在須要頻繁與undefined進行比較的函數中,這可能會是一個性能問題點。所以,在這種狀況下,咱們能夠自行定義一個局部的undefined變 量,來加快對undefined的比較速度。例如:學習
function anyFunc() { var undefined; //自定義局部undefined變量 if(x == undefined){console.log(undefined)} //做用域上的引用比較 while(y != undefined){console.log(undefined)} //做用域上的引用比較 };
其中,定義undefined局部變量時,其初始值會是對window.undefined屬性值的引用。新定義的局部undefined變 量存在與該函數的做用域上。在隨後的比較操做中,JavaScript代碼的書寫方式沒有任何的改變,但比較速度卻很快。由於做用域上的變量數量會遠遠少 於window對象的屬性,搜索變量的速度會極大提升。
這就是許多前端JS框架爲何經常要本身定義一個局部undefined變量的緣由!指針