在javascript中
undefined
和null
都可以表示空,不存在,他们之间有什么联系和区别呢?
undefined
和null
作为条件的时候都等价于false
if(undefined) {
console.log(true)
} else {
console.log(false)
}
// false
if(null) {
console.log(true)
} else {
console.log(false)
}
//false
用松散比较判等的时候,JavaScript默认undefined == null
,而严格比较时,由于类型不一致undefined !== null
。typeof undefined
的结果是'undefined'
,而typeof null
的结果是'Object'
。
那么undefined
和null
什么时候会出现呢?由于Javascript是动态类型语言,一个变量被声明的时候他是什么类型取决于他指向的对象是什么类型,如果声明对象的时候没有初始化呢?let a
console.log(a)
//undefined
当声明的对象没有初始化的时候,默认的类型就是undefined
。那么如果变量都没有声明呢?console.log(typeof bbb)
//undefined
当变量都没声明的时候,默认的类型也是undefined
。
同理:如果一个函数没有没有返回值,或者返回了空,他的调用的返回结果就相当于未定义的变量或未初始化的变量。function func1() {}
function func2() {return;}
console.log(typeof func1()) //undefined
console.log(typeof func2()) //undefined
所以:当一个函数返回了空,或者就没有返回,调用的结果就是undefined
JavaScript允许调用函数的时候传入比参数列表长度少的值,没有被传参的值默认是undefined
function func3(a,b) {
console.log(a,b)
}
func3(1) // 1 undefined
JavaScript允许函数参数设置默认值,设置了默认值的参数,即使显示的传递了undefined
,还是会赋值给定的默认值。function func4(a, b = 1919810) {
console.log(a,b)
}
func4(114514, undefined) // 114514 1919810
函数调用传入undefined
参数等同于没传该参数。为了防止这种现象造成开发时的BUG,一般传空参数的时候,显示地传null
而不是undefined
function func4(a, b = 1919810) {
console.log(a,b)
}
func4(114514, null) // 114514 null
又例如解构赋值:const [a, b = 114514] = [1919810, undefined]
console.log(a,b) //1919810 114514
因为undefine
写了等于没写,所以实际上执行的是:const [a, b = 114514] = [1919810]
解释器检测到参数缺失,自然会给b
设置默认值。如果非要让b
不走默认值,就应该用null
:const [a, b = 114514] = [1919810, null]
console.log(a,b) //1919810 null
获取JSON中不存在的对象,返回undefined
data = {
name: 'tadokoro',
age: 114514
}
console.log(data["yarimasune"]) // undefined
null
可以成为数字0
,参与计算。而undefined
无法作为数字,undefined
参与计算会返回NaN
Number(null) //0
Number(undefined) //NaN
null + 10 //10
undefined + 10 //NaNnull
的底层是一个0
,而undefined
本质是一个特殊的对象
总结undefined
一般是系统被动产生的,是一种被迫的替代性方案:
- 变量没有声明
- 函数没有
return
或return
为空 - 参数没有给值
- 对象没有该属性
- 本质上是个特殊对象,不能参与和
number
的运算
null
往往是主动返回的,是开发者主动选择的结果
- 本质上是0,可以参与和
number
的运算 - 可以用于函数调用时,显示地传递空参数,防止默认值