let a = null;
let b = undefined;
console.log(a == b) // true
console.log(a === b) // false
复制代码
if (null) {
console.log('null', null)
} else {
console.log('!null', !null) // 此项会输出 !null true
}
if (undefined) {
console.log('undefined', undefined)
} else {
console.log('!undefined', !undefined) // 此项会输出 !undefined true
}
复制代码
console.log(Number(null)); // 0
console.log(Number(undefined)); // NaN
复制代码
为什么二者获得的结果不同呢?很显然,二者是彻底不一样的两种类型javascript
console.log(typeof null) // object
console.log(typeof undefined) // undefined
复制代码
能够看到null 是Object类型,undefined 是Undefined类型,看到这里我不由有了一个疑问,若是null是引用数据类型,那么我在MDN上看到的null则是基本数据类型,是MDN写错了?java
答案应该没有这么简单。 引用“在 javascript 的最第一版本中,使用的 32 位系统,而且底层都表示为2进制,为了性能考虑使用低位存储了变量的类型信息:000:对象1:整数010:浮点数100:字符串110:布尔所有为0: null,因此typeof就是利用这一机制去判断的,因此null所有为0就复合了对象的000,因此被判断为object”bash
因此使用typeof判断变量类型的方式并不许确。post
console.log(Object.prototype.toString.call(null)) // [object Null]
console.log(Object.prototype.toString.call(undefined)) // [object Undefined]
复制代码
因此null依然是基本数据类型Null, undefined也是基本数据类型Undefined性能
首先咱们须要先了解一个null值是什么?MDN上是这样描述的:In computer science, a null value represents a reference that points, generally intentionally, to a nonexistent or invalid object or address. The meaning of a null reference varies among language implementations. 翻译过来就是: 在计算机科学中,一个null值表明一个指针的引用,一般来指一个不存在的或者无效的对象或者地址。空引用的含义因语言实现而异。
在1995年JavaScript诞生的时候,只设置了null值,并被设计为能够自动转为0。null表示为空对象的引用,因为JavaScript数据类型分为基本数据类型和引用数据类型,因此JavaScript的设计者Brendan Eich认为最好不要用null表示基本数据类型变量未初始化时的值,因此后来又定义了undefined来表示基本数据类型未初始化时的值。ui