# 数据类型

JS 的数据类型包括基本类型引用类型

# 基本类型

基本类型包括

  • Null
  • Undefined
  • Boolean
  • String
  • Number
  • Signal

# Null 类型

# 字面量:

  • null
    表示一个 空的对象指针;

TIP

将保存对象引用的变量赋予 null 是有必要的;

# Undefined 类型

# 字面量:

  • undefined
    变量没有定义的时候

TIP

undefined 由 null 派生;
null == undefined 为 true
null === undefined 为 false

# Boolean 类型

# 字面量:

  • true
  • false

使用 Boolean 函数可以将其他类型 (包括对象类型) 转成 Boolean 类型,

TIP

"" 0 NaN null undefined 在转成 Boolean 类型时都会变成 false ;
如果某个变量的值为 null 或 undefined , 使用 if 可以直接获得 false ;

# String 类型

# 字面量

这个字面量就海了去了.

可以使用 String() 方法将其他类型 (包括 NullUndefined ) 变成字符串;
可以使用 toString() 方法将除了 nullundefined 外的值转成字符串,

toString() 方法可以使用第一参数标明进制;

# Number 类型

# 字面量:

和 String 一样, 都是海, 但是有一个比较特殊的: NaN (Not a Number)

默认使用十进制;

TIP

任何涉及到 NaN 的操作都会返回 NaN
NaN 与任何值都不相等 (包括 NaN 自己)

WARNING

JS 浮点数的算术运算的精度不高: 0.1 + 0.2 是不等于 0.3 的, 尽量不要直接比较浮点型数值;

# 引用类型

在当前 ES6 未成为正式版本之前, JS 不存在这个概念, 只有引用类型, 现在暂时理解为 Java 中的对象实例. 放到今天, 如果不使用 ES6 , JS 面向对象的编程体验还是非常差的;

JS 中大多数引用类型值 (即对象) 都是 Object 类型的实例;
JS 中的引用类型值应该理解成无序的属性集合, 看起就像 JSON 那样;

# ES6 对类的支持

神奇的 class 关键字;

class Point {
    // constructor 此类的构造器
    constructor(x, y) {
        this.x = x;
        this.y = y;
    }

    toString() {
        return '(' + this.x + ', ' + this.y + ')';
    }
}
1
2
3
4
5
6
7
8
9
10
11

JS 活得越来越像 Java 了;

# 一些重要的引用类型

底下给出了一些当前 JS 原生的引用类型;

# 基本引用类型

  • Function
  • Array
  • Date
  • Math
  • RegExp
    正则表达式
  • Global

# BOM 引用类型

  • Window
    窗口对象;
    用来获取 BOM 或 DOM 对象, 他的属性与方法可以直接获取;
  • Navigator
    浏览器对象
  • Screen
    显示器屏幕对象
  • History
    历史记录对象
  • Location
    地址栏对象

# DOM 引用类型

  • Document
    文档对象
  • Element
    元素对象
  • Attribute
    属性对象
  • Text (打酱油)
    文本对象
  • Comment (打酱油)
    注释对象
  • Node
    结点对象, 其他 5 个对象的父类

TIP

Document 控制 Element , Element 控制 Attribute , 都是 Node 的孩子

# XML DOM 引用类型

# HTML DOM 引用类型

# 区分数据类型

  • 基本类型: typeof ;
  • 引用类型: instanceof ;

WARNING

类型检测存在一些历史遗留问题, 需要后续补充

# typeof 关键字

typeof 关键字面对不同的数据类型时的返回:

  • "undefined"——未定义;
  • "boolean"——布尔值;
  • "string"——字符串;
  • "number"——数值;
  • "object"——对象或 null;
  • "function"——函数.

TIP

typeof 返回的是字符串;

# instanceof 关键字

# 基本类型和引用类型的不同之处

# 访问方式

  • 基本类型: 按值访问;
  • 引用类型: 按引用访问;

# 动态的属性

  • 基本类型: 无法给一个基本类型添加变量;
  • 引用类型: 为所欲为;

# 复制变量值

  • 基本类型: 相互存储, 互不干扰;
  • 引用类型: 多个引用会指向同一个对象;

# 传递参数

  • 基本类型: 传递的是实际数据的副本;
  • 引用类型: 传递的是对象地址的副本;

TIP

在 JS 中的函数参数传递都是 按值传递

# 类型比较

在传统的 == 比较中, JS 解析器会尽可能地将比较双方转为基本类型. 引用类型想办转成 String 类型 (最终会被转成 ASCII 的数值序列), 基本类型想办法搞成 Number 类型. 所以本质上, 大家都在比较 Number 类型.

# 假设有操作数 A 和 B

  • 如果 A 和 B 都是数值, 则直接比较.
  • 如果 A 和 B 都是字符串, 则比较 A 和 B 中每个字符对应的 ASCII 字符编码值.
  • 如果 A 是数值, B 是其他类型, 则将另一个操作数转换为一个数值, 然后执行数值比较.
  • 如果 A 或 B 是引用类型, 则调用这个对象的 valueOf()方法, 用得到的结果按照前面的规则执 行比较. 如果对象没有 valueOf()方法, 则调用 toString()方法, 并用得到的结果根据前面 的规则执行比较.
  • 如果 A 或 B 是布尔值, 则先将其转换为数值, 然后再执行比较.

# 相等 与 全等

就像上面所说, 由于进行传统的比较, JS 解释器会事先进行类型转换, 但是有时候我们并不希望这件事发生, 所以就会有 === 全等 的出现

  • 相等/不相等 (== / !=)
    先转换类型再比较
  • 全等/不全等 (=== / !==)
    直接比较
Last Updated: 12/23/2019, 7:43:35 AM