undefined
js是一门弱类型语言,声明变量的时候统一通过var
或let
关键字。但是即使这是一门弱类型语言它也要分类型。在我们定义一个变量不赋初值的时候,系统是不知道这个变量是什么类型的。
var str; // undefined
undefined
表示的是一个还不知道数据类型的变量。
引用阮一峰大牛的一句话:
1995年JavaScript诞生时,最初像Java一样,只设置了null作为表示”无”的值。
但是,JavaScript的设计者Brendan Eich,觉得这样做还不够,有两个原因。
首先,null像在Java里一样,被当成一个对象。但是,JavaScript的数据类型分成原始类型(primitive)和合成类型(complex)两大类,Brendan Eich觉得表示”无”的值最好不是对象。
其次,JavaScript的最初版本没有包括错误处理机制,发生数据类型不匹配时,往往是自动转换类型或者默默地失败。Brendan Eich觉得,如果null自动转为0,很不容易发现错误。
因此,Brendan Eich又设计了一个undefined。
JavaScript的最初版本是这样区分的:null是一个表示”无”的对象,转为数值时为0;undefined是一个表示”无”的原始值,转为数值时为NaN。
null
如果学过其他面向对象语言,肯定知道null
是指一个空对象。但是在js中,null
不是对象,而是指向空对象的指针。
打印typeof null
你会发现结果是一个object
,这是设计错误,但是因为有很多代码都是基于这个错误去设计的,为了不影响以前的代码,所以这个错误被保留了下来。
console.log(typeof null); // 'object'
引用知乎一位大牛的一句话:
JS类型值是存在32 BIT 单元里,32位有1-3位表示类型标记位(TYPE TAG),其它位表示真实值。
而表示object的类型标记位(TYPE TAG)正好是低三位都是0
000: object. The data is a reference to an object.而js里的
null
是机器码NULL空指针, (0x00 is most platforms).所以空指针引用 > 加上 对象标记还是0,最终体现的类型还是object。
null是让一个存放对象类型的引用不指向任何对象(没有对象),而null本身不是一个对象