0%

underfined与null的区别

在javascript中undefinednull都可以表示空,不存在,他们之间有什么联系和区别呢?

undefinednull作为条件的时候都等价于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 !== nulltypeof undefined的结果是'undefined',而typeof null的结果是'Object'

那么undefinednull什么时候会出现呢?由于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 //NaN

null的底层是一个0,而undefined本质是一个特殊的对象

总结
undefined一般是系统被动产生的,是一种被迫的替代性方案:

  1. 变量没有声明
  2. 函数没有returnreturn为空
  3. 参数没有给值
  4. 对象没有该属性
  5. 本质上是个特殊对象,不能参与和number的运算

null往往是主动返回的,是开发者主动选择的结果

  1. 本质上是0,可以参与和number的运算
  2. 可以用于函数调用时,显示地传递空参数,防止默认值
Disqus评论区没有正常加载,请使用科学上网