JS基礎之undefined與null的區別分析

在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變量的緣由!指針

相關文章
相關標籤/搜索