2-7 Undefined与Null
前面讲过,JavaScript中定义的原始类型有5种:Undefined、Null、Boolean、Number、String。切记,只有这5种原始类型。原始类型数据是直接使用字面值来创建的。其中,Undefined和Null类型比较特殊。
Undefined类型只有一个值,即undefined。其意义也如所描述的那样,即未被定义的。例如,一个变量只是被声明,其值就是undefined,其类型就是Undefined类型。JavaScript中的typeof关键字可以用来获取变量或值的类型,示例如下:
需要注意,仅仅被声明但未被赋值的变量是未定义的,实际上从没有声明过的变量也是未定义的,示例如下:
typeof是一个特殊的运算符,但如果将未声明过的变量用于其他运算符,将会产生运行错误。
执行一个没有返回值的函数后,也会返回undefined值,示例如下:
可能你现在对函数还不太理解,不用担心,后面我们会专门学习函数的相关内容。
Null类型是ECMAScript中另一种只有一个值的类型,其字面值为null。Null类型的定义唯一的用途是作为空对象的占位。现在,你可能对对象也不太理解,在介绍原始值与引用值时提到过对象,对象是一种复杂数据类型,对象变量中实际存储的是对象的引用地址。ECMAScript中的对象不属于原始类型,原则上它们之间并不会产生强关系,然而在实际开发中,开发者往往需要一种约定的值来表示空对象,即要有一个约定的值来描述一个无用的地址,这个值就是null。开发者在使用对象前,发现变量中存储的引用地址为null时,就知道此对象还没有被初始化,或者此对象已经不存在了。
如果在JavaScript中使用typeof来对null值进行类型检查,你会惊奇地发现其返回的类型是object,这或许是JavaScript前期实现上的一个错误,但是其也恰恰与null是空对象的占位这一概念完全契合。因此,在ECMAScript标准中沿用了这一定义。示例如下:
现实世界中,很多设计可能都不是最正确的,却无疑是最合适的。一个很有趣的例子来自键盘设计。客观地说,目前主流键盘布局并不科学,这种“QWERTY”布局的键盘设计之初是供打字机用的,而“ABCDEF”排序的键盘在打字速度过快时,往往会产生卡顿问题。为了解决这个问题,克里斯托夫·拉森·肖尔斯刻意将高频字符放置在相反的方向,以最大限度地放慢敲键速度。也就是说,现代键盘的布局设计是为了降低打字速度。另一种更科学的键盘布局方式为DVORAK布局,如果在互联网上搜索DVORAK关键字,你会搜出很多理由阐述这种布局的好处,然而其依旧无法成为主流,人们的习惯根深蒂固且不会轻易尝试去改变。