null 和 undefined 的区别
1.相似性
在JavaScript中,将一个变量赋值为undefined或null,老实说,几乎没区别。
var a = null
var a = undefined
上面代码中,a变量分别被赋值为 undefined 和 null,这两种写法几乎等价。
undefined和null在语句中,都会被自动转为false,相等运算符甚至直接报告两者相等。
console.log(null== undefined) //true
console.log(null ===undefined) //false
由此观察可知:null 和 undefined 两者相等,但是当两者做全等比较时,两者又不等。
2.区别
null是一个表示"无"的对象,转为数值时为0
典型用法:
-
作为函数的参数,表示该函数的参数不是对象。
-
作为对象原型链的终点
undefined是一个表示"无"的原始值,转为数值时为NaN
典型用法:
-
变量被声明了,但没有赋值时,就等于undefined。
-
调用函数时,应该提供的参数没有提供,该参数等于undefined。
-
对象没有赋值的属性,该属性的值为undefined。
-
函数没有返回值时,默认返回undefined。
3.数据类型
console.log(typeof null ) //object
console.log(typeof undefined) //undefined
其实,null 有属于自己的类型 Null,而不属于Object类型,typeof 之所以会判定为 Object 类型,是因为JavaScript 数据类型在底层都是以二进制的形式表示的,二进制的前三位为 0 会被 typeof 判断为对象类型,而 null 的二进制位恰好都是 0 ,因此,null 被误判断为 Object 类型。
-
000 – 对象,数据是对象的应用
-
1 – 整型,数据是31位带符号整数
-
010 – 双精度类型,数据是双精度数字
-
100 – 字符串,数据是字符串
-
110 – 布尔类型,数据是布尔值
我们可以通过另一种方法获取 数据 的真实类型:
Object.prototype.toString.call(null) // [object Null]
Object.prototype.toString.call(undefined) // [object Undefined]
通过 Object 原型上的toString() 方法可以获取到JavaScript 中对象的真实数据类型