es6学习
1. es6新特性
1.1 let 声明变量:
- 不能重复声明,var可以重复声明
- 块级作用域{} 作用域:函数、全局、块级(es6新出的)、eval(严格模式下)
- 不存在变量提升。var存在变量提升。
- 不影响作用域链。(会向上一级作用域中去寻找)
下面的案例,用var会报错。因为var是函数作用域。因此,其实只定义了一个i,而let是块级作用域,定义了三个i
1.2 const 声明常量
- 一定要赋初值。
- 一般常量使用大写
- 常量的值不能修改
- 块级作用域
- 对于数组和对象的元素修改,不算对常量的修改,不会报错。因为进行修改时,数组和对象的地址没有变化。
1.3 变量解构赋值。
数组[ ]
对象{ } ,要与对象的属性名和方法名对应
1.4 模板字符串
` `
- 内容中可以直接出现换行符
- 可以进行变量的拼接。
1.5 对象的简化写法
等价于:
name: name,
change: change,
improve: function(){...} 使用上述方式更简单了。
1.6 箭头函数
- this是静态的,this始终指向函数声明变量时所在作用域下的ths值。不会改变
- 不能作为构造函数。
- 不能使用arguments 变量
- 简写:形参只有一个变量时,可以省略小括号。代码体只有一条语句时,可以省略花括号,return,并且语句的执行结果就是函数的返回值。
1.7 es6允许给函数参数赋初始值
(1)一般位置要靠后(潜规则)
(2)可以与解构赋值结合使用。
1.8 es6 rest参数
rest参数放在函数的形参位置,用来接收多余的参数,并变为一个数组。
es6中引入rest参数,用于获取函数的实参,用来代替arguments
arguments是一个伪数组,而...args是一个真正的数组,可以使用Array的一些方法。
1.9 扩展运算符的使用 ...args
而扩展运算符不是放在形参的位置。可以将数组转化为逗号分隔的参数序列。
注意与rest参数的区别。
应用:
(1)数组的合并
(2)数组的克隆
如果数组中有引用对象的话,是浅拷贝。
(3)将伪数组转变为真正的数组。
1.10 Symbol基本使用
(1)symbol()和symbol.for()创建
(2)不能与其他数据进行类算。
七种数据类型
(3)symbol的应用
给对象添加属性和方法,表示独一无二的。
①给对象添加方法:法一:
法二:
② Symbol的内置属性
- Symbol.hasInstance
- Symbol.isConcatSpreadable
Symbol的内置属性主要是控制对象在特定场景下的表现:比如:数组不可以展开,
1.11 迭代器
1.11.1 什么是迭代器
这里的Interator接口,相当于一个属性:Symbol(Symbol.iterator)
1.11.2 迭代器工作原理
for of 返回的是value值, for in返回的是key值。
1.11.3 自定义迭代数据
<script>
const banji = {
name:'终极一班',
stus: ['xiaoming', 'huahau', 'xiaohong', 'hanhan'],
[Symbol.iterator](){
// 索隐变量
let index = 0;
let _this = this;
let s = {
next: function() {
if(index < _this.stus.length) {
const result = {value: _this.stus[index], done:false};
index++;
return result;
} else {
return {value: undefined, done:true};
}
}
}
}
};
for(let v of banji) {
console.log(v);
}
</script>
1.12 生成器
生成器是一个特殊的函数。
不能直接调用函数,而是要调用函数的next方法。
yield: 函数代码的分隔符
生成器函数传递参数,作为yield语句的返回结果。
案例1: 使用生成器实现异步编程
法一:回调函数太多
法二:使用生成器函数。
案例二:获取用户的信息、订单、商品信息
1.13 Promise:es6中引入的异步编程的解决方案
1.13.1 了解Pomise
Promise构造函数中有两个参数:resolve, reject分别表示成功和失败。执行完构造函数中的数据,再执行.then()同样有两个参数,都是函数,一个函数时成功时执行的函数,一个是失败时执行的函数。
1.13.2 了解then函数。
调用then方法:then方法的返回结果是Promise对象,对象状态有回调函数的执行结果决定。
(1)如果回调函数中返回的结果是非promise类型的属性,状态为成功,返回值为对象的成功的值。
(2)如果回调函数中返回的结果是promise类型的属性,则内部返回的promise的状态就决定了then方法返回的promise对象的状态。
(3)抛出错误的话,也是一个失败的值。
因此,promise是可以链式调用的。.then().then()....
p.catch(function(){}) 语法糖:只写出错的结果
1.14 Set集合
1.14.1 了解基本语法
1.14.2 案例:
1.15 Map 键值对的集合。
1.15.1 基本用法
1.16 class类
(1)用class创建对象
es5 函数对象
es6 用calss创建对象
(2)class中的静态成员
静态成员属于函数对象(es5)、类(es6),不属于实例对象
注意es5和es6的区别
(3)用构造函数实现继承
es5中的继承
es6中的继承
(4)子类对父类方法的重写
直接写一个重名方法即可。
(5)class中的get和set
get 属性(){}
set 属性(value){}
可以直接设置和得到属性的值
1.17 数值扩展
false
1.18 对象方法的扩展
assign:浅拷贝的语法糖
1.19 模块化
(1)数据的暴露方式
分别暴露: 在暴露数据前加export
统一暴露:export{变量名。。。}
默认暴露:
(2)引入方式
通用的导入方式:import * from “js”
解构赋值形式:import {变量名} from “js”;如果重名了,要起别名:as
默认暴露时,可以import {default as 。。。} from “js”:必须起变量名
简便形式引入:只针对默认暴露:import m3 from “js”
(3)浏览器使用es6模块化:
- 可以直接在html中引入: script中写上述引入的方式。
- 新建一个js文件,在js文件中写上述引入的方式。然后在html中引入js文件
(4) 使用babel对es6模块进行引入
(5)es6模块化与npm包的结合使用。
import 变量名 from “模块名”
引入以后,要重新打包。