undefined與null的區(qū)別

背景:每一種計(jì)算機(jī)語(yǔ)言幾乎都有一個(gè)表示“無(wú)”的值,但是JS有兩個(gè):undefined和null,其實(shí)兩者幾乎一樣,沒(méi)有太大的區(qū)別,在if語(yǔ)句中都會(huì)被自動(dòng)轉(zhuǎn)換為false,相等運(yùn)算的結(jié)果也為true,如:

if(!undefined){
    console.log('undefined is false')     undefined is false
}

if(!null){
    console.log('null is false')     null is false
}

console.log(undefined == null)     // true

既然兩者相似,為什么會(huì)同時(shí)存在與JS中呢?

一、歷史原因

最初JS誕生時(shí),和Java一樣只設(shè)置了null表示“無(wú)”的值,參與運(yùn)算時(shí)會(huì)自動(dòng)轉(zhuǎn)換為0,如:

Number(null)     // 0
1 + null      // 1

后來(lái)JS的設(shè)計(jì)者覺(jué)得這樣還不夠,原因是:
1、像Java一樣mull被當(dāng)成一個(gè)對(duì)象,但是JS分為原始數(shù)據(jù)類型和合成數(shù)據(jù)類型,JS設(shè)計(jì)者認(rèn)為被作為“無(wú)”的值不應(yīng)該是一個(gè)對(duì)象
2、JS最初沒(méi)有錯(cuò)誤處理機(jī)制,發(fā)生數(shù)據(jù)類型不匹配時(shí),往往是自動(dòng)轉(zhuǎn)換或者默默第失敗,如果null自動(dòng)轉(zhuǎn)換為0很不容易發(fā)現(xiàn)錯(cuò)誤,于是就有了undefined

二、最初設(shè)計(jì)

JS最初是這樣區(qū)分undefined和nul的:null是一個(gè)表示“無(wú)”的對(duì)象,轉(zhuǎn)換為數(shù)值是0;undefined是一個(gè)表示“無(wú)”的原始值,轉(zhuǎn)換為數(shù)值是NaN,RU :

console.log(undefined)     // NaN
console.log(null)     // 0
三、現(xiàn)在用法

兩者的基本意義相同,差別在于:
1、null表示“沒(méi)有對(duì)象”,即該處不應(yīng)該有值,如:
(1)作為函數(shù)的參數(shù),表示該函數(shù)的參數(shù)不是對(duì)象
(2)作為對(duì)象原型鏈的終點(diǎn)

2、undefined表示“缺少值”,即此處應(yīng)該有值,但是還沒(méi)有定義,如:
(1)變量被聲明了,但是沒(méi)有賦值,就等于undefined

var i;
console.log(i)     // undefined

(2)調(diào)用函數(shù)時(shí),應(yīng)該提供的參數(shù)沒(méi)提供,該參數(shù)等于undefined

function f(x){
    console.log(x)     // undefined
}
f() 

(3)對(duì)象沒(méi)有的屬性,該屬性值為undefined

var  o = new Object();
console.log(o.p)     // undefined

(4)函數(shù)沒(méi)有返回值時(shí),默認(rèn)返回undefined

var x = f();
console.log(x)     // undefined
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容