面試常問undefined與null的區別,如何詳細講下去

1.null 和 undefined在現代JS語義裏面是有明確區別的:php

null 表示一個值被定義了,定義爲「空值」;
undefined 表示根本不存在定義。java

因此設置一個值爲 null 是合理的,如
objA.valueA = null;
但設置一個值爲 undefined 是不合理的,如
objA.valueA = undefined; // 應該直接使用 delete objA.valueA; 任何一個存在引用的變量值爲undefined都是一件錯誤的事情。ecmascript

這樣判斷一個值是否存在,就能夠用
objA.valueA === undefined // 不該使用 null 由於 undefined == null,而 null 表示該值定義爲空值函數

這個語義在JSON規範中被強化,這個標準中不存在 undefined 這個類型,但存在表示空值的 null 。在一些使用普遍的庫(好比jQuery)中的深度拷貝函數會忽略 undefined 而不會忽略 null ,也是針對這個語義的理解。prototype

2. JS 中同時存在 undefined 和 null 是合理的。設計

首先在 Java 中不存在 undefined 是很合理的:Java 是一個靜態類型語言,對於 Java 來講不可能存在一個「不存在」的成員(不存在的話直接就編譯失敗了),因此只用 null 來表示語義上的空值。而 JavaScript 是一門動態類型語言,成員除了表示存在的空值外,還有可能根本就不存在(由於存不存在只在運行期才知道),因此這就要一個值來表示對某成員的 getter 是取不到值的。
至於 dart 不存在 null, 最大緣由恐怕是 dart 像 java 同樣是一個靜態類型語言(或者說是一個有編譯期靜態類型檢查的語言,在運行期並不進行類型檢查),因此能夠不須要設立一個 undefined 這樣的類型。
雖然這兩個東西的區別確實會令初學者困擾,但掌握並理解這兩個值的語義實際上和理解 prototype/scope 同樣是很是重要的。對象

3. typeof null 結果是 」object「 更像是一個設計失誤ip

由於 typeof null === "object" 而認爲 null 語義是表示空對象是個不謹慎的猜想,感受像是先射箭後畫靶通常。簡單的反例:在強類型數據交換協議 odata(http://www.odata.org/)的 JSON 格式中,即便一個成員定義爲特定類型(好比string),也能夠設置其值爲 null 來表示這個值是空值,這可不是表示這個成員是空對象,只是說值爲空而已(和空字符串、0、false有所區別)。
而 typeof null === "object" 更多是一個設計失誤,因此在 harmony 中有提議將這個返回值修正爲 null :
http://wiki.ecmascript.org/doku.php?id=harmony:typeof_null
固然該提議由於會形成大量舊 Javascript 腳本出現問題而被否決了……字符串

相關文章
相關標籤/搜索