JavaScript中null和undefined的異同

一. 相同點

  1. 同爲5種基本數據類型之列(null, undefined, number, string, boolean)。
  2. undefinednull在if語句中,都會被自動轉爲false,相等運算符甚至直接報告二者相等。
    if (!undefined) console.log('undefined is false');
    // undefined is false
    
    if (!null) console.log('null is false');
    // null is false
    
    undefined == null
    // true複製代碼

二. 不一樣點

  1. 語義不一樣:null 表示一個值被定義了,定義爲「空值」;undefined 表示根本不存在定義。因此設置一個值爲 null 是合理的,如objA.valueA = null;但設置一個值爲 undefined 是不合理的。
  2. 數值轉換:null轉爲數值時爲0;undefined轉爲數值時爲NaN。可是 parseIntparseFloat不這麼認爲:parseInt(null)parseFloat(undefined) 返回都是 NaN

    Number(null)
    // 0
    Number(undefined)
    // NaN
    
    parseInt(null)
    // NaN
    parseFloat(undefined) 
    // NaN
    null === undefined
    // false
    複製代碼

  3. JSON序列化:JSON規範中被強化,這個標準中不存在 undefined 這個類型,但存在表示空值的 null 。在一些使用普遍的庫(好比jQuery)中的深度拷貝函數會忽略 undefined 而不會忽略 null ,http接口的報文參數也是如此。

    var json = {a: 1, b: undefined, c: null}
    JSON.stringify(json)
    // "{"a":1,"c":null}"
    JSON.parse(JSON.stringify(json))
    // {a: 1, c: null}複製代碼
  4. typeof 不一樣:typeof null === "object" 更多是一個設計失誤,因此在 harmony 中有提議將這個返回值修正爲 null,可是該提議由於會形成大量舊 Javascript 腳本出現問題而被否決了。

    typeof null 
    // "object"
    typeof undefined
    // "undefined"
    null instanceof Object
    // false複製代碼
  5. 設置爲null的變量或者對象會被內存收集器回收,undefined不會。

三. 爲何JS 中會同時存在 undefined 和 null ?

JS 中同時存在 undefined null 是合理的。javascript

首先在 Java 中不存在 undefined 是很合理的:Java 是一個靜態類型語言,對於 Java 來講不可能存在一個「不存在」的成員(不存在的話直接就編譯失敗了),因此只用 null 來表示語義上的空值。而 JavaScript 是一門動態類型語言,成員除了表示存在的空值外,還有可能根本就不存在(由於存不存在只在運行期才知道),因此這就要一個值來表示對某成員的 getter 是取不到值的。php


(文章純屬我的備忘記錄用途,部分引用來自網上加上我的理解整理。歡迎轉載,請註明出處。如對你有幫助,請隨意打賞。)java

相關文章
相關標籤/搜索