# 数据类型

# 类型

  • 原始类型(6种): Undefined、Null、Boolean、Number、 String 和 Symbol

  • 复杂类型Object

    Object是一种无序名值对的集合

数据类型都是首字母都是大写的

# typeof 操作符

undefined boolean number string symbol object (对象/array/null) function symbol

严格来讲,函数在ECMAScript中被认为是对象,并不代表一种数据类型。但是函数也有自己特殊的属性,有必要通过typeof操作符来区分函数和其他对象

# typeof vs instanceOf

如果变量是给定引用类型的实例,则 instanceof 操作符返回 true。

console.log(person instanceof Object); // 变量 person 是 Object 吗?
console.log(colors instanceof Array); // 变量 colors 是 Array 吗?
console.log(pattern instanceof RegExp); // 变量 pattern 是 RegExp 吗?

# 建议在声明变量的同时进行初始化

这样,当typeof返回“undefined”时,就能知道是给定的变量尚未声明,而不是声明了但未进行初始化

# Null

null值表示一个空对象指针,所以typeof返回object

初始化对象变量时,建议使用null,可以分辨后续是否被重新赋值

null===null
undefined===undefined
null==undefined

undefind是由null派生而来的

# Boolean

ECMAScript类型的值都有相应布尔值的等价形式,Boolean()转型函数可以将其他类型的值转换为布尔值

数据类型 转换为 true 的值 转换为 false 的值
Boolean true false
String 非空字符串 ""(空字符串)
Number 非零数值(包括无穷值) 0、NaN(参见后面的相关内容)
Object 任意对象 null
Undefined N/A(不存在) undefined

# Number类型

使用IEEE754格式表示整数和浮点值(某些语言中也叫双精度值)

# 浮点值

数值中必须包含小数点,且小数点后面至少有一个数字

存储浮点值使用的内存空间是存储整数值的两倍,所以ECMAScript总是想方设法的把值转化为整数,小数点后面没有数字的情况下或者数值本身是整数只是小数点后面跟着0,数值都会变成整数

# 科学计数法

默认情况下,ECMAScript 会将小数点后至少包含 6 个零的浮点值转换为科学记数法

let floatNum = 3.125e7; // 等于 31250000
let floatNum = 3e-17; // 等于 0.000 000 000 000 000 03

# 计算精确度问题

浮点值的精确度可达17位小数,但算数计算中远不如整数精确

0.1+0.2=0.300 000 000 000 000 04

0.1+0.2!==0.3

是因为使用了IEEE754数值,这种错误并非ECMAScript独有,其他使用相同格式的语言也会有这个问题

# Number.MIN_VALUE & Number.MAX_VALUE

  • 任何无法表示的负数以-Infinity(负无穷大)表示
  • 任何无法表示的正数以 Infinity(正 无穷大)表示

确定一个数值是否有限大使用isFinite()函数

# NaN

特殊值NaN(not a Number)

console.log(NaN == NaN); // false

# isNaN()函数

把一个值传给 isNaN()后,该函数会尝试把它转换为数值。

# 数值转换

3个函数可以将非数值转换为数值: Number()、parseInt()和 parseFloat()。

Number()是 转型函数,可用于任何数据类型。后两个函数主要用于将字符串转换为数值。

# parseInt()函数

考虑到用 Number()函数转换字符串时相对复杂且有点反常规,通常在需要得到整数时可以优先使 用 parseInt()函数。

能识别不同的整数格式(十进制、八 进制、十六进制) 接收第二个参数,用于指定底数(进制数)

let num1 = parseInt("1234blue"); // 1234
let num2 = parseInt(""); // NaN
let num3 = parseInt("0xA"); // 10,解释为十六进制整数
let num4 = parseInt(22.5); // 22
let num5 = parseInt("70"); // 70,解释为十进制值
let num6 = parseInt("0xf"); // 15,解释为十六进制整数

# parseFloat()函数

parseFloat()函数的工作方式跟 parseInt()函数类似

  • 第二次出现的小数点就无效
  • 它始终忽略字符串开头的零
  • 只解析十进制值,因此不能指定底数

# String

表示零或多个16位Unicode字符序列。 字符串可以使用双引号("")、单引号("")、反引号(``)标示

字符串长度可以通过length属性获取

字符串中包含双字节字符,那么length返回的可能不是准确字符数

字符串是不可变的,一旦创建值就不能变了。

# 修改某个变量中的字符串值

  1. 销毁原始字符串
  2. 将包含新值的另一个字符串保存到该变量

# 转换字符串方法

  1. toString()
    • 简单的返回自身的一个副本,null和undefined值没有toString()方法
    • 接收一个底数参数,可以得到数值的n进制 eg.10.toString(2)
  2. String()

# 模板字面量

保留换行字符,可以跨行定义字符串

使用模板字面量也可以直接获取原始的模板字面量内容(如换行符或 Unicode 字符),而不是被转换后的字符表示。 为此,可以使用默认的 String.raw 标签函数。

// Unicode 示例
// \u00A9 是版权符号
console.log(`\u00A9`); // ©
console.log(String.raw`\u00A9`); // \u00A9

# Symbol

  • Symbol(符号)是 ECMAScript 6 新增的数据类型。
  • 符号是原始值,且符号实例是唯一、不可变的。
  • 符号的用途是确保对象属性使用唯一标识符,不会发生属性冲突的危险。

可以传入一个字符串参数作为对符号的描述,将来可以通过这个字符串来调试代码。

ES6中 instanceof 操作符会使用Symbol.hasInstance函数来确定关系。

class Bar {}
let b = new Bar();
console.log(Bar[Symbol.hasInstance](b)); // true