浅入浅出的JavaScript(1) Undefined 类型与 Null 类型

392 阅读2分钟

在学习 JavaScript 的过程中,常常对 undefinednull 感到困惑 ,今天就好好理一下两者之间的关系。

1 Undefined 类型

1.1 Undefined 类型的定义

Undefined 类型只有一个值,就是 undefined。当用 varlet 声明了一个变量没有赋值时,就相当于给这个变量赋予了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