欧美日韩国产一区二区三区不卡,欧洲一区二区三区精品,日韩一区不卡,成人国产二区

undefined什么意思(深入探究:null 和 undefined 究竟有何區(qū)別?)

時(shí)間:2024-04-01 12:31:28 閱讀:10

深化探求:null 和 undefined 畢竟有何區(qū)別?

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

總的來(lái)說(shuō) nullundefined 都代表空,主要區(qū)別在于 undefined 表現(xiàn)尚未初始化的變量的值,而 null 表現(xiàn)該變量故意短少目標(biāo)指向。

  • undefined
    • 這個(gè)變量從基本上就沒(méi)有界說(shuō)
    • 隱蔽式 空值
  • null
    • 這個(gè)值固然界說(shuō)了,但它并未指向任何內(nèi)存中的目標(biāo)
    • 聲明式 空值

MDN 中給出的界說(shuō)

null

null 是一個(gè)字面量,不像 undefined ,它不是全局目標(biāo)的一個(gè)屬性。null 是表現(xiàn)短少的標(biāo)識(shí),指示變量未指向任何目標(biāo)。把 null 作為尚未創(chuàng)建的目標(biāo),約莫更好了解。在 API 中,null 常在前往典范應(yīng)是一個(gè)目標(biāo),但沒(méi)有關(guān)聯(lián)的值的場(chǎng)合使用。

undefined

undefined全局目標(biāo) 的一個(gè)屬性。也就是說(shuō),它是全局作用域的一個(gè)變量。undefined 的最初值就是原始數(shù)據(jù)典范 undefined

一張神奇的圖片

接下去我們看一張比力經(jīng)典的圖片,該圖來(lái)自 stackoverflow 的回復(fù),本人沒(méi)有找到準(zhǔn)確的出處。


體現(xiàn)情勢(shì)

在更深化了解 nullundefined 的區(qū)別前,我們起主要曉得 nullundefinedJS 中有什么不同的體現(xiàn)情勢(shì),用以便利我們更好的了解 nullundefined 的區(qū)別。

typeof

typeof null // 'object' typeof undefined // 'undefined'

Object.prototype.toString.call

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

== 與 ===

null == undefined // true null === undefined // false !!null === !!undefined // true

Object.getPrototypeOf(Object.prototype)

JavaScript 中第一個(gè)目標(biāo)的原型指向 null

Object.getPrototypeOf(Object.prototype) // null

+ 運(yùn)算 與 Number()

let a = undefined + 1 // NaN let b = null + 1 // 1 Number(undefined) // NaN Number(null) // 0

JSON

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() // false test(undefined) // false test('test') // ture let undefined = 'test' // Uncaught SyntaxError: Identifier 'undefined' has already been declared

深化探究

為什么 typeof null 是 object?

typeof null 輸入為 'object' 但是是一個(gè)底層的錯(cuò)誤,但直到現(xiàn)階段都無(wú)法被修復(fù)。

緣故是,在 JavaScript 初始版本中,值以 32位 存儲(chǔ)。前 3位 表現(xiàn)數(shù)據(jù)典范的標(biāo)志,其他位則是值。

關(guān)于一切的目標(biāo),它的前 3位 都以 000 作為典范標(biāo)志位。在 JavaScript 早前版本中, null 被以為是一個(gè)特別的值,用來(lái)對(duì)應(yīng) C 中的 空指針 。但 JavaScript 中沒(méi)有 C 中的指針,以是 null 意味著什么都沒(méi)有大概 void 并以 全0(32個(gè)) 表現(xiàn)。

因此每當(dāng) JavaScript 讀取 null 時(shí),它前端的 3位 將它視為 目標(biāo)典范 ,這也是為什么 typeof null 前往 'object' 的緣故。

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

toString()Object 的原型辦法,調(diào)用該辦法,默許前往如今目標(biāo)的 [[Class]] 。這是一個(gè)內(nèi)里屬性,其格式為 [object Xxx] ,此中 Xxx 就是目標(biāo)的典范。

JavaScript 萬(wàn)物皆目標(biāo),為什么 xxx.toString() 不克不及前往變量典范?

這是由于 各個(gè)類中重寫(xiě)了 toString 的辦法,因此必要調(diào)用 Object 中的 toString 辦法,必需使用 toString.call() 的辦法調(diào)用。

