2.2.2 特殊的空值类型
在JavaScript中有两个非常特殊的类型,分别是null类型和undefined类型。null类型对应的值只有一个,同样写作null。undefined类型对应的值也是只有一个,同样写作undefined。
很多时候,开发者对这两个类型的理解会造成混淆。虽然从行为上说,null和undefined有很多相似之处,但其应用场景和语义确实完全不同。
我们先来看undefined,这个值从命名上理解为未定义的。其表示的是一个变量最原始的状态,有如下几种场景。
1.声明了而未定义
示例如下:
【源码见附件代码/第2章/4.null-undefined/4.null-undefined.ts】
var o1:string; //将输出:undefined undefined console.log(o1, typeof o1);
在进行TypeScript编译时,上面的代码并不会报错,通过输出可以看到,变量o1的类型为undefined。这里需要注意,无论我们将变量声明为什么类型,其如果未定义,则都是undefined类型,值也是undefined,undefined和null是所有类型的子类型。
2.访问对象中不存在的属性
当访问了对象中不存在的属性时,也会返回undefined值,示例如下:
【源码见附件代码/第2章/4.null-undefined/4.null-undefined.ts】
var o2 = {}; //undefined console.log(o2["prop"]);
3.函数定义的形参未传递实参
当函数定义了参数但是调用时未传递参数时,其值也是undefined,示例如下:
【源码见附件代码/第2章/4.null-undefined/4.null-undefined.ts】
其实,上面的代码在TypeScript中已经无法编译通过了,TypeScript会检查函数的传参,对于未设置默认值的参数,如果也未传递实参,则会编译报错。
4.void表达式的值
undefined应用的最后一个场景是关于void表达式的,ECMAScript规定了void操作符对任何表达式求值的结果都是undefined,示例如下。
【源码见附件代码/第2章/4.null-undefined/4.null-undefined.ts】
//结果为undefined var o3 = void "Hello";
综上所述,undefined的语义表达了某个变量或表达式的原始状态,即未人为操作过的状态,通常我们不会将undefined赋值给某个变量,或在函数中返回undefined,即使我们可以这么做。
和undefined相比,null更多想表达的是某个变量被人为置空,例如当某个对象数据不再被使用时,我们就可以将引用它的变量置为null,垃圾回收机制会自动对其占用的内存进行回收。
关于null,有一点需要额外注意,如果我们对null使用typeof来获取类型,其会得到object类型,这是JavaScript语言实现机制上所造成的误解,但需要知道,null值的真正类型是null类型。
最后,还需要介绍一个void类型,void类型是TypeScript中提供的一种特殊类型,其表示“没有任何类型”,当一个函数没有返回值时,可以将其返回值的类型定义为void,示例如下。
【源码见附件代码/第2章/4.null-undefined/4.null-undefined.ts】
function func1():void {}
只有undefined和null两个值可以赋值给void类型的变量。但是通常情况下,我们并不会声明一个void类型的变量来使用。