es6总结
1.三种声明变量的区别 var let const
var:存在变量提升 全局变量 可以声明同名的变量 var 函数中不用var 声明变量 的话会存在内存泄露
let:不存在变量提升 块级作用域 就是解决var的变量提升的问题的
const:常量 常量的值 不允许被更改 只限于基本数据类型 栈内存 (堆内存 不允许更改的本质是 内存地址 对于引用数据类型可以修改值)
const实际上保证的,并不是变量的值不得改动,而是变量指向的那个内存地址所保存的数据不得改动。对于简单类型的数据(数值、字符串、布尔值),值就保存在变量指向的那个内存地址,因此等同于常量。但对于复合类 型的 数据(主要是对象和数组),变量指向的内存地址,保存的只是一个指向实际数据的指针,const只能保证这个指针是固定的(即总是指向另一个固定的地址),至于它指向的数据结构是不是可变的,就完全不能控制 了。因此,将一个对象声明为常量必须非常小心。 2. 数组的遍历 // for循环 for-in循环 forEach() es5 map() filter() some() every() reduce() findeIndex() ... // map() ============= 遍历数组, 返回的是一个新数组 (通过指定的规则 把原数组中的值映射到新数组对应的值) 参数 是函数, 函数指定映射规则1 // =============== es5 map() filter() some() every() reduce() findeIndex() ... 2 // map() ============= 遍历数组, 返回的是一个新数组 (通过指定的规则 把原数组中的值映射到新数组对应的值) 参数 是函数, 函数指定映射规则 3 // let newArr = [1, 2, 3, 4].map(function(item, index){ 4 // console.log(item, index); 5 // // 必须通过 return 语句 指定映射规则 ; 通过return 返回新数组的元素 6 // // return item * 10; 7 // // return 'helllo'; 8 // }) 9 // console.log(newArr); 10 11 // =============== 经典面试题 12 // let res = [1, 2, 3].map(parseInt); // map 方法中的第一个参数是 数组中的元素 ,第二个参数是数组的索引值 13 // let res = ['1', '2', '3'].map(parseInt); 14 // console.log(res); // [1, NaN, NaN] 15 16 // [1, 2, 3].map(function()) 17 18 19 // ==================== some() 遍历数组 返回值是布尔类型 false true 20 // 检索数组中是否有符合要求的元素, 只要有一个符合要求,则结果是true 全部不符合则为 false 21 // let res = [12, 23, 33, 44].some(function(item, index, arr){ 22 // // console.log(item, index, arr); 23 // return item > 50 24 // }) 25 // every() 和 some() 相对应 , every()要求的是全部满足要求 为 true 否则false 26 // let res = [12, 23, 33, 44].every(function (item, index, arr) { 27 // // console.log(item, index, arr); 28 // return item > 3 29 // }) 30 // console.log(res); 31 32 33 // =================== filter() 过滤数组 返回值是一个新数组, 结果是符合要求的数组中的元素 34 // let res = [12, 34, 45, 56].filter(function(item, index){ 35 // console.log(item, index); 36 // return item > 40 37 // }) 38 // console.log(res); 39 40 41 // ======================= reduce() 累加器 42 // 43 // let res = [10, 20, 30, 40].reduce(function(item, index){ 44 // console.log(item, index); 45 // return item + index; 46 // }) 47 48 // 没有指定初始值 initValue 的时候,priviousValue 代表数组中的第一个元素 , currentValue 当前正在遍历的元素(从第二个开始依次代表数组中的每个元素) currentIndex 当前遍历元素的索引值 49 // let res = [10, 20, 30, 40].reduce(function(priviousValue,currentValue, currentIndex){ 50 // console.log(priviousValue, currentValue, currentIndex); 51 // return priviousValue + currentValue; 52 // }) 53 54 // 提供了初始值 100 , priviousValue 就是初始值, currentValue 依次代表数组中的元素 55 let res = [10, 20, 30, 40].reduce(function(priviousValue, currentValue, currentIndex){ 56 console.log(priviousValue, currentValue, currentIndex); 57 return priviousValue + currentValue; 58 }, 100) 59 60 // console.log(res);3. 解构赋值 字符串 对象 数组 字符串和数组是通过索引值来解构的 数组是通过key解构的 扩展运算符只适合一维数组,二维的无效 结果只有两种 数组或者是对象 扩展运算符 只能放到最后边 4.箭头函数
1 // 如果函数体只有一条语句是返回值, 则可以省略return 语句 ;直接写 2 // let sum = (a, b) => a + b;
1 / 如果参数只有一个,则可以省略 () 2 // let sqrt = x => x * x;
注意:箭头函数中的this继承父级的this
rest 参数形式为(“...变量名”),用于获取函数的多余参数,这样就不需要使用arguments对象了。rest 参数搭配的变量是一个数组,该变量将多余的参数放入数组中。
箭头函数体内没有自己的this对象,所以在使用的时候,其内部的this就是定义时所在环境的对象,而不是使用时所在环境的对象。
不能给箭头函数使用 call apply bind 去改变其内部的this指向
箭头函数体内没有arguments对象,如果要用,可以用Rest参数代替。
不可以当作构造函数,不可以使用new命令,否则会抛出一个错误。
5.新增的symbol
Symbol 新增的基本数据类型 独一无二的值 Symbol函数可以接受一个字符串作为参数,表示对 Symbol 实例的描述,主要是为了在控制台显示,或者转为字符串时,比较容易区分。 Symbol 作为键名 不能使用 . 运算符 ES6 引入了一种新的原始数据类型Symbol,表示独一无二的值。 应用场景: 对 对象进行扩展Set : 不允许存在重复的值 应用场景 数组去重
Map : 存储数据的键 可以是任意类型
对象 键 只能是 字符串类型, 它类似于对象,也是键值对的集合,但是“键”的范围不限于字符串,各种类型的值(包括对象)都可以当作键。也就是说,Object结构提供了“字符串—值”的对应,Map结构提供了“值—值”的 对应,是一种更完善的Hash结构实现。如果你需要“键值对”的数据结构,Map比Object更合适。。 6. for-of 循环 只能遍历具有 Iterator 接口的数据 普通的对象不能通过for-of遍历 要想遍历就要在对象里面创建接口 键: [Symbol.iterator]:function(){} 7.promise() : 解决回调地狱的问题 , 但是也会造成 then 的过度使用 简单来说是一个容器 是异步编程的一种解决方案 Promise.all() : Promise.race(): 相同点: Promise.race()方法的参数与Promise.all()方法一样,如果不是 Promise 实例,就会先调用下面讲到的Promise.resolve()方法,将参数转为 Promise 实例,再进一步处理。
不同点: all() 如果是成功, 则 等到所有的promise 实例返回结果, 如果存在一个失败。则返回失败的结果
race() 不管是成功还是失败, 哪个promise 实例对象的状态率先改变则返回谁的状态 8.21-async和await async await 把异步操作以同步的形式进行显示 (本质还是异步操作) await 用于async 函数内部 await 后边是一个Promise对象 async await 通过 try - catch 进行异常捕获
1 function ajax(url) { 2 return new Promise((resolve, reject) => { 3 let xhr = new XMLHttpRequest(); 4 xhr.open('get', url); 5 xhr.send(); 6 xhr.onreadystatechange = function () { 7 if (xhr.status == 200 && xhr.readyState == 4) { 8 // console.log(2222, JSON.parse(xhr.responseText)); 9 // resolve(JSON.parse(xhr.responseText)) 10 reject(xhr.statusText) 11 } 12 } 13 }) 14 } 15 16 // ajax(url).then(res => res) 17 18 19 // async 函数 20 async function fun(){ 21 // await 等待的意思 ; await 执行之后得到的结果是 异步操作请求回来的数据 22 // await 简化了then(res => res) 23 let res = await ajax('https://cnodejs.org/api/v1/topics'); 24 console.log(res); 25 } 26 27 fun()
9. class类 相当于构造函数的升级迭代 只不过是换了一种方式
es5 的构造函数 (es5 类) es6 class (类) class有私有的属性和方法 写在constructor构造器里面 只属于class本身不能被继承 共有的属性和方法默认添加到了原型对象上1 class Person{ 2 constructor(name, age){ 3 this.name = name; 4 this.age = age; 5 } 6 } 7 // 继承 extends 8 // 子类必须在constructor()方法中调用super(),否则就会报错。这是因为子类自己的this对象,必须先通过父类的构造函数完成塑造,得到与父类同样的实例属性和方法,然后再对其进行加工,添加子类自己的实例属性和方法。如果不调用super()方法,子类就得不到自己的this对象。 9 class Child extends Person{ 10 constructor(name, age, hari){ 11 // 添加子类自己的实例属性和方法。 必须先调用 super() 方法 12 super(name, age) 13 this.hari = hari; 14 } 15 say(){ 16 console.log('嫦娥'); 17 } 18 } 19 20 // let c1 = new Child('红的头发') 21 let c1 = new Child('小明', 18, '黄色头发') 22 console.log(c1);
class类的get和set
get和set属于数据拦截
get 后边的就是拦截的属性名 set 后边的就是拦截之后设置的 类相当于实例的原型,所有在类中定义的方法,都会被实例继承。如果在一个方法前,加上static关键字,就表示该方法不会被实例继承,而是直接通过类来调用,这就称为“静态方法”。 静态的方法 不会被子类 继承的 ; 通过类本身进行调用 如果静态方法包含this关键字,这个this指的是类,而不是实例。 10.模块化开发 es6 提供两个命令 export import : 模块功能主要由两个命令构成:export和import。export命令用于规定模块的对外接口,import命令用于输入其他模块提供的功能。 export 模块的导出 import 模块的导入 script 标签 type 属性 可以定义模块在服务器环境下测试 导入文件:
1 // import 导入模块 2 // 导入模块时 需要使用解构形式 3 import {num, count} from './module/first.js' 4 // 引入默认模块 a 就是给默认模块起的名字(默认模块的名字是自定义的) 5 import a from './module/first.js' 6 console.log(num); 7 count() 8 a(10)
导出文件:
1 // 模块系统 2 // 一个文件可以导出多个接口 3 // export 导出模块 4 export const num = 100; 5 6 export function count(){ 7 console.log('count++'); 8 } 9 10 export const person = { 11 name:'张三', 12 age:19 13 } 14 15 // 导出默认的模块 一个文件系统只能有唯一一个默认的导出模块 16 // 导出默认模块 17 export default function score(num){ 18 console.log(++num); 19 }