關(guān)于 Object 目標(biāo),直接調(diào)用 toString() 就能前往 '[object Object]' 。而關(guān)于其他目標(biāo),則必要經(jīng)過(guò) call / apply 來(lái)調(diào)用才干前往準(zhǔn)確的典范信息。

為什么 == 和 === 比力會(huì)顯現(xiàn) true 和 false ?

很多文章說(shuō):undefined 的布爾值是 falsenull 的布爾值也是 false ,以是它們?cè)诒攘r(shí)都轉(zhuǎn)化為了 false ,以是 undefined == null
實(shí)踐上并不是如此的。

ECMA11.9.3 章節(jié)中明白報(bào)告我們:

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)換,在實(shí)行 加法運(yùn)算 前,隱士典范轉(zhuǎn)換會(huì)實(shí)驗(yàn)將表達(dá)式中的變量轉(zhuǎn)換為 number 典范。如:'1' + 1 會(huì)取得后果 11

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

至于為什么實(shí)行云云的轉(zhuǎn)換辦法,我推測(cè)是 JavaScript 早前的一個(gè)糟糕計(jì)劃。

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

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

但是這條沒(méi)有很好的表明辦法, JSON 會(huì)將 undefined 對(duì)應(yīng)的 key 刪除,這是 JSON 本身的轉(zhuǎn)換準(zhǔn)則。

undefined 的情況下,有無(wú)該條數(shù)據(jù)是沒(méi)有區(qū)別的,由于他們?cè)隗w現(xiàn)情勢(shì)上并無(wú)不同:

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

但必要注意的是,你約莫在調(diào)用接口時(shí),必要對(duì) JSON 格式的數(shù)據(jù)中的 undefied 舉行特別處理。

為什么 let undefiend = 'test' 可以掩蓋掉 JavaScript 本身的 undefined?

JavaScript 關(guān)于 undefined 的限定辦法為全局創(chuàng)建了一個(gè)只讀的 undefined ,但是并沒(méi)有徹底克制局部 undefined 變量的界說(shuō)。

聽(tīng)說(shuō)在 JavaScript 高版本克制了該利用,但我沒(méi)有準(zhǔn)確的依據(jù)。

請(qǐng)?jiān)谌魏螘r(shí)分,都不要舉行 undefined 變量的掩蓋,就算是你的 JSON 轉(zhuǎn)換將 undefined 轉(zhuǎn)換為 '' 。也不要經(jīng)過(guò)該利用舉行,這將是及其傷害的舉動(dòng)。

總結(jié)

關(guān)于使用 undefined 照舊 null

這是一條公說(shuō)共有理婆說(shuō)婆有理的爭(zhēng)議內(nèi)容。
本人更傾向于使用
null ,由于這是體現(xiàn)界說(shuō)空值的辦法。我并不克不及給出準(zhǔn)確的來(lái)由。

但關(guān)于使用 undefined 我有一條發(fā)起:
假如你必要使用 undefined 界說(shuō)空值,請(qǐng)不要接納以下兩種辦法:

  • let a;
  • let a = undefined;

進(jìn)而接納底下這種辦法顯式聲明 undefined

  • let a = void 0;

結(jié)語(yǔ)

終于將 undefinednull 的基本區(qū)別搞定了。

版權(quán)聲明:本文來(lái)自互聯(lián)網(wǎng)整理發(fā)布,如有侵權(quán),聯(lián)系刪除

原文鏈接:http://www.freetextsend.comhttp://www.freetextsend.com/qingganjiaoliu/44583.html


Copyright ? 2021-2022 All Rights Reserved 備案編號(hào):閩ICP備2023009674號(hào) 網(wǎng)站地圖 聯(lián)系:dhh0407@outlook.com

主站蜘蛛池模板: 酒泉市| 新竹市| 宣化县| 南通市| 翁源县| 白河县| 辽宁省| 丰原市| 阿克| 军事| 嘉荫县| 新龙县| 凤山市| 广水市| 盐源县| 瑞安市| 唐河县| 顺义区| 玉环县| 沅陵县| 镇安县| 巴马| 海南省| 沿河| 曲阳县| 清涧县| 河西区| 炉霍县| 安溪县| 沽源县| 阆中市| 中方县| 平安县| 三都| 东安县| 三穗县| 南岸区| 隆安县| 龙山县| 内黄县| 恩平市|