背景:每一種計(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