数据类型
JavaScript规定了7种语言类型。根据最新的ECMAScript规范,这7种类型是:
- Undefined
- Null
- Boolean
- String
- Number
- Symbol
- Object
前6中数据类型属于简单数据类型(基本数据类型/原始数据类型),只有Object属于复杂数据类型。
typeof
我详情介绍数据类型之前,我们要了解一下typeof操作符,它可以用来检测数据类型。
typeof操作符返回一个字符串,表示操作数类型。
| typeof | 运行时类型 |
|---|---|
| object | Null |
| object | Object |
| function | Object |
| number | Number |
| string | String |
| boolean | Boolean |
| undefined | Undefined |
| symbol | Symbol |
typeof 123 // 'number'
typeof '123' // 'string'
Undefined
Undefined 类型表示未定义(已声明,未初始化),它只有一个值,即 undefined 。任意变量在未赋值之前都是 Undefined类型,值为 undefined 。
var a;
a === undefined; // true
typeof a === 'undefined'; // true
Null
Null 类型表示空值(已声明,初始化为null),它只有一个值,即 null 。
与 undefined 不同,null 是JavaScript的关键字。
var a = null;
a === null; // true
typeof a === 'object' // true
Boolean
Boolean类型表示逻辑意义上的真和假,它有两个值,true和false。
var a = true;
a === true; // true
typeof a === 'boolean'; // true
下表为各种数据类型转换为Boolean的规则
| 数据类型 | 转换为true的值 | 转换为false的值 |
|---|---|---|
| Boolean | true | false |
| String | 任何非空字符串 | ""(空字符串) |
| Number | 任何非零数字值(包括无穷大) | 0和NaN |
| Object | 任何对象 | null |
| Undefined | n/a | undefined |
| Symbol | Symbol | n/a |
String
String类型表示文本数据。
String类型用于表示由16位Unicode字符组成的字符序列。 现行的字符集国际标准,字符是以Unicode的方式表示的,每一个Unicode的码点表示一个字符,理论上,Unicode的范围是无限的。UTF是Unicode的编码方式,规定了码点在计算机中表示方法,常见的有UTF16和UTF8。Unicode的码点通常是用 U+???来表示,其中???是十六进制的码点值。0-65536(U+0000 - U+FFFF)的码点被称为基本字符区域(BMP)。
字符字面量
String类型包含一些特殊的字符字面量,也叫转义序列。每个转义序列被作为一个字符来解析。
| 字面量 | 含义 |
|---|---|
| \n | 换行 |
| \t | 制表 |
| \b | 空格 |
| \r | 回车 |
| \f | 进纸 |
| \ | 斜杠 |
| ' | 单引号('),在用单引号表示的字符串中使用。例如: 'He said, 'Hey'' |
| " | 双引号('),在用双引号表示的字符串中使用。例如: 'He said, 'Hey'' |
| \x nn | 以十六进制代码nn表示的一个字符(其中n为0~F)。例如:\x41 表示"A" |
| \u nnnn | 以十六进制代码nnnn表示一个Unicode字符(其中n为0~F)。例如:\u03a3表示希腊字符∑。 |
// 练习题
var text = "This is comma: \u002C.";
text.length; // 17
var text = "This is comma: ,.";
text.length; // ?
字符串的特点
JavaScript中的字符串是不可变的,一旦字符串被创建,就无法改变,所以字符串具有值类型的特征。
var lang = 'java';
lang = lang + 'script';
步骤如下:
- 声明lang变量,创建一个长度为4的字符串,然后把'java'赋值给lang
- 创建一个长度为10的字符串,然后把'javascript'赋值给lang,销毁 'java' 和 'script'
Number
Number类型表示数字,它使用IEEE754格式来表示整数和浮点数。
IEEE754: 二进制浮点数算术标准。
整数
我们经常用到是十进制的整数,那么除了十进制外,还可以通过八进制、十六进制来表示整数。
var num10 = 10; // 十进制 10
var num8 = 012; // 八进制 10
var num16 = 0xA; // 十六进制 10
num10 + num8 + num16 // ?
在进行算术计算时,结果都会转换为十进制数值。
浮点数
浮点数即我们通常用到的小数。
0.1 + 0.2 === 0.3 // ?
这里输出的结果是false,说明两边不相等,这是浮点运算的特点,只要基于IEEE754格式实现的语言都会有这个毛病。
所以,正确比较的方式是使用JavaScript提供的最小精度值来比较
Math.abs(0.1 + 0.2 - 0.3) <= Number.EPSILON; // true
还可以使用第三方插件实现,比如: bignumber.js
var x = new BigNumber(0.1);
x.plus(0.2).toNumber() === 0.3 // true
数值范围
Number能够表示数值范围是,
Number.MIN_VALUE; // 5e-324
Number.MAX_VALUE; // 1.7976931348623157e+308
超出这个范围的值,将会自动转为特殊的 Infinity 值。Infinity为正无穷,-Infinity为负无穷。
1 / +0 // Infinity
1 / -0 // -Infinity
这里需要注意一点,在JavaScript中有 +0 和 -0,区分他们方式就是检测 1 / x 的结果是 Infinity 还是 -Infinity。
NaN
顾名思义,NaN 即 Not a Number,它是一个特殊的数值,这个数值用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛错误了)。
1 / 'qwe'; // NaN
任何涉及到NaN的操作都会返回NaN,而且NaN与任何值都不相等,包括它自己。
NaN / 10 // NaN
NaN === NaN // false
JavaScript提供了一个方法 isNaN,它接受一个参数,可以检测这个参数是否“不是数值”。
isNaN(NaN) // true
isNaN(10) // false
isNaN('yweg') // true
isNaN('10') // false
Symbol
Symbol是ES6中引入的新类型,表示独一无二的值,它的出现使对象的属性名可以使用两种类型,一个是String,一个是Symbol。凡是属性名是Symbol类型的,可以保证与其它属性名不会产生冲突。
Object
Object是JavaScript中最复杂的类型,也是JavaScript的核心机制之一。Object表示对象的意思,既表示客观世界中的某个具体的事物,又表示软件系统中的基本元素。
在计算机科学中,对象是指内存中的可以被标识符引用的一块区域。
在JavaScript中,对象的定义是“属性的集合”。当你声明一个对象时,它会自动初始化一组属性。
这些属性还可以被增减,属性的值可以是任意类型,包括具有复杂结构的对象。属性用键来标识,它的键值可以使一个字符串或者Symbol。
var obj = { name: 'jack' };
delete obj.name;
'name' in obj // false
参考
- 《JavaScript高级程序设计(第3版)》
- 《重学前端-极客时间》
- ECMAScript6入门-Symbol
- BigNumber.js
- JavaScript数据结构和数据类型