王晨旭的个人网站

数据类型

ECMAScript 有 6 种原始类型(primitive type),即 Undefined、Null、Boolean、Number、String 和 Symbol(ES6新增)。

typeof 运算符

typeof 运算符有一个参数,即要检查的变量或值。例如:

typeof "test string"; //结果是 "string"
typeof 86; //结果是 "number"

对变量或值调用 typeof 运算符将返回下列值之一:

  • undefined - 如果变量是 Undefined 类型的
  • boolean - 如果变量是 Boolean 类型的
  • number - 如果变量是 Number 类型的
  • string - 如果变量是 String 类型的
  • symbol - 如果变量是 Symbol 类型的(ES6新增)
  • function - 如果变量是一个函数或者类
  • object - 如果变量是一种引用类型或 Null 类型的

Undefined 类型

Undefined 类型只有一个值:undefined,表示未定义的,除了直接给一个变量赋值为undefined,可以使得变量是undefined外, 没有进行赋值过的变量,也将是undefined

特别的,后面函数章节将会讲到的,无明确返回值的函数,返回值也是undefined

Null 类型

不只是Undefined 类型,Null 类型也只有一个值:null,表示空,跟在其他编程语言里一样,表示空指针,这也就是说 typeof null的值 object的原因。

Boolean 类型

Boolean 类型是 ECMAScript 中最常用的类型之一,它有两个值:truefalse,正如其字面量表示真假,或者说是一个关系表达式是否成立。例如:

console.log(1 > 2); //输出 false
console.log(1 < 2); //输出 true

Number 类型

ECMA-262 中定义的最特殊的类型是 Number 类型,因为它既可以表示32位整数(ES6中整数可以达到53位),又可以表示64为浮点数,甚至包括无穷的和非数(后面将会介绍)。

直接输入的任何数字都被看做 Number 类型的字面量。例如,下面的代码声明了存放整数值的变量,它的值由字面量 2018 定义:

var a = 2018;

十六进制、八进制和二进制表示

整数也可以被表示为十六进制(以 16 为底)、八进制(以 8 为底)或二进制(以 2 为底)的字面量。关于进制转换请参考附录:进制转换

如果想要表示一个十六进制整数,只需要以前导0x开头,然后紧跟十六进制表示法的数值就可,例如:

var a = 0x1A;

如果想要表示一个八进制整数,可以以前导0,然后紧跟八进制表示法的数值就可,例如:

var a = 012;

注意

严格模式中,不支持这种方式表示。

ES6也可以0o开头然后紧跟八进制表示法的数值就可,例如:

var a = 0o12;

ES6如果想要表示一个二进制整数,可以以前导0b,然后紧跟二进制表示法的数值就可,例如:

var a = 0b10010;

注意

十六进制、八进制和二进制表示中的字母不区分大小写。

十六进制、八进制和二进制表示只能表示整数,不能表示小数,且不支持后面提到的科学计数法。

浮点数

要定义浮点值,必须包括小数点和小数点后的一位数字(例如,用 1.0 而不是 1)。这被看作浮点数字面量

var a = 1.0;

注意

对于浮点字面量的有趣之处在于,用它进行计算前,真正存储的是字符串。

所以,没有参与过计算的浮点数,不会失去其精确度。

科学计数法

我们数学中,常常采用科学计数法表示一个大数字或者小数字。例如:

2.6 \times 10 ^ 5,
2.6 \times 10 ^ {-5}

那么在ECMAScript中要这样表示:

2.6e5
2.6e-5

特殊的 Number 值

ECMAScript中有两个特殊的 Number 值:InfinityNaN

Infinity表示无穷大,例如任意的非零数,除以0都是无穷大(或者负无穷大)。

NaN 是 Not a Number 的缩写,表示一个不确定的数,非零数除以0是无穷大,但是 0 除以 0 ,直接超出了数学定义,就是NaN。
特别的,任意两个NaN,都不相等,包括为NaN的同一个变量比较。例如:

var a = NaN;
console.log(a == a);//输出 false

借助这个特性,就可以判断一个变量是不是NaN,因为只有NaN不等于自身,当然也有一个判断是否是NaN的函数isNaN

String 类型

String 类型指的是字符串,即一串字符,可以用字符串存储 0 或更多的 Unicode 字符。
字符串中每个字符都有特定的位置,首字符从位置 0 开始,第二个字符在位置 1,依此类推。这意味着字符串中的最后一个字符的位置一定是字符串的长度减 1。
字符串字面量是由双引号(”)、单引号(’)或是ES6反引号(`)声明的。
由双引号或单引号声明的字符串,不能直接包含换行或在多行中声明,但是由反引号声明的字符串的却可以。例如:

var a = "由双引号声明的字符串";
var b = '由单引号声明的字符串';
var c = "由双引号或单引号声明的字符串,\
要想在多行书写,必须在除最后一行以外的每一行最后添加一个反斜杠\
正如这段话的前两行一样。但本质上,还是一行的内容";
var d = `这是由反引号声明的字符串,
里面可以直接包含换行,
就像这一段。`;

当然反引号还有更强大的功能,本节后面及函数部分还会提到。

转义字符

如果你一句话中,既包含双引号、单引号,由包含反引号,这个时候就必须用到转义字符,否则,你正文中的某一个引号总会被误以为是字符串的结束,所以这个时候,我们就需要用转义字符来代替原来的字符。ECMAScript中的转义字符如下:

转义字符 含义
\n 换行
\t 制表符
\b 空格
\r 回车
\f 换页符
\\ 反斜杠
\‘ 单引号
\“ 双引号
\` 反引号
\0nnn 八进制代码 nnn 表示的字符
\xnn 十六进制代码 nn 表示的字符
\unnnn 十六进制代码 nnnn 表示的 Unicode 字符
\u{x} ES6十六进制代码 x(可以是1到8个) 表示的 Unicode 字符

Unicode 表示法

JavaScript 允许采用\uxxxx形式表示一个字符,其中xxxx表示字符的 Unicode 码点。但是这种方式只能表示码点在\u0000 ~ \uFFFF之间的字符,超出这个范围的必须使用两个双字节表示。ES6为了解决这种问题,引入了新的表示方式\u{xxxxx},将放入大括号内就能表示超出两字节的字符。例如

"\u0061"// "a"
"\uD842\uDFB7"// "𠮷"
"\u20BB7"// " 7"
"\u{20BB7}"// "𠮷"
"\u{41}\u{42}\u{43}"// "ABC"

另外,因为\u{xxxxx}表示法,还支持直接作为标识符部分,当然会被解析为所表示的字符后用作标识符,例如:

let hello = 123;
hell\u{6F} // 123

ES6模板字符串

在以前,如果有多个变量作为一个字符串的参数,我们会要用字符串拼接,例如:

var a = 15;
var b = 43;
var str = "式子 " + a + " + " + b + " 的结果是 " + (a + b);

而ES6引入了模板字符串,使用反引号的声明中。可以直接插入${表达式},将会自动在插入的地方用表达式的值代替,例如:

var a = 15;
var b = 43;
var str = `式子 ${a} + ${b} 的结果是 ${a + b}`;

ES6 Symbol 类型

此处从略,将在后面详细介绍

《ECMAScript 基础教程》
  • 附录1 关键字与保留字一览表
  • 附录2 进制转换
  • 附录3 原生API手册
  • 附录4 ECMAScript 运行时错误一览表
  • 附录5 部分提案
    • 附录5.1 do 表达式
    • 附录5.2 throw 表达式
    • 附录5.3 链判断运算符
    • 附录5.4 管道运算符
    • 附录5.5 数值分隔符
    • 附录5.6 BigInt 数据类型
  • * 参考链接