1.1 ECMAScript角度弄懂几个概念
1.1.1 基本类型
ECMAScript中有5种简单数据类型(也称为基本数据类型):Undefined、Null、Boolean、Number和String,还有一种复杂数据类型Object,typeof操作符匹配的格式都将是上述格式之一。
1.1.2 基本包装类型
为了便于操作基本类型值,ECMAScript还提供了三个特殊的引用类型:Boolean、Number和String,称为基本包装类型,每当读取一个基本类型值的时候,后台就会创建一个对应的基本包装类型的对象,从而让我们能够调用一些方法来操作这些数据。
延伸一下,引用类型是一种数据结构,有时候被称为对象定义,因为它们描述的是一类对象所具有的属性和方法,跟面向对象语言中的类看起来类似。
var s1 = "some text";
var s2 = s1.substring(2);
上述栗子中第一行s1变量包含一个字符串的基本类型值,理论上讲基本类型值不是对象,不应该有方法,但是确实有方法,这是为什么呢?
可以将上述栗子想象成下面的同样代码在后台自动实现的:
var s1 = new String("some text");
var s2 = s1.substring(2);
s1 = null;
- 创建String类型的一个实例;
- 在实例上调用指定的方法;
- 销毁这个实例;
经过此番处理,基本的字符串就变得跟对象一样了。
引用类型和基本包装类型的主要区别就是对象的生存期。使用new操作符创建的引用类型的实例,在执行流离开当前作用域之前一直存在,自动创建的包装类型的对象,则只存在于代码执行的一瞬间,然后立即销毁,意味着我们不能在运行时为基本类型值添加属性和方法。
可以显式地创建基本包装类型的对象,但不建议这么做,因为这种做法让人分不清是处理基本类型还是引用类型的值。
1.1.3 转型函数与构造函数
Number()、String()、Boolean()等转型函数可以将括号内的值转换程对应格式,构造函数饰使用new关键字调用基本包装类型,两者也有区别:
var value = "25";
var number = Number(value); //转型函数
alert(typeof number); //"number"
var obj = new Number(value); //构造函数
alert(typeof obj); //"object"
1.2 再看TypeScript的封装对象
先看一个栗子:
let a: boolean = new Boolean(1); //错误
let b: boolean = Boolean(1); //正确
Typescript中,Boolean是boolean的封装对象,Boolean对象的值是boolean类型。根据构造函数的概念知道第一行用typeof识别出来的格式是object,但是它只能接收boolean g格式,当然报错,第二行的值是没问题的。我理解的封装对象就是ECMAScript的显式调用基本包装类型。
封装对象的使用如下:
let a: number = 2.8;
let b: number = new Number("2"); //错误
let c: Number = new Number("2"); //正确
总结一下,用New String()构造函数来定义一个String对象(封装对象),它的值是string基本类型,但是格式属于Object,转型函数只是进行格式的转换。