當前位置:
首頁 > 知識 > 一個全新的角度來分析 null 和 undefined

一個全新的角度來分析 null 和 undefined

從一個全新的角度來分析
null 和 undefined ,從而理解兩者為何會相等:

1、語義和場景不同

Undefined 和 Null 是 Javascript 中兩種特殊的原始數據類型(Primary Type),它們都只有一個值,分別對應
undefined 和 null 。

undefined 的字面意思就是未定義的值,這個值希望表示一個變數最原始的狀態,而非人為操作的結果, 這種原始狀態會在以下兩種場景中出現:

聲明了一個變數,但沒有賦值,如 var foo;

訪問對象上不存在的屬性,如果 Object.foo;

一個全新的角度來分析 null 和 undefined

訪問foo,返回了undefined,表示這個變數自從聲明了以後,就從來沒有使用過,也沒有定義過任何有效的值,即處於一種原始而不可用的狀態。

一個全新的角度來分析 null 和 undefined

訪問Object對象上的foo屬性,同樣也返回 undefined , 表示Object 上不存在或者沒有定義名為 「foo」 的屬性。

因此,undefined 值產生的來源一般不是人為賦值的,而是變數的原始狀態,當然,你也可以手動給一個變數賦值
undefined,但這樣做沒有意義,因為一個變數不賦值就是 undefined 。

null 的字面意思是 空值 ,這個值希望表示 一個對象被人為的重置為空對象,而非一個變數最原始的狀態,
在內存里的表示就是,棧中的變數沒有指向堆中的內存對象,即:

一個全新的角度來分析 null 和 undefined

當一個對象被賦值了null 以後,原來的對象在內存中就處於遊離狀態,GC
會擇機回收該對象並釋放內存。因此,如果需要釋放某個對象,就將變數設置為null,即表示該對象已經被清空,目前無效狀態。試想一下,如果此處把 null 換成
undefined 會不會感到彆扭? 顯然語義不通,其操作不能正確的表達人想要的行為。

與 null 相關的另外一個問題需要解釋一下:

一個全新的角度來分析 null 和 undefined

null 有屬於自己的類型 Null,而不屬於Object類型,typeof 之所以會判定為 Object 類型,是因為JavaScript
數據類型在底層都是以二進位的形式表示的,二進位的前三位為 0 會被 typeof 判斷為 對象類型,而 null 的二進位位恰好都是 0 ,因此,null
被誤以為是 Object 類型。

000:對象,數據是對象的應用。

1:整型,數據是31位帶符號整數。

010:雙精度類型,數據是雙精度數字。

100:字元串,數據是字元串。

110:布爾類型,數據是布爾值。

其實,我們可以通過另一種方法獲取 null的真實類型:

一個全新的角度來分析 null 和 undefined

通過Object原型上的toString() 方法可以獲取到JavaScript 中對象的真實數據類型,當然 undefined
類型也可以通過這種方式來獲取:

一個全新的角度來分析 null 和 undefined

2、表示的內容相似

雖然 undefined 和 null 的語義和場景不同,但總而言之,它們都表示的是一個無效的值。
因此,在JS中對這類值訪問屬性時,都會得到異常的結果:

一個全新的角度來分析 null 和 undefined

ECMAScript 規範認為,既然 null 和 undefined 的行為很相似,並且都表示
一個無效的值,那麼它們所表示的內容也是相似的,即有

一個全新的角度來分析 null 和 undefined

不要試圖通過轉換數據類型來解釋這個結論,因為:

一個全新的角度來分析 null 和 undefined

但 === 會返回 false ,因為全等操作 === 在比較相等性的時候,不會主動轉換分項的數據類型,而兩者又不屬於同一種類型:

一個全新的角度來分析 null 和 undefined

3、總結和應用

用一句話總結兩者的區別就是,undefined 表示一個變數自然的、最原始的狀態值,而 null
則表示一個變數被人為的設置為空對象,而不是原始狀態。所以,在實際使用過程中,為了保證變數所代表的語義,不要對一個變數顯式的賦值
undefined,當需要釋放一個對象時,直接賦值為 null 即可。

文章摘自於博客園


更多精彩推薦

IT職業教育優就業:http://www.ujiuye.com/

在線學習IT精品課程:http://xue.ujiuye.com/?wt.bd=lsh11wb

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 IT優就業 的精彩文章:

mybatis 詳解——動態SQL
atoi(),itoa(),atol(),atof ()
input file圖片預覽刪除
是的,我就是不想眼睜睜地,過著日復一日的生活
mybatis詳解——properties以及別名定義

TAG:IT優就業 |

您可能感興趣

價格分析的三個角度:超越競爭對手 is the key point!
Nike SB Zoom Blazer Mid從別樣的角度詮釋花卉元素
從源碼角度分析 Kotlin by lazy 的實現
從孩子的角度看51talk與vipkid哪個好?
陳建州多角度曬 MADNESS x Converse Chuck Taylor 實物圖
專訪Catherine Otto—從BMJ子刊Heart主編的角度看文章發表
從技術角度分析刀劍神域外傳 Gun Gale Online
Illustrator簡單的製作角度漸變效果
photoshop中怎麼調整照片的透視角度
Kubernetes v1.10,從運維和開發者角度審視新功能!
多角度,全方位賞析三星 Galaxy S9/S9 Plus
iPhone 11支持多角度FaceID解鎖 確認新增兩配色
重磅三方聯名!Timberland x BAPE x UNDFTD 多角度細節近賞
Android圖片載入框架最全解析二,從源碼的角度理解Glide的執行流程
從職業玩家角度看,4K顯示器和iMac的Retina屏哪個畫質會更好?
GloMo 從graph的角度看數據並應用在遷移學習中
從抓包的角度分析connect函數的連接過程
低配iPhone屏幕如何 光譜角度實測iPhone XR屏幕
壁紙 Gucci 2019早秋系列Lookbook,以遊客角度詮釋華麗復古文藝風!
從職業玩家角度看,如何評價微軟 Surface Go?