總的來(lái)說(shuō) null 和 undefined 都代表空,主要區(qū)別在于 undefined 表現(xiàn)尚未初始化的變量的值,而 null 表現(xiàn)該變量故意短少目標(biāo)指向。
值 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 是 全局目標(biāo) 的一個(gè)屬性。也就是說(shuō),它是全局作用域的一個(gè)變量。undefined 的最初值就是原始數(shù)據(jù)典范 undefined 。
接下去我們看一張比力經(jīng)典的圖片,該圖來(lái)自 stackoverflow 的回復(fù),本人沒(méi)有找到準(zhǔn)確的出處。
在更深化了解 null 和 undefined 的區(qū)別前,我們起主要曉得 null 和 undefined 在 JS 中有什么不同的體現(xiàn)情勢(shì),用以便利我們更好的了解 null 和 undefined 的區(qū)別。
typeof null // 'object'
typeof undefined // 'undefined'
typeof null // '[object Null]'
typeof undefined // '[object Undefined]'
null == undefined // true
null === undefined // false
!!null === !!undefined // true
JavaScript 中第一個(gè)目標(biāo)的原型指向 null 。
Object.getPrototypeOf(Object.prototype) // null
let a = undefined + 1 // NaN
let b = null + 1 // 1
Number(undefined) // NaN
Number(null) // 0
JSON.stringify({a: undefined}) // '{}'
JSON.stringify({b: null}) // '{b: null}'
JSON.stringify({a: undefined, b: null}) // '{b: null}'
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' 但是是一個(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' 的緣故。
toString() 是 Object 的原型辦法,調(diào)用該辦法,默許前往如今目標(biāo)的 [[Class]] 。這是一個(gè)內(nèi)里屬性,其格式為 [object Xxx] ,此中 Xxx 就是目標(biāo)的典范。
這是由于 各個(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)確的典范信息。
很多文章說(shuō):undefined 的布爾值是 false , null 的布爾值也是 false ,以是它們?cè)诒攘r(shí)都轉(zhuǎn)化為了 false ,以是 undefined == null 。
實(shí)踐上并不是如此的。
ECMA 在 11.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 的源碼。
這觸及到 JavaScript 中的隱式典范轉(zhuǎn)換,在實(shí)行 加法運(yùn)算 前,隱士典范轉(zhuǎn)換會(huì)實(shí)驗(yàn)將表達(dá)式中的變量轉(zhuǎn)換為 number 典范。如:'1' + 1 會(huì)取得后果 11。
至于為什么實(shí)行云云的轉(zhuǎn)換辦法,我推測(cè)是 JavaScript 早前的一個(gè)糟糕計(jì)劃。
從言語(yǔ)學(xué)的角度來(lái)看:
null 意味著一個(gè)明白的沒(méi)有指向的空值,而 undefined 則意味著一個(gè)未知的值。
在某種水平上, 0 意味著數(shù)字空值。
這固然看起來(lái)有些牽強(qiáng),但是我在這一階段能所最能想到的約莫了。
但是這條沒(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 舉行特別處理。
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)。
這是一條公說(shuō)共有理婆說(shuō)婆有理的爭(zhēng)議內(nèi)容。
本人更傾向于使用 null ,由于這是體現(xiàn)界說(shuō)空值的辦法。我并不克不及給出準(zhǔn)確的來(lái)由。
但關(guān)于使用 undefined 我有一條發(fā)起:
假如你必要使用 undefined 界說(shuō)空值,請(qǐng)不要接納以下兩種辦法:
進(jìn)而接納底下這種辦法顯式聲明 undefined :
終于將 undefined 和 null 的基本區(qū)別搞定了。
版權(quán)聲明:本文來(lái)自互聯(lián)網(wǎng)整理發(fā)布,如有侵權(quán),聯(lián)系刪除
原文鏈接:http://www.freetextsend.comhttp://www.freetextsend.com/qingganjiaoliu/44583.html