TypeScript+Vue.js前端开发从入门到精通
上QQ阅读APP看书,第一时间看更新

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类型的变量来使用。