1. let和const声明变量
1.1 var
var作为es5声明变量的唯一方法,有很多缺点:
- 可被多次声明,后面声明的变量会覆盖前面的变量
- 可被重新赋值
- 会被变量提升,即可以在声明前调用,值为undefined
1.2 let和const
弥补了var的缺点
共同点:
- 不会被变量提升
- 拥有块级作用域,暂时性死区
- 只允许声明一次
不同点:
- let可只声明不赋值,const必须赋值
- let允许重新赋值,const不允许,为只读的常量
1.3 补充
const赋值引用类型的值,保存的是指针。
指针不能修改,而值是可以被修改。
在日常开发中,我的建议是全面拥抱let/const,一般的变量声明使用let关键字,而当声明一些配置项(类似接口地址,npm依赖包,分页器默认页数等一些一旦声明后就不会改变的变量)的时候可以使用const,来显式的告诉项目其他开发者,这个变量是不能改变的,同时也建议了解var关键字的缺陷(变量提升,污染全局变量等),这样才能更好的使用新语法
2. 箭头函数
箭头函数和普通函数的区别:
- 箭头函数写法更优雅
- 箭头函数的this永远指向声明它的作用域(上下文)
- 箭头函数没有原型,不能new
- 箭头函数没有arguments,可以通过...rest拿到参数数组
- 当只有一个参数的时候可以省略小括号
- 当箭头函数体内只有一行逻辑时可以省略大括号和return,并且会把这行作为return的值
3. 解构赋值
3.1 数组解构赋值
数组必须按照顺序解构
代码语言:javascript复制1
2 // 常规用法
3 const [a, b] = [10, 20, 30, 40, 50]; // a 10; b 20
4
5 // 可设置默认值
6 const [a = 12,b] = [,3]; // a 12; b 3
7
8 // 可将剩余数组赋值给一个变量(必须是最后一个解构项)
9 const [a, b, ...rest] = [10, 20, 30, 40, 50]; // a 10; b 20; rest [30, 40, 50]
10
11 // 可跳着解构
12 const [a,,b] = [12,23,34,45]; // a 12;b 34
3.2 对象解构赋值
对象解构没有顺序可言,但必须与属性同名,才能取到正确的值。
代码语言:javascript复制1// 常规用法
2const {a, b} = {a:10, b: 20}; // a 10; b 20
3
4// 解构出来后可以取个新名
5const {a:q, b} = {a:10, b: 20}; // q 10; b 20; a is not defined
6
7// 可设置默认值
8const {a = 12, b} = {a:undefined, b: 20}; // a 12; b 3
9
10// 将剩余数组赋值给一个变量(必须是最后一个解构项)
11const {a = 10, b, ...rest} = {a:undefined, b: 20, c: 30, d: 40}; // a 10; b 20; rest {c: 30, d: 40}
12
13
3.3 字符串解构赋值
没想到吧?字符串也能解构?
并且同时具有数组和对象两位大哥的解构方式
代码语言:javascript复制1// 当作数组结构
2const [q,w] = "12"; // q 1; w 2
3
4//当作对象形式
5//取出“world”中的“r”
6const { 2: two , length } = "world"; //这里的“2”是索引值 , length是字符串长度
7console.log(two , length ); // "r" 5
3.4 补充
1、解构对象时会查找原型链(如果属性不在对象自身,将从原型链中查找)
2、undefined不能被解构
3、如果对象层数少,使用解构赋值语意化更强,对于作为对象的函数参数来说,可以减少形参的声明,直接使用对象的属性(如果嵌套层数过多我个人认为不适合用对象解构,不太优雅)
4. 参数默认值
代码语言:javascript复制1// ES6之前,当未传入参数时,text = "default";
2function printText(text) {
3 text = text || "default";
4 console.log(text);
5}
6// ES6;
7function printText(text = "default") {
8 console.log(text);
9}
10printText("hello"); // hello
11printText();// default
5. 模板字符串
需要拼接字符串的时候尽量改成使用模板字符串
代码语言:javascript复制1// bad
2const foo = "this is a" example;
3
4// good
5const foo = `this is a ${example}`;
6. 数组方法
6.1 for of
可以遍历数组或字符串
代码语言:javascript复制1const arr = [2, 4, 3, 4, 5];
2const str = "aabbccss";
3for (const i of arr) {
4 console.log(i);
5}//2 4 3 4 5
6
7for (const i of str) {
8 console.log(i);
9} //"a" "a" "b" "b" "c" "c" "s" "s"
7. Module模块化
7.1 Module特点:
ES6 Module是静态的,也就是说它是在编译阶段运行,和var以及function一样具有提升效果。
7.2 Module导入/导出
代码语言:javascript复制1//import导入
2import menus from "@/router";
3import { Loading, Redirect } from "@/components";
4import { changeBlogTitle, getDecode } from "@/utils";
代码语言:javascript复制1//export 导出
2const x = 10
3
4const y = 20
5
6export {x}
7
8export default y
这两者的区别是:
- export {<变量>}导出的是一个变量的引用,export default导出的是一个值
- 就是说export {<变量>} ,类似浅拷贝,如果原变量因为某些原因被改变了,那么会立刻反映到import
- 而export default就是类似深拷贝,原变量改变后,不会反映到import
8. 展开/剩余运算符
8.1 展开运算符...
当三个点放到一个数组/对象前面,就变成了展开运算符。可替代数组concat/对象的assign方法,将一个数组/对象展开拆封,合并到一个数组/对象,属于浅拷贝的一种
8.2 剩余运算符
- 当三个点放到函数的参数上,就变成了剩余运算符,所以它必须放在最后一个参数。
- 剩余运算符最重要的一个特点就是替代了以前的arguments
- rest只是形参, 可以随意取名
9 class类
class类梳理文章
10 Promise
Promise类梳理文章
11 Map和Set对象
Set和Map主要的应用场景在于数组去重和数据存储