关于ES6+
var, let, const
块级作用域
- let/const: 具有块级作用域;
- let是函数作用域。存在变量提升,允许重复声明;
- const还需在声明时初始化且不可重新赋值(但对象/数组内容可修改);
箭头函数与普通函数
- 无自身this,继承外层上下文(指向创建时父级的this);
- 没有prototype属性,不能进行new实例化;
普通函数: 有自己的this,由调用方式决定;
关于Promise
Promise
是异步编程的一种解决方案,解决回调地狱的问题;
- 链式操作降低了编码难度;
- 代码可读性明显增强;
Promise对象的三种状态:
pending(进行中), fulfilled(已成功), rejected(已失败);
Promise构造函数接受一个函数作为参数,该函数的两个参数分别是resolve和reject;
resolve函数的作用是,将Promise对象的状态从"未完成"变为"成功";
reject函数的作用是,将Promise对象的状态从"未完成"变为"失败";
Promise构造函数存在以下方法:
then(), catch(), finally();
then():
resolved状态的回调函数;then方法返回的是一个新的Promise实例,也就是promise能链式书写的原因(返回普通值,普通的值被作为一个新的promise的resolve值;)
catch():
用于指定发生错误时的回调函数;
finally():
方法用于指定不管Promise对象最后状态如何,都会执行的操作;
javascript
Promise.all(): 任意一个promise被reject,Promise.all就会被reject, 不在执行then().
promise.assSettled(): 相互独立,可以获取数组中每个Promise的结果,无论成功或失败只有then方法; 所有结果都会在then中体现;
Promise.rece: 多个promise执行,最快得执行Promise.race()的then或者catch,里面的promise依旧会执行;
Async函数
定义 :async
和await
是 JavaScript 处理[异步操作]
的语法糖,基于 Promise 实现。
目的 : 让异步代码的书写和阅读更接近同步代码,解决"[回调地狱]
" 和 Promise 链式调用冗长的问题。
js
//async函数返回一个Promise对象;
//函数内部return语句返回的值,会成为then方法回调函数的参数;
async function f() {
return 'hello world';
}
f().then(v => console.log(v))
// "hello world"
设计:
- async是用来声明一个异步函数,该函数返回一个promise对象;await用来等待一个promise完成,并获取其结果;
- 当函数执行的时候,一旦遇到awiait就会先返回,等到触发的异步操作完成,再接着执行函数体内后的语句; 实现: async/await语法糖就是使用Generator函数+自动执行器来运作的;
ES6 Module语法(模块)及与CommonJS模块的差异
概述:
将一个大程序拆分成互相依赖的小文件,再用简单的方法拼装起来。
模块功能主要由两个命令构成:export
和import
. export
命令用于规定模块的对位接口,import
命令用于输入其他模块提供的功能。
export default
命令用于指定模块的默认输出,一个模块只能有一个默认输出。
js
export default function foo() { console.log('foo'); }
// 或者写成
function foo() { console.log('foo'); }
export default foo;
1,`export default`时,对应的`import`语句不需要使用大括号;
import foo from 'foo';
export function foo {
console.log('foo');
}
2, 不使用`export default`时,对应的`import`语句需要使用大括号
import { foo } from 'foo'
markdown
- CommonJS 模块输出的是一个值的拷贝,ES6 模块输出的是值的引用。
- CommonJS 模块是运行时加载,ES6 模块是编译时输出接口。
- CommonJS 模块的`require()`是同步加载模块,ES6 模块的`import`命令是异步加载,有一个独立的模块依赖的解析阶段。
ES6 Set和Map数据结构
基本用法
Set:
类似于数组。但是成员的值都是唯一的,没有重复的值;
Map:
本质上是键值对的集合;
区别:
arduino
唯一性:set元素是唯一的,map键是唯一的;
set存储的是单个元素,map存储的是键值对;
js
` Map和Object的区别 `
1.键的类型不同:
Object: 只允许使用字符串或符号作为键。其他类型的键(如数字或对象)会被自动转化为字符串;
Map: 可以使用任意类型的值作为键;
2.键值对的遍历:
Object: for...in, Object.keys(), Object.values(),
Map: for...of
3. 键的顺序
Object: 对象的属性迭代顺序通常是无序的;
Map: 保持键值对的插入顺序,每次迭代都按照插入顺序进行;
4. 内存占用和性能
Map处理大量数据通常比Object更有效率;Object由于对象的属性名和值是动态绑定的,可能会导致内存使用效率较低;
5. Map不具有原型链;
ES6 其他知识
模板字符串
,解构
,运算符
(?. ||)