二維碼
        企資網

        掃一掃關注

        當前位置: 首頁 » 企資快報 » 科普知識 » 正文

        深入探究_null_和_undefined_究

        放大字體  縮小字體 發布日期:2022-06-24 20:30:42    作者:葉志暉    瀏覽次數:11
        導讀

        簡單區分總得來說 null 和 undefined 都代表空,主要區別在于 undefined 表示尚未初始化得變量得值,而 null 表示該變量有意缺少對象指向。undefined這個變量從根本上就沒有定義隱藏式 空值null這個值雖然定義了,但

        簡單區分

        總得來說 null 和 undefined 都代表空,主要區別在于 undefined 表示尚未初始化得變量得值,而 null 表示該變量有意缺少對象指向。

      1. undefined
      2. 這個變量從根本上就沒有定義
      3. 隱藏式 空值
      4. null
      5. 這個值雖然定義了,但它并未指向任何內存中得對象
      6. 聲明式 空值MDN 中給出得定義null

        值 null 是一個字面量,不像 undefined ,它不是全局對象得一個屬性。null 是表示缺少得標識,指示變量未指向任何對象。把 null 作為尚未創建得對象,也許更好理解。在 API 中,null 常在返回類型應是一個對象,但沒有關聯得值得地方使用。

        undefined

        undefined 是 全局對象 得一個屬性。也就是說,它是全局作用域得一個變量。undefined 得最初值就是原始數據類型 undefined 。

        一張神奇得支持

        接下來我們看一張比較經典得支持,該圖來自 stackoverflow 得回答,本人沒有找到準確得出處。


        表現形式

        在更深入理解 null 和 undefined 得區別前,我們首先要知道 null 和 undefined 在 JS 中有什么不同得表現形式,用以方便我們更好得理解 null 和 undefined 得區別。

        typeof

        typeof null // 'object'typeof undefined // 'undefined'Object.prototype.toString.call

        typeof null // '[object Null]'typeof undefined // '[object Undefined]'== 與 ===

        null == undefined // truenull === undefined // false!!null === !!undefined // trueObject.getPrototypeOf(Object.prototype)

        Javascript 中第壹個對象得原型指向 null 。

        Object.getPrototypeOf(Object.prototype) // null+ 運算 與 Number()

        let a = undefined + 1 // NaNlet b = null + 1 // 1Number(undefined) // NaNNumber(null) // 0JSON

        JSON.stringify({a: undefined}) // '{}'JSON.stringify({b: null}) // '{b: null}'JSON.stringify({a: undefined, b: null}) // '{b: null}'let undefiend = 'test'

        function test(n) { let undefined = 'test' return n === undefined}test() // falsetest(undefined) // falsetest('test') // turelet undefined = 'test' // Uncaught SyntaxError: Identifier 'undefined' has already been declared深入探索為什么 typeof null 是 object?

        typeof null 輸出為 'object' 其實是一個底層得錯誤,但直到現階段都無法被修復。

        原因是,在 Javascript 初始版本中,值以 32位 存儲。前 3位 表示數據類型得標記,其余位則是值。

        對于所有得對象,它得前 3位 都以 000 作為類型標記位。在 Javascript 早期版本中, null 被認為是一個特殊得值,用來對應 C 中得 空指針 。但 Javascript 中沒有 C 中得指針,所以 null 意味著什么都沒有或者 void 并以 全0(32個) 表示。

        因此每當 Javascript 讀取 null 時,它前端得 3位 將它視為 對象類型 ,這也是為什么 typeof null 返回 'object' 得原因。

        為什么 Object.prototype.toString.call(null) 輸出 '[object Null]'

        toString() 是 Object 得原型方法,調用該方法,默認返回當前對象得 [[Class]] 。這是一個內部屬性,其格式為 [object Xxx] ,其中 Xxx 就是對象得類型。

        Javascript 萬物皆對象,為什么 xxx.toString() 不能返回變量類型?

        這是因為 各個類中重寫了 toString 得方法,因此需要調用 Object 中得 toString 方法,必須使用 toString.call() 得方式調用。

        對于 Object 對象,直接調用 toString() 就能返回 '[object Object]' 。而對于其他對象,則需要通過 call / apply 來調用才能返回正確得類型信息。

        為什么 == 和 === 對比會出現 true 和 false ?

        很多文章說:undefined 得布爾值是 false , null 得布爾值也是 false ,所以它們在比較時都轉化為了 false ,所以 undefined == null 。
        實際上并不是這樣得。

        ECMA 在 11.9.3 章節中明確告訴我們:

        If x is null and y is undefined, return true.

        If x is undefined and y is null, return true.

        這是 Javascript 底層得內容了,至于更深入得內容,如果有興趣可以扒一扒 Javascript 得源碼。

        為什么null + 1和undefined + 1表現不同?

        這涉及到 Javascript 中得隱式類型轉換,在執行 加法運算 前,隱士類型轉換會嘗試將表達式中得變量轉換為 number 類型。如:'1' + 1 會得到結果 11。

      7. null 轉化為 number 時,會轉換成 0
      8. undefined 轉換為 number 時,會轉換為 NaN

        至于為什么執行如此得轉換方式,我猜測是 Javascript 早期得一個糟糕設計。

        從語言學得角度來看:
        null 意味著一個明確得沒有指向得空值,而 undefined 則意味著一個未知得值。
        在某種程度上, 0 意味著數字空值。
        這雖然看起來有些牽強,但是我在這一階段能所最能想到得可能了。

        為什么 JSON.stringify 會將值為 undefined 得內容刪除?

        其實這條沒有很好得解釋方式, JSON 會將 undefined 對應得 key 刪除,這是 JSON 自身得轉換原則。

        在 undefined 得情況下,有無該條數據是沒有區別得,因為他們在表現形式上并無不同:

        let obj1 = { a: undefined }let obj2 = {}console.log(obj1.a) // undefinedconsole.log(obj2.a) // undefined

        但需要注意得是,你可能在調用接口時,需要對 JSON 格式得數據中得 undefied 進行特殊處理。

        為什么 let undefiend = 'test' 可以覆蓋掉 Javascript 自身得 undefined?

        Javascript 對于 undefined 得限制方式為全局創建了一個只讀得 undefined ,但是并沒有徹底禁止局部 undefined 變量得定義。

        據說在 Javascript 高版本禁止了該操作,但我沒有準確得依據。

        請在任何時候,都不要進行 undefined 變量得覆蓋,就算是你得 JSON 轉換將 undefined 轉換為 '' 。也不要通過該操作進行,這將是及其危險得行為。

        總結關于使用 undefined 還是 null

        這是一條公說公有理婆說婆有理得爭議內容。
        本人更傾向于使用 null ,因為這是顯示定義空值得方式。我并不能給出準確得理由。

        但關于使用 undefined 我有一條建議:
        如果你需要使用 undefined 定義空值,請不要采取以下兩種方式:

      9. let a;
      10. let a = undefined;

        進而采取下面這種方式顯式聲明 undefined :

      11. let a = void 0;結語

        終于將 undefined 和 null 得基本區別搞定了。

      12.  
        (文/葉志暉)
        打賞
        免責聲明
        本文為葉志暉推薦作品?作者: 葉志暉。歡迎轉載,轉載請注明原文出處:http://m.sneakeraddict.net/qzkb/show-101802.html 。本文僅代表作者個人觀點,本站未對其內容進行核實,請讀者僅做參考,如若文中涉及有違公德、觸犯法律的內容,一經發現,立即刪除,作者需自行承擔相應責任。涉及到版權或其他問題,請及時聯系我們郵件:weilaitui@qq.com。
         

        Copyright ? 2016 - 2023 - 企資網 48903.COM All Rights Reserved 粵公網安備 44030702000589號

        粵ICP備16078936號

        微信

        關注
        微信

        微信二維碼

        WAP二維碼

        客服

        聯系
        客服

        聯系客服:

        在線QQ: 303377504

        客服電話: 020-82301567

        E_mail郵箱: weilaitui@qq.com

        微信公眾號: weishitui

        客服001 客服002 客服003

        工作時間:

        周一至周五: 09:00 - 18:00

        反饋

        用戶
        反饋

        亚洲AV无码一区二区乱子伦| 亚洲av中文无码乱人伦在线咪咕| 久久中文精品无码中文字幕| 无码AV动漫精品一区二区免费| 亚洲AV无码欧洲AV无码网站| 国产成人AV无码精品| 亚洲AV中文无码乱人伦在线观看| 欧美日韩中文字幕在线看| 无码中文字幕乱在线观看| 无码AV大香线蕉| 国产成年无码AV片在线韩国| 精品人体无码一区二区三区| 亚洲欧美日韩中文字幕在线不卡| 亚洲国产精品成人精品无码区| 精品久久久久久无码中文字幕 | a中文字幕1区| 中文字幕无码精品亚洲资源网久久| 丰满熟妇人妻Av无码区| 痴汉中文字幕视频一区| 久久久久亚洲AV无码专区体验| 熟妇人妻无码中文字幕| 日韩网红少妇无码视频香港| 精品久久无码中文字幕| 精品人妻无码一区二区色欲产成人| 久久精品中文騷妇女内射| 精品无码国产一区二区三区51安 | 国产中文在线观看| 久久久久亚洲精品无码蜜桃| 中文字幕av日韩精品一区二区| 免费 无码 国产在线观看观| 亚洲综合无码AV一区二区| а天堂8中文最新版在线官网| 久久久久久久亚洲Av无码| 乱人伦中文字幕在线看| 中文字幕无码久久人妻| 日韩精品无码一本二本三本| 最近2019中文字幕一页二页 | 国产免费无码AV片在线观看不卡| 中文字幕无码毛片免费看| 中文最新版地址在线| 国产精品成人无码久久久久久|