JavaScript高级程序设计(红宝书)
前言
2019年6月17日21:57:34
- 本笔记只做概念提要,不做大而全,只做小而精
1. JavaScript简介
- JavaScript:ECMAScript、DOM、BOM
- 宿主环境:Web浏览器、Node(服务端JavaScript平台)
- BOM:弹出新窗口、移动缩放、navigator、location、screen、cookies、XMLHttpRequest
2. 在HTML中使用JavaScript
- script(阻塞DOM渲染)、async(加载完就执行)、defer(所有DOM渲染完毕执行)
- HTML Parser & Scripting
- 文档模式doctype (IE5.5)
- 混杂模式quirks mode
- 标准模式standards mode
- 标准准模式almost standards mode
- 过渡型transitional
- 框架集型frameset
- 混杂与标准的区别:主要影响CSS
- 盒模型(width 包不包含 padding)
- 表格和图片
- 百分比宽高
- 溢出
- 在不支持的时候,平稳地退化
3. 基本概念
3.1 概述
- 关键字keyword和保留字reserved
- 省略var定义的变量会成为一个全局变量
- typeof操作符
- null和object —> “object”
- function —> “function”
- 正则表达式 —> “object”
3.2 基本类型
- Boolean
- 所有假值
- number、string、boolean —> undefined
- object —> null
- number —> 0 和 NaN
- string —> “”
- boolean —> false
- 所有假值
- Undefined
- undefined就是为了区分空对象指针和未经初始化的变量
- Null
- null是空对象指针
- Number
- 小数点后超过6位小数时会自动转换成指数表示法
- NaN
+(Not a Number)用以表示本来应当返回一个数字的操作数未返回数字- NaN不等于自身
- isNaN会进行类型转换
- 有三个函数可以把非数值转换成数字
- Number(一元操作
+
一致)- Number(undefined) —> NaN
- Number(null) —> 0
- Number(string)
- 只包含数字 —> 十进制数字
- 有效的浮点格式 —> 对应浮点值
- 有效的十六进制 —> 对应十进制
- 空字符串 —> 0
- 无效格式 —> NaN
- Number(Object)
- valueOf 依前所述规则转换,若NaN则toString
- toString
- parseInt
- 忽略字符串前面的空格,直到找到第一个非空字符
- -、+、number 解析所有字符直到遇到非数字
- 经典应用:parseInt(‘250px;’) —> 250
- 第二参数 指定要解析的字符串的进制
- 始终将10作为第二个参数是十分必要的
- 经典应用:考虑将各种进制转换成十进制
- parseFloat
- parseFloat 只解析十进制,没有第二参数
- 可解析为整数的会返回整数,而不是浮点数
- Number(一元操作
- String
- 转换成字符串
- toString()
- 第二参数,可以将十进制转换成其他有效进制
- String()
- 如果存在toString方法就调用
- null —> null
- undefined —> undefined
- toString()
- 转换成字符串
- Object
- Object每个实例都具有的属性和方法
- constructor()
- hasOwnProperty()
- isPrototypeOf()
- propertyIsEnumerable(propertyName) 属性是否可枚举(for-in)
- toLocaleString()
- toString() 返回对象的字符串表示
- valueOf() 返回对象的字符串、数值、布尔值
- Object每个实例都具有的属性和方法
3.3 操作符
- 负数的二进制码
- 绝对值的二进制
- 反码
- 反码 + 1
- 逻辑非 !
- Boolean() 和 !! 效果一致
- 短路操作
- 算术操作符
- 数字优先
- 出现非数字的简单类型,先调用Number()进行类型转换
- 出现对象,调用其valueOf()再操作
+
字符连接符- 字符串优先
- 两个操作数都是数字,加法,否则永远优先字符串
- 一个操作数是字符串,则将另一操作数转换为字符串,拼接
- 一个操作数是对象、数字、布尔,调用其toString方法,拼接
- 关系操作符
- <、>、<=、>=
- 数字优先
- 对象,valueOf
- 总结: 优先考虑对象:
- 遇到对象,就得先把对象转成简单类型
- 转换成简单类型需要看操作符
- 算术操作符、关系操作符
- 遇到对象 —> valueOf成简单类型
- 简单类型 —> Number成数字
- 字符连接符
- 遇到对象 —> toString成字符串
- 简单类型 —> String成字符串
- 算术操作符、关系操作符
- 都是简单类型时就看操作符,倾向于数字还是字符串
- 全等和不全等
- 区别:比较前是否强制类型转换
==
类型转换规则- 数字优先
- 字符串 —> 数字
- 对象 —> valueOf
- 布尔 —> 数字
- 双对象 —> 比较引用指向
- 逗号操作符
- 声明多个变量
var a = 1, b = 2, c = 3;
- 一条语句执行多个操作,只返回最后一项
() => (console.log('any'),5)
- 声明多个变量
- 语句
- do-while 后测试循环
- while 前测试
- for 前测试
- for(initialization; expression; post-loop-expression)
- 没有块级作用域 —> 循环外部可以访问i
- for-in 枚举对象属性,没有顺序
- 函数
- 未指定return语句的函数返回的是一个默认的undefined
- JavaScrip没有函数签名(接受的参数类型和数量)的概念,函数的参数在内部是由一个包含零个或多个值的数组实现的
- arguments是类数组,不是真的数组
- arguments和命名参数自动同步
- arguments对象的长度是由传入的参数个数决定的,不是定义函数的形参个数
- 没有重载
- 声明两个相同名的函数,后者覆盖前者
- 可以模拟重载
4. 变量、作用域和内存问题
- 基本类型和引用类型
- 基本类型 值 数据段
- 引用类型 对象
- 检测类型
- typeof 区分基本类型
- instanceof 输出具体的引用类型
- 执行环境
- execution context 执行环境定义了变量或函数有权访问的其他数据
- 每个执行环境都有一个与之关联的变量对象variable object
- 环境中定义的变量和函数都存储在变量对象中
- 全局执行环境是最外围的执行环境,在浏览器中就是window
- 某个执行环境中的所有代码执行完毕后,该环境被销毁,其中的变量和函数也随之销毁
- 作用域
- 当代码在一个环境中执行时,会创建变量对象的一个作用域链 scope chain
- 作用域链保证对执行环境有权访问的所有变量和函数的有序访问
- 全局执行环境的变量对象始终是作用域链中的最后一个对象
- 延长作用域链 catch 临时增加变量对象
- 沿作用域链向上搜索变量
- 垃圾回收机制
- 标记清除 mark-and-sweep
- 引用计数 reference counting
- 循环引用问题
- 管理内存
- 一旦数据不再有用,将其值设置为null来释放其引用 ———— 解除引用 dereferencing
- 解除引用的真正目的是 让值脱离执行环境,以便垃圾回收机制下次运行时将其回收