你不知道的js(下)
- JavaScript 引擎实际上是动态编译程序,然后立即执行编译后的代码
- 一个变量在每个作用域中只需要声明 一次;声明之后可以按照需要多次使用
- 管理程序状态即变量保存的值会随着程序运行而有所变化,换句话说,状态跟踪了值随着程序运行的变化
- == 检查的是允许类型转换情况下的值的相等性,而 === 检查不允许类型转换 情况下的值的相等性
- 函数本身也可以作为值赋给变量或者向其他函数传入,又或者从其他函数传出
- IIFE 就是一个函数,而且函数会创建新的变量作用域,
- 模块允许你定义外部不可见的私有实现 细节(变量、函数),同时也可以提供允许从外部访问的公开 API
- ES6 特性:解构、默认参数值、符号、简洁方法、计算属性、箭头函 数、块作用域、promise、生成器、迭代器、模块、代理、WeakMap
- Object.is(..) 是一个用于检查两个值严格相等的新工具,而且不像 === 那样在 处理 NaN 和 -0 值的时候有微妙的例外情况
if (!Object.is) {
Object.is = function(v1, v2) {
// 检查-0
if (v1 === 0 && v2 === 0) {
return 1 / v1 === 1 / v2;
}
// 检查NaN
if (v1 !== v1) {
return v2 !== v2;
}
// 其余所有情况
return v1 === v2;
};
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
2
3
4
5
6
7
8
9
10
11
12
13
14
- ...,通常称为 spread 或 rest(展开或收集)运算符
- 解构(destructuring),把这个功能看作是一个结构化赋值(structured assignment)方法
- 要为已经存在的对象设定 [[Prototype]],可以使用 ES6 工具 Object.setPrototypeOf(..)
- 箭头函数是匿名函数表 达式——它们没有用于递归或者事件绑定 / 解绑定的命名引用
- 在箭头函数内部,this 绑定不是 动态的,而是词法的
- => 适用时机的规则
1.如果你有一个简短单句在线函数表达式,其中唯一的语句是 return 某个计算出的值, 且这个函数内部没有 this 引用,且没有自身引用(递归、事件绑定 / 解绑定),且不会 要求函数执行这些,那么可以安全地把它重构为 => 箭头函数。
2.如果你有一个内层函数表达式,依赖于在包含它的函数中调用 var self = this hack 或 者 .bind(this) 来确保适当的 this 绑定,那么这个内层函数表达式应该可以安全地转 换为 => 箭头函数。
3.如果你的内层函数表达式依赖于封装函数中某种像var args = Array.prototype.slice. call(arguments) 来保证 arguments 的词法复制,那么这个内层函数应该可以安全地转 换为 => 箭头函数
4.所有的其他情况——函数声明、较长的多语句函数表达式、需要词法名称标识符(递归 等)的函数,以及任何不符合以上几点特征的函数——一般都应该避免 => 函数语法 - 迭代器提供了对数组或运算的顺序访问。可以通过像 for..of 和 ... 这些新语言特性来 消耗迭代器。
- 生成器是支持本地暂停 / 恢复的函数,通过迭代器来控制。它们可以用于编程(也是交 互地,通过 yield/next(..) 消息传递)生成供迭代消耗的值
- 模块支持对实现细节的私有封装,并提供公开导出 API。模块定义是基于文件的单例实 例,在编译时静态决议
- WeakMap 也是 map,其中的键(对象)是弱持有的,因此当它是对这个对象的最后一个引 用的时候,GC(垃圾回收)可以回收这个项目。WeakSet 也是 set,其中的值是弱持有的, 也就是说如果其中的项目是对这个对象最后一个引用的时候,GC 可以移除它
- Array 新增了静态函数 of(..) 和 from(..) ,以及像 copyWithin(..) 和 fill(..) 这样的 原型函数。
- Object 新增了静态函数 is(..) 和 assign(..)。
- Math 新增了静态函数 acosh(..) 和 clz32(..)。
- Number 新增了静态属性 Number.EPSILON,以及静态函数 Number.isFinite(..)。
- String 新 增 了 静 态 函 数 String.fromCodePoint(..) 和 String.raw(..), 以 及 原 型 函 数
repeat(..) 和 includes(..)。