依照《JavaScript高级程序设计》 第七版梳理
HTML中的JavaScript
script标签的属性
- async:立即开始下载,不阻塞,只对外部脚本有效,不影响DOMContentLoaded事件,执行按照下载完成顺序而非页面顺序。
- defer:立即开始后台下载,在渲染完成后执行,执行完毕后触发DomContentLoaded事件,执行时按页面顺序执行。
- src:文件链接
- type:module代表ES6模块
变量
- 标识符:Unicode编码,第一字符不能是数字
- 关键字:不能用作标识符
- 保留字,用于未来的用途,同关键字
var/let/const
- var在全局声明时会成为window的属性,而let不会
- var有函数作用域,有变量提升,let为块作用域
- 暂时性死区:在let声明前引用变量
- for循环的每次循环都有单独的块级作用域
- const必须设置初始值,不能用于循环中可变的变量声明,其余与let一致
数据类型
原始类型
- undefined
- null
- Boolean
- Number
- String
- Symbol
- BigInt
一种引用类型:Object
typeof的输出(string):
- undefined
- boolean
- string
- number
- object (非函数的对象,或者null)
- function
- symbol
- bigint
Number
- 用0x开头表示十六进制,如:0xA,0x1f (可能不区分大小写)
- 用0o开头表示八进制
- 浮点数计算会不准,因为使用了IEEE754数值
- Number.MAX_VALUE > 0,Number.MIN_VALUE = 5e-234 > 0
- x/0 === Infinity / -Infinity (x !== 0), 0/0 === NaN
- Number规则:
- null => 0
- false => 0, true => 1
- undefined => NaN
- string
- 尝试转换为十进制,忽略前导零
- 尝试十六进制
- 空字符串返回0
- 匹配失败返回NaN
- object
- 调用valueOf(),若为NaN,调用toString()后按字符串解析。
- parseInt:
- 从非空字符开始转换,支持前导零
- 出现非数字字符串立即返回当前解析结果(前缀有非数字字符就为null,后缀非数字字符会被忽略,空字符串返回NaN)
- 第二个参数表示底,默认自动
- parseFloat:
- 基本同parseInt,但没有第二个参数,只支持十进制
- 解析到第二个小数点时直接返回当前解析结果
- toString方法可以接受一个参数表示要转换的进制
String
- 字面量:
- \xnn:以十六进制编码的字符编码
- \unnnn:以十六进制编码的Unicode编码
- 字符串模板标签函数:
- 第一个参数是一个字符串数组,组内是模板被n个变量分隔的n+1个子串
- 后n个参数是变量值
- 标签函数允许自行组织字符串模板的编排方式
- 第一个参为Array,有一个raw属性,表示原始字符串,格式与第一个参数相同
Symbol
- 不能使用new
- Symbol.for创建可重用符号,一个参数表示key,仅接受字符串,Symbol.keyFor用于获取一个symbol的key
- Object.getOwnPropertyNames与getOwnPropertySymbols互斥,其余方法都同时返回两种属性
- 内置符号:在Symbol的属性中定义,常用@@开头表示,如@@iterator表示Symbol.iterator。内置符号用于某些语言内置逻辑的控制,如@@iterator在for-of循环中,用于相关对象的循环判断。
Object
- 每个object实例都有如下属性/方法
- constructor:用于创建当前对象的函数
- hasOwnProoerty(name):当前实例是否有属性,仅接受字符串属性
- isPrototypeOf(object):是否是另一个对象的原型
- propertyIsEnumerable():是否可枚举(for-in),仅接受字符串属性
- toLocaleString()
- toString()
- valueOf()
操作符
位操作
~:非&:与|:或^:异或<<:左移>>:有符号右移>>>:无符号右移
类型转换
- 加法中,有字符串则全转字符串,否则全转数字
- 减法中,全转数字
- 对象转字符串,toString()
- 对象转数值,先尝试valueOf(),若返回不是原始值,则使用toString(),再转数值
等于和不等于
全等(===)
- 类型不同则不等
- NaN与任何值(包含本身)都不等
- 都是null或都是undefined,相等
- 都是数值且值相等,则相等,否则不等(+0和-0相等)
- 都是字符串,且各位的编码值相等(如,'\x41' == 'A'),则相等,否则不等
- 引用统一对象,则相等
相等(==)
- 如果类型相同,按全等符号规则判断
- 如果不同,按如下规则发起类型转换
- null == undefined
- 一个是number,一个是string,则都转换为number比较
- boolean都转换为数值再比较
- 一个值是对象,另一个值是number或string,先将对象转为number/string,再比较
语句
- switch采用全等判断case
- 标签语句(xxx:)配合continue/break后用空格连接标签名,实现复杂的流程控制,常用于跳出嵌套循环
- for...in:循环对象的可枚举属性,包括继承的属性
- for...of:遍历可迭代对象
函数
- 函数不能以eval和arguments命名
作用域与内存
- 两种类型,原始值保存在栈上,引用值保存在堆上
- 所有函数都是传值
- 上下文分为全局,函数,块三种,进入新的上下文,会创建作用域链
- JS使用垃圾回收,基于标记清理