在学习 JavaScript 的过程中,常常对 undefined 和 null 感到困惑 ,今天就好好理一下两者之间的关系。
1 Undefined 类型
1.1 Undefined 类型的定义
Undefined 类型只有一个值,就是 undefined。当用 var 和 let 声明了一个变量没有赋值时,就相当于给这个变量赋予了undefined 值。不需要显示地给变量赋值 undefined 来进行初始化,默认情况下,任何未初始化的值都会被赋值 undefined。
let name // 相当于 let name = undefined
console.log(name) // undefined
1.2 值 undefined 与未定义变量的区别
let name // 变量声明但是未进行初始化,所以值为 undefined
console.log(name) // undefined
// console.log(age) // 报错,age没有被声明,所以会直接报错
console.log(typeof name) // undefined
console.log(typeof age) // undefined
无论变量是未初始化还是未声明,调用 typeof 返回的值都为 undefined
let name
if(name) { // 不执行
console.log('执行')
}
if(!name) { // 执行
console.log('执行')
}
if(age) { // age 没有声明,程序直接报错
console.log('执行')
}
if(!age) { // age 没有声明,程序直接报错
console.log('执行')
}
1.3 undefined 值出现的3种常见场景
- 声明一个变量,但没有赋值
let name // 相当于 let name = undefined
console.log(name) // undefined
- 访问对象上不存在的属性或未定义的变量
let obj = {}
console.log(obj.name) // undefined
console.log(typeof obj.name) // undefined
- 函数定义了形参,但没有传递实参
function fn(arg) {
console.log(arg)
}
fn() // undefined
2 Null 类型
2.1 Null 类型的定义
Null 类型同样只有一个值,就是 null,逻辑上讲,null 值表示一个空对象的指针,这也是 typeof null 返回 'object' 的原因
console.log(typeof null) // 'object'
console.log(typeof {}) // 'object'
2.2 作为原型链的最终指向
console.log(Object.prototype.__proto__ == null) // true
3 Undefined 类型和 Null 类型的联系与区别
3.1 联系
undefined值 是null值派生而来,增加undefined就是为了正式明确空指针(null) 和未初始化变量(undefined)的区别- 因为
undefined值 是null值派生而来,所以它们表面上相等
console.log(null == undefined) // true
console.log(null === undefined) // false
3.2 区别
Number(null)的值为 0,Number(undefined)的值为NaN