# 数据类型
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()
方法将其他类型 (包括 Null
和 Undefined
) 变成字符串;
可以使用 toString()
方法将除了 null
和 undefined
外的值转成字符串,
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 + ')';
}
}
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 解释器会事先进行类型转换, 但是有时候我们并不希望这件事发生, 所以就会有 ===
全等 的出现
- 相等/不相等
(== / !=)
先转换类型再比较 - 全等/不全等
(=== / !==)
直接比较