## ES6es6
1. **2个新的关键字**ajax
* let/const
* 块做用域
* 没有变量提高
* 不能重复定义
* 值不可变编程
(***let
1. 做用:
* 与var相似, 用于声明一个变量
2. 特色:
* 在块做用域内有效
* 不能重复声明
* 不会预处理, 不存在提高
3. 应用:
* 循环遍历加监听
* 使用let取代var是趋势)
(***const
1. 做用:
* 定义一个常量
2. 特色:
* 不能修改
* 其它特色同let
3. 应用:
* 保存不用改变的数据)json
2. **变量的解构赋值**数组
* 将包含多个数据的对象(数组)一次赋值给多个变量
* 数据源: 对象/数组
* 目标: {a, b}/[a, b]promise
(1. 理解:
* 从对象或数组中提取数据, 并赋值给变量(多个)
2. 对象的解构赋值
let {n, a} = {n:'tom', a:12}
3. 数组的解构赋值
let [a,b] = [1, 'atguigu'];
4. 用途
* 给多个形参赋值)数据结构
3. 各类数据类型的扩展框架
* 字符串异步
* **模板字符串**
* 做用: 简化字符串的拼接
* 模板字符串必须用``
* 变化的部分使用${xxx}定义
* contains(str) : 判断是否包含指定的字符串
* startsWith(str) : 判断是否以指定字符串开头
* endsWith(str) : 判断是否以指定字符串结尾
* repeat(count) : 重复指定次数
* 对象async
* **简化的对象写法**
一、省略同名的属性值
二、省略方法的:function
* 例如:
let x = 1;
let y = 2;
let point = {
x,
y,
setX (x) {this.x = x}
};
* Object.assign(target, source1, source2..) : 将源对象的属性复制到目标对象上
* Object.is(v1, v2) : 判断2个数据是否彻底相等
* __proto__属性 : 隐式原型属性
(补:3.5 深度克隆)
一、数据类型:
* 数据分为基本的数据类型(String, Number, boolean, Null, Undefined)和对象数据类型
- 基本数据类型:
特色: 存储的是该对象的实际数据
- 对象数据类型:
特色: 存储的是该对象在栈中引用,真实的数据存放在堆内存里
(* 拷贝数据 * :
基本数据类型:拷贝后会生成一份新的数据,修改拷贝之后的数据不会影响原数据。
对象/数组:拷贝后不会生产新的数据,而是拷贝引用地址。修改拷贝之后的数据会影响原来的数据。)
二、复制数据
- 基本数据类型存放的就是实际的数据,可直接复制
let number2 = 2;
let number1 = number2;
- 克隆数据:对象/数组
浅拷贝(对象/数组):
特色:拷贝的是引用,修改拷贝之后的数据会影响原数据。
深拷贝(深度克隆):
特色:拷贝的时候生成新数据,修改拷贝之后的数据不会影响原数据。
一、区别: 浅拷贝/深度拷贝
判断: 拷贝是否产生了新的数据仍是拷贝的是数据的引用
知识点:对象数据存放的是对象在栈内存的引用,直接复制的是对象的引用
let obj = {username: 'kobe'}
let obj1 = obj; // obj1 复制了obj在栈内存的引用
二、经常使用的拷贝技术
1). 直接赋值给一个变量:————浅拷贝
2). arr.concat(): ————数组浅拷贝
3). arr.slice():———— 数组浅拷贝
4). JSON.parse(JSON.stringify(arr/obj)): ————数组或对象深拷贝, 但不能处理函数
5). Object.assign():————浅拷贝
6). 浅拷贝包含函数数据的对象/数组
7). 深拷贝包含函数数据的对象/数组
* 数组
* Array.from(v) : 将伪数组对象或可遍历对象转换为真数组
* Array.of(v1, v2, v3) : 将一系列值转换成数组
* find(function(value, index, arr){return true}) : 找出第一个知足条件返回true的元素
* findIndex(function(value, index, arr){return true}) : 找出第一个知足条件返回true的元素下标
* 函数
* **箭头函数**
* 做用: 定义匿名函数
* 基本语法:
(形参)
* 没有参数: () => console.log('xxxx')
* 一个参数: i => i+2
* 大于一个参数: (i,j) => i+j
(函数体)
* 函数体不用大括号: 默认返回结果
* 函数体若是有多个语句, 须要用{}包围,如有须要返回的内容,须要手动返回
* 使用场景: 多用来定义回调函数
* 箭头函数的特色:
一、简洁
二、箭头函数没有本身的this,箭头函数的this不是调用的时候决定的,而是在定义的时候处在的对象就是它的this
三、扩展理解: 箭头函数的this看外层的是否有函数,
若是有,外层函数的this就是内部箭头函数的this,
若是没有,则this是window。
* **形参的默认值**
* 形参的默认值----当不传入参数的时候默认使用形参里的默认值
function Point(x = 1,y = 2) {
this.x = x;
this.y = y;
}
* **三点运算符**
用途:一、rest(可变)参数
* 经过形参左侧的...来表达, 取代arguments的使用
(arguments:函数内部收集实参的伪数组)
(arguments.callee指代函数自己,递归时会用到(下降耦合度))
二、扩展运算符(...)
* 能够分解出数组或对象中的数据
4. set/Map容器结构
* 容器: 能保存多个数据的对象, 同时必须具有操做内部数据的方法
* 任意对象均可以做为容器使用, 但有的对象不太适合做为容器使用(如函数)
* **Set的特色**: 保存多个value, value是不重复 ====>数组元素去重
* **Map的特色**: 保存多个key--value, key是不重复, value是能够重复的
* API
* Set()/Set(arr) //arr是一维数组
* add(value)
* delete(value)
* clear();
* has(value)
* size
*
* Map()/Map(arr) //arr是二维数组
* set(key, value)
* delete(key)
* clear()
* has(key)
* size
5. **for--of循环**
* 能够遍历任何容器
* 数组
* 对象
* 伪/类对象
* 字符串
* 可迭代的对象
6. **Promise**
1. 理解:
* Promise对象: 表明了将来某个将要发生的事件(一般是一个异步操做)
* 有了promise对象, 能够将异步操做以同步的流程表达出来, 避免了层层嵌套的回调函数(俗称'回调地狱')
* ES6的Promise是一个构造函数, 用来生成promise实例
二、做用:
* 解决`回调地狱`(回调函数的层层嵌套, 编码是不断向右扩展, 阅读性不好)
* 能以同步编码的方式实现异步调用
* 在es6以前原生的js中是没这种实现的, 一些第三方框架(jQuery)实现了promise
* ES6中定义实现API:
// 1. 建立promise对象
var promise = new Promise(function(resolve, reject){
// 作异步的操做
if(成功) { // 调用成功的回调
resolve(result);
} else { // 调用失败的回调
reject(errorMsg);
}
})
// 2. 调用promise对象的then()
promise.then(function(
result => console.log(result),
errorMsg => alert(errorMsg)
))
3. promise对象的3个状态
* pending: 初始化状态
* fullfilled: 成功状态
* rejected: 失败状态
4. 应用:
* 使用promise实现超时处理
* 使用promise封装处理ajax请求
let request = new XMLHttpRequest();
request.onreadystatechange = function () {
}
request.responseType = 'json';
request.open("GET", url);
request.send();
7.Symbol类型
前言:ES5中对象的属性名都是字符串,容易形成重名,污染环境
Symbol:
概念:ES6中的添加了一种原始数据类型symbol(已有的原始数据类型:String, Number, boolean, null, undefined, 对象)
特色:
一、Symbol属性对应的值是惟一的,解决命名冲突问题
二、Symbol值不能与其余数据进行计算,包括同字符串拼串
三、for in, for of遍历时不会遍历symbol属性。
使用:
一、调用Symbol函数获得symbol值
let symbol = Symbol();
let obj = {};
obj[symbol] = 'hello';
二、传参标识
let symbol = Symbol('one');
let symbol2 = Symbol('two');
console.log(symbol);// Symbol('one')
console.log(symbol2);// Symbol('two')
三、内置Symbol值
* 除了定义本身使用的Symbol值之外,ES6还提供了11个内置的Symbol值,指向语言内部使用的方法。
- Symbol.iterator
* 对象的Symbol.iterator属性,指向该对象的默认遍历器方法(后边讲)
(7.5 Itertactor遍历器)
概念: iterator是一种接口机制,为各类不一样的数据结构提供统一的访问机制
做用:
一、为各类数据结构,提供一个统一的、简便的访问接口;
二、使得数据结构的成员可以按某种次序排列
三、ES6创造了一种新的遍历命令for...of循环,Iterator接口主要供for...of消费。
工做原理:
- 建立一个指针对象(遍历器对象),指向数据结构的起始位置。
- 第一次调用next方法,指针自动指向数据结构的第一个成员
- 接下来不断调用next方法,指针会一直日后移动,直到指向最后一个成员
- 每调用next方法返回的是一个包含value和done的对象,{value: 当前成员的值,done: 布尔值}
* value表示当前成员的值,done对应的布尔值表示当前的数据的结构是否遍历结束。
* 当遍历结束的时候返回的value值是undefined,done值为true
原生具有iterator接口的数据(可用for of遍历)
一、Array
二、String
三、arguments
四、set容器
五、map容器
。。。
8.Generator函数
概念:
一、ES6提供的解决异步编程的方案之一
二、Generator函数是一个状态机,内部封装了不一样状态的数据,
三、用来生成遍历器对象
四、可暂停函数(惰性求值), yield可暂停,next方法可启动。每次返回的是yield后的表达式结果
特色:
一、function 与函数名之间有一个星号
二、内部用yield表达式来定义不一样的状态
例如:
function* generatorExample(){
let result = yield 'hello'; // 状态值为hello
yield 'generator'; // 状态值为generator
}
三、generator函数返回的是指针对象(接11章节里iterator),而不会执行函数内部逻辑
四、调用next方法函数内部逻辑开始执行,遇到yield表达式中止,返回{value: yield后的表达式结果/undefined, done: false/true}
五、再次调用next方法会从上一次中止时的yield处开始,直到最后
六、yield语句返回结果一般为undefined, 当调用next方法时传参内容会做为启动时yield语句的返回值。
9.async函数
async函数(源自ES2017)
概念: 真正意义上去解决异步回调的问题,同步流程表达异步操做
本质: Generator的语法糖
语法:
async function foo(){
await 异步操做;
await 异步操做;
}
特色:
一、不须要像Generator去调用next方法,遇到await等待,当前的异步操做完成就往下执行
二、返回的老是Promise对象,能够用then方法进行下一步操做
三、async取代Generator函数的星号*,await取代Generator的yield
四、语意上更为明确,使用简单,经临床验证,暂时没有任何反作用
10. **class类**
1. 经过class定义类/实现类的继承
2. 在类中经过constructor定义构造方法
3. 经过new来建立类的实例
4. 经过extends来实现类的继承
5. 经过super调用父类的构造方法
6. 重写从父类中继承的通常方法(子类的方法重写)
11. **模块化(后面讲)**