免费特黄视频_国产精品久久久av_久久香蕉网_国产精彩视频_中文二区_国产成人一区

二維碼
企資網(wǎng)

掃一掃關(guān)注

當(dāng)前位置: 首頁(yè) » 企資快報(bào) » 產(chǎn)品 » 正文

深入探究_null_和_undefined_究

放大字體  縮小字體 發(fā)布日期:2022-06-24 20:30:42    作者:葉志暉    瀏覽次數(shù):16
導(dǎo)讀

簡(jiǎn)單區(qū)分總得來(lái)說(shuō) null 和 undefined 都代表空,主要區(qū)別在于 undefined 表示尚未初始化得變量得值,而 null 表示該變量有意缺少對(duì)象指向。undefined這個(gè)變量從根本上就沒(méi)有定義隱藏式 空值null這個(gè)值雖然定義了,但

簡(jiǎn)單區(qū)分

總得來(lái)說(shuō) null 和 undefined 都代表空,主要區(qū)別在于 undefined 表示尚未初始化得變量得值,而 null 表示該變量有意缺少對(duì)象指向。

  • undefined
  • 這個(gè)變量從根本上就沒(méi)有定義
  • 隱藏式 空值
  • null
  • 這個(gè)值雖然定義了,但它并未指向任何內(nèi)存中得對(duì)象
  • 聲明式 空值MDN 中給出得定義null

    值 null 是一個(gè)字面量,不像 undefined ,它不是全局對(duì)象得一個(gè)屬性。null 是表示缺少得標(biāo)識(shí),指示變量未指向任何對(duì)象。把 null 作為尚未創(chuàng)建得對(duì)象,也許更好理解。在 API 中,null 常在返回類型應(yīng)是一個(gè)對(duì)象,但沒(méi)有關(guān)聯(lián)得值得地方使用。

    undefined

    undefined 是 全局對(duì)象 得一個(gè)屬性。也就是說(shuō),它是全局作用域得一個(gè)變量。undefined 得最初值就是原始數(shù)據(jù)類型 undefined 。

    一張神奇得支持

    接下來(lái)我們看一張比較經(jīng)典得支持,該圖來(lái)自 stackoverflow 得回答,本人沒(méi)有找到準(zhǔn)確得出處。


    表現(xiàn)形式

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

    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 中第壹個(gè)對(duì)象得原型指向 null 。

    Object.getPrototypeOf(Object.prototype) // null+ 運(yùn)算 與 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' 其實(shí)是一個(gè)底層得錯(cuò)誤,但直到現(xiàn)階段都無(wú)法被修復(fù)。

    原因是,在 Javascript 初始版本中,值以 32位 存儲(chǔ)。前 3位 表示數(shù)據(jù)類型得標(biāo)記,其余位則是值。

    對(duì)于所有得對(duì)象,它得前 3位 都以 000 作為類型標(biāo)記位。在 Javascript 早期版本中, null 被認(rèn)為是一個(gè)特殊得值,用來(lái)對(duì)應(yīng) C 中得 空指針 。但 Javascript 中沒(méi)有 C 中得指針,所以 null 意味著什么都沒(méi)有或者 void 并以 全0(32個(gè)) 表示。

    因此每當(dāng) Javascript 讀取 null 時(shí),它前端得 3位 將它視為 對(duì)象類型 ,這也是為什么 typeof null 返回 'object' 得原因。

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

    toString() 是 Object 得原型方法,調(diào)用該方法,默認(rèn)返回當(dāng)前對(duì)象得 [[Class]] 。這是一個(gè)內(nèi)部屬性,其格式為 [object Xxx] ,其中 Xxx 就是對(duì)象得類型。

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

    這是因?yàn)?各個(gè)類中重寫了 toString 得方法,因此需要調(diào)用 Object 中得 toString 方法,必須使用 toString.call() 得方式調(diào)用。

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

    為什么 == 和 === 對(duì)比會(huì)出現(xiàn) true 和 false ?

    很多文章說(shuō):undefined 得布爾值是 false , null 得布爾值也是 false ,所以它們?cè)诒容^時(shí)都轉(zhuǎn)化為了 false ,所以 undefined == null 。
    實(shí)際上并不是這樣得。

    ECMA 在 11.9.3 章節(jié)中明確告訴我們:

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

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

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

    為什么null + 1和undefined + 1表現(xiàn)不同?

    這涉及到 Javascript 中得隱式類型轉(zhuǎn)換,在執(zhí)行 加法運(yùn)算 前,隱士類型轉(zhuǎn)換會(huì)嘗試將表達(dá)式中得變量轉(zhuǎn)換為 number 類型。如:'1' + 1 會(huì)得到結(jié)果 11。

  • null 轉(zhuǎn)化為 number 時(shí),會(huì)轉(zhuǎn)換成 0
  • undefined 轉(zhuǎn)換為 number 時(shí),會(huì)轉(zhuǎn)換為 NaN

    至于為什么執(zhí)行如此得轉(zhuǎn)換方式,我猜測(cè)是 Javascript 早期得一個(gè)糟糕設(shè)計(jì)。

    從語(yǔ)言學(xué)得角度來(lái)看:
    null 意味著一個(gè)明確得沒(méi)有指向得空值,而 undefined 則意味著一個(gè)未知得值。
    在某種程度上, 0 意味著數(shù)字空值。
    這雖然看起來(lái)有些牽強(qiáng),但是我在這一階段能所最能想到得可能了。

    為什么 JSON.stringify 會(huì)將值為 undefined 得內(nèi)容刪除?

    其實(shí)這條沒(méi)有很好得解釋方式, JSON 會(huì)將 undefined 對(duì)應(yīng)得 key 刪除,這是 JSON 自身得轉(zhuǎn)換原則。

    在 undefined 得情況下,有無(wú)該條數(shù)據(jù)是沒(méi)有區(qū)別得,因?yàn)樗麄冊(cè)诒憩F(xiàn)形式上并無(wú)不同:

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

    但需要注意得是,你可能在調(diào)用接口時(shí),需要對(duì) JSON 格式得數(shù)據(jù)中得 undefied 進(jìn)行特殊處理。

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

    Javascript 對(duì)于 undefined 得限制方式為全局創(chuàng)建了一個(gè)只讀得 undefined ,但是并沒(méi)有徹底禁止局部 undefined 變量得定義。

    據(jù)說(shuō)在 Javascript 高版本禁止了該操作,但我沒(méi)有準(zhǔn)確得依據(jù)。

    請(qǐng)?jiān)谌魏螘r(shí)候,都不要進(jìn)行 undefined 變量得覆蓋,就算是你得 JSON 轉(zhuǎn)換將 undefined 轉(zhuǎn)換為 '' 。也不要通過(guò)該操作進(jìn)行,這將是及其危險(xiǎn)得行為。

    總結(jié)關(guān)于使用 undefined 還是 null

    這是一條公說(shuō)公有理婆說(shuō)婆有理得爭(zhēng)議內(nèi)容。
    本人更傾向于使用 null ,因?yàn)檫@是顯示定義空值得方式。我并不能給出準(zhǔn)確得理由。

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

  • let a;
  • let a = undefined;

    進(jìn)而采取下面這種方式顯式聲明 undefined :

  • let a = void 0;結(jié)語(yǔ)

    終于將 undefined 和 null 得基本區(qū)別搞定了。

  •  
    (文/葉志暉)
    免責(zé)聲明
    本文僅代表作發(fā)布者:葉志暉個(gè)人觀點(diǎn),本站未對(duì)其內(nèi)容進(jìn)行核實(shí),請(qǐng)讀者僅做參考,如若文中涉及有違公德、觸犯法律的內(nèi)容,一經(jīng)發(fā)現(xiàn),立即刪除,需自行承擔(dān)相應(yīng)責(zé)任。涉及到版權(quán)或其他問(wèn)題,請(qǐng)及時(shí)聯(lián)系我們刪除處理郵件:weilaitui@qq.com。
     

    Copyright ? 2016 - 2025 - 企資網(wǎng) 48903.COM All Rights Reserved 粵公網(wǎng)安備 44030702000589號(hào)

    粵ICP備16078936號(hào)

    微信

    關(guān)注
    微信

    微信二維碼

    WAP二維碼

    客服

    聯(lián)系
    客服

    聯(lián)系客服:

    在線QQ: 303377504

    客服電話: 020-82301567

    E_mail郵箱: weilaitui@qq.com

    微信公眾號(hào): weishitui

    客服001 客服002 客服003

    工作時(shí)間:

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

    反饋

    用戶
    反饋

    主站蜘蛛池模板: 国产成人av在线 | a黄视频| av中文字幕在线 | 在线中文字幕av | 久久高清精品 | 国产乱码一区 | 中国大陆高清aⅴ毛片 | 女同videos另类| 精品国产色 | 精品国产久 | 日韩成人在线观看 | 在线国产视频 | 国产精品久久久久久一区二区三区 | 福利电影在线 | 波多野结衣先锋影音 | 亚洲综合区| 日韩欧美大片在线观看 | 亚洲欧美激情精品一区二区 | 国产精品视频网 | 日本在线观看网址 | 色网在线播放 | 蜜桃视频成人 | 黄色大片视频 | 日本一区二区在线视频 | av福利网站| 久久国产精品一区二区三区 | 桃色五月 | 午夜色婷婷 | 午夜视频免费在线 | 国精产品一区一区三区免费完 | 亚洲精品福利视频 | 国产精品欧美一区二区 | 亚洲三级免费看 | 午夜免费小视频 | 久久久久久国 | 男女搞网站 | 国产超碰人人爽人人做人人爱 | 天天爽天天操 | 国产精品久久久久久久三级 | 中文字幕在线观看精品 | 成人三级视频在线观看 |