概要
ECMAScript 的类型一共分为两大类,值类型以及引用类型。
值类型又称基础类型,具体如下:
undefined | 未定义 |
null | 空 |
boolean | 布尔 |
number | 数值 |
string | 字符串 |
symbol | 标记 |
引用类型又称复杂类型Object(对象),具体如下:
Object | 对象 |
Function | 函数 |
Array | 数组 |
RegExp | 正则 |
Date | 日期 |
基础类型
1、undefined(未定义)
undefined 类型只有一个值,在使用 var 声明变量时没初始化,此时变量值就为 undefined,在给变量初始化为 undefined 后,亦可于 undefined 等价,同时未定义的变量默认值也是undefind。
// 已定义,未初始化
var a
a // undefined
// 已定义变量,初始化为undefind
var b = undefined
b == undefined // true
// 未定义变量
c // undefined
2、null(空)
null 值表示一个空对象指针,因此在用 typeof 操作符检测 null 时会返回 "object"。
此外值得注意的一点,null 与 undefined 相互比较时返回为 true,尽管它们之间有这种关系,但它们的用途并不相同,故在多数情况下,需要对变量初始化时,用 null 代替 undefined 即可。
let a
let b = null
a == b // true
3、boolean(布尔)
boolean 类型只有两个值,分别是 true 和 false,且区分大小写,此外其它基础类型的值,在进行条件判断时会进行隐式转换,具体规则如下:
数值类型 | true | false |
Boolean | true | false |
String | 任意非空字符 | "" |
Number | 任何非零数值(包括无穷大) | 0,NaN |
Object | 任意对象 | null |
4、number(数值)
该类型可细分为整形和浮点型,同时也能表示十进制,八进制,十六进制。
八进制以0开头,且后方字符范围是 0~7;
十六进制以0x开头,且后方字符范围是(0~9及A~F),字符的大小写不受限制;
在进行算数运算时,八进制和十六进制都会转化为十进制数值
let a = 55 // 十进制
let b = 050 // 八进制
let c = 0xa // 十六进制
4.1、浮点数
所谓浮点数,就是该数字含有一个小数点,小数点后面必须有一个数字,且占用内存空间是整数的两倍,若小数点后面的值为0,则JS会将其默认转化为整型来存储。
4.2、e表示法
e为科学计数法,主要用于表示那些极大值和极小值,用e表示法的数值等于e前面的数乘以10的指数次幂,如下代码。
var a = 3.125e7 // 31250000
以上例子实际含义为: 。
如若要表示最小数,例如0.0000003,则被转化为来进行表示。
4.3、精度
在 64 位的二进制中,符号位决定了一个数的正负,指数部分决定了数值的大小,小数部分决定了数值的精度。
IEEE754 规定,有效数字第一位默认总是1 。因此,在表示精度的位数前面,还存在一个 “隐藏位” ,固定为 1 ,但它不保存在 64 位浮点数之中。也就是说,有效数字总是 1.xx…xx 的形式,其中 xx…xx 的部分保存在 64 位浮点数之中,最长为52位 。所以,JavaScript 提供的有效数字最长为 53 个二进制位,其内部实际的表现形式为:
(-1)^符号位 * 1.xx…xx * 2^指数位
这意味着,JavaScript 能表示并进行精确算术运算的整数范围为:[-253-1,253-1],即从最小值 -9007199254740991 到最大值 9007199254740991 之间的范围 。
可以通过 Number.MAX_SAFE_INTEGER 和 Number.MIN_SAFE_INTEGER 来分别获取这个最大值和最小值。
对于超过这个范围的整数,JavaScript 依旧可以进行运算,但却不保证运算结果的精度。
浮点值的精度最高位数为17位小数,故在计算中精度远不及整数。而且在某些特定值运算时会出现精度丢失,例如:0.1+0.2=0.3000000000000004。
因此在计算浮点数时,尽可能控制小数位数,以确保值的准确性。