背景:面試問到null與undefined區別,回的不是很滿意,查閱一些資料作了簡要複習記錄,有不足和錯望各位指正面試
先從兩者進行簡要認識查閱記錄起:瀏覽器
1,變量申明但未賦值函數
var name console.log(name) // undefined name返回undefind 由於name未賦有效值也未被使用過,始終處於原始狀態
2,函數定義了行參prototype
function test(name){ console.log(name) // undefined } test() 因爲test定義了參數,但在執行test時候並未傳參,致使name參數就是原始,爲賦值的變量
3,對象Object.不存在的變量code
console.log(Object.name) // undefined 之前我一直覺得Object是簡單的對象,結果今天(2020-4-10)打開瀏覽器控制檯 console.log(Object) 結果是這樣的:ƒ Object() { [native code] } 即便:function Object() { [native code] } 又是一臉懵逼,難道說Object原型是Function??? Function.prototype.name = function(){} for(var i in Objetc){ console.log(i) // 輸出了read } 緊接着查閱了了MDN上的資料 [MDN關於Object][1] Object 構造函數爲給定值建立一個對象包裝器。若是給定值是 null 或 undefined,將會建立並返回一個空對象,不然,將返回一個與給定值對應類型的對象。 當以非構造函數形式被調用時,Object 等同於 new Object()。
此處查閱了MDN Object對象
4,使用void對錶達式求值 void是運算符ip
void 0 或者 void(0)// undefined void false // undefined void [] // undefined 注:ECMAScript 規範 void 運算符 對給定的表達式進行求值,返回都是 undefined
最終可說明一點,undefind是來自某個表達式最原始的狀態值,並不是人爲操做而得內存
undefined類型只有一個值,即undefined。當聲明的變量還未被初始化時,變量的默認值爲undefined
字面意思就是沒有值,null是JavaScript裏面的關鍵字,表示沒有值或者不存在任何值
即:在內存裏的表示就是,棧中的變量沒有指向堆中的內存對象get
var test = null console.log(test) //null 能夠經過 Object.prototype.toString.call(null) // "[object Null]" null是一個有效不存在值的對象
一個對象或者被賦值爲null時,原來的對象在內存中就是一個找不到家的孩紙,垃圾回收會在某個時機收回該對象並釋放內存。全部若是須要釋放某個對象或者變量就簡單賦值爲null原型
null與undefined區別
1,類型不一樣
console.log(typeof null) // object console.log(typeof undefined) // undefined // 可經過如下或者各自真實類型 Object.prototype.toString.call(null) // "[object Null]" Object.prototype.toString.call(undefined) // "[object Undefined]"
null是一個有效不存在值的對象,而且是不可改變的,undefined的對象類型是自己未定義最初狀態值
小細節 變量等於null小栗子 var test = null console.log(test*10) // 0 變量等於undefined小栗子 var test console.log(test*10) // NaN 從上兩小栗子可得出: 任何具備null值的變量算術運算(+,-,*,/)都會產生整數值,而任何具備undefined值的變量算術運算(+,-,*,/)會致使變量爲NaN
2,轉換爲原始類型的方式不一樣
null與undefined轉換類型不一樣,null在算術運算轉換時會轉爲數字類型0,而undefined則不會執行任何轉換即最終爲NaN
null ---> 0 undefined ---> NaN
null轉爲0
var _null = 10 + null console.log(_null) // 10
undefined 添加到數字則不轉換
var _und = 10 + undefined console.log(_und) // NaN
複習小記,有錯望各位大佬指正,建議改進