一.资料 MDN(Mozilla 开发者网络) ECMAScript 6 入门(阮一峰)
二.块级作用域绑定 var function 存在变量提升 var 只会提前声明 function 既声明有定义
1 2 3 4 5 console .log(fun1);function fun1 ( ) { var b = 4 ; } console .log("fun1" in window );
let
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 let a = 1 ;console .log(window .a); function getValue ( ) { if (condition) { let value = "blue" ; return value; } else { return null ; } }
const 1.没有变量提升 2.不可以重复声明 3.不会给 window 增加属性 4.const 定义变量,一旦声明必须赋值 5.const 定义是一个常量,不可以重新赋值
1 2 3 4 5 6 7 8 9 const person = { name : "make" , }; person.name = "greg" ; person = { name : "Greg" , };
块级作用域 {}
:一个{}
就是一个块级作用域 在块级作用域下,var 和 function 声明变量依然是全局的 在块级作用域下 let 和 const 声明变量都是私有的{}
如果表示一个对象不可以放在行首{name:'小明'}
看成一个块级作用域
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 { let b = 1 ; var a = 0 ; function getA ( ) { console .log(a); } } console .log(a); getA(); if (0 ) { var A = 1 ; function getAA ( ) {} } console .log(A); console .log(getAA);
var 和 let
临时死区 TDZ Temporal Dead Zone
1 2 3 4 5 6 7 console .log(typeof value); let value = "123" ;console .log(typeof value); if (1 ) { let value = "blue" ; }
三.数组和对象 数组的结构赋值 1 2 3 4 5 6 7 8 let [x, y, m, n] = arr;console .log(x, y, m, n); let [x1, x2 = 10 ] = [1 ];let [, , m3] = [1 , 2 , 3 ]; let [y1, y2, ...y3] = [1 , 2 , 3 , 4 , 5 ];
对象 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 let { name, age } = { name : "小明" , age : 10 };console .log(name); let { name, age = 100 } = { name : "小明" };let { name, age, list : [a1, a2, a3], } = { name : "小明" , age : 10 , list : ["js" , "node" , "vue" ] }; console .log(name, age, a1, a2, a3); 块( ({ x1, x2 } = { x1 : 1 , x2 : 2 }) ); console .log(x1, x2);
合并和操作对象
get 和 set
symbol Symbol 是一个新的基本类型 而且是一个值的类型
数字和字符串 1 2 3 4 5 6 7 8 9 10 11 12 13 let [x, y] = "123" ;console .log(x, y); let { __proto__ : a } = 1 ;console .log(a);console .log(Object (1 )); let { length : b } = "1234" ;console .log(Object ("1,2,3,4" )); console .log(b);
函数 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 function getA ([a, b, c, ...d] ) { console .log(a, b, c, d); } getA([1 , 2 , 3 , 4 , 5 ]); function getB ({ name = "小明" , age = 10 } = {} ) { console .log(name, age); } getB(); function fn (x = "小明" , y = "es6" ) { console .log(x, y); } fn(0 ); function fn2 (x, y = 10 ) {}fn2(1 , 2 ); console .log(fn2.length); function fn3 (x = 10 , y = 20 ) {}function fn4 (...arg ) { console .log(arguments ); console .log(arg); } fn4(1 , 2 , 3 , 4 ); function fn ( ) {}console .log(fn.name); console .log(function ( ) {}.name); function fn ( ) {}let fn1 = fn.bind(null );console .log(fn1.name); let fn2 = new Function ("x,y" , "console.log(x,y);return x+y" );console .log(fn2(10 , 100 )); console .log(fn2.name);
bind 1 2 3 4 5 6 7 8 function list ( ) { return Array .prototype.slice.call(arguments ); } var list1 = list(1 , 2 , 3 ); var leadingThirtysevenList = list.bind(undefined , 37 );var list2 = leadingThirtysevenList(); var list3 = leadingThirtysevenList(1 , 2 , 3 );
扩展运算符 将数组变成非数组
1 2 3 4 let arr1 = [1 , 2 , 3 ];let arr2 = [4 , 5 , 6 ];console .log(arr1.concat(arr2)); console .log([...arr1, ...arr2]);
求数组的最大值
1 2 3 4 5 let ary = [1 , 22 , 35 , 66 , 77 ];console .log(Math .max.apply(null , ary)); console .log(eval ("Math.max(" + ary + ")" )); console .log(Math .max(...ary));
字符串的扩展 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 console .log(String .prototype);let str = "abcdefg12345" ;console .log(str.includes("a" , null ));console .log(str.startsWith("b" , 1 )); console .log(str.endsWith("c" , 3 )); console .log(str.repeat(1.9 )); console .log(str.repeat(-0.9 )); let str1 = "ab" ;console .log(str1.padStart(7 , "ghk" )); console .log(str1.padEnd(7 , "ghk" ));
操作数组 Array 类上扩展的方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 console .dir(Array ); console .log(Array );console .log(Array (1 , 2 , 3 )); console .log(Array ("1" )); console .log(Array (7 )); console .log(Array .of(7 )); console .log(Array .from([1 , 2 , 3 ]));console .log(Array .from("123" ));
原型上的扩展方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 console .log(Array .prototype);let ary1 = [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ];ary1.copyWithin(4 , 2 , 4 ); console .log(ary1); ary1.copyWithin(3 , 2 ); console .log(ary1); console .log(ary1.fill("小明" )); let ary2 = [1 , 2 , 3 , 4 , 5 , 6 , 7 , 8 ];ary2.fill("小法" , 3 , 5 ); console .log(ary2); let ary3 = ["小红" , 1 , 2 , 3 , "小黄" ];let arr = ary3.filter(function (item, index ) { return typeof item == "number" ; }); console .log(arr); let a = ary3.find(function (item ) { return typeof item == "number" ; }); console .log(a); let i = ary3.findIndex(function (item ) { return typeof item == "string" ; }); console .log(i); console .log([1 , 2 , 3 ].includes(1 , 1 )); console .log( [1 , 2 , 3 , "小明" ].every(function (item ) { return typeof item === "number" ; }) ); console .log( [1 , 2 , 3 , "小明" ].some(function (item ) { return typeof item === "number" ; }) ); let ary4 = [1 , 2 , 3 , 4 , 5 ];let result = ary4.reduce(function (prev, item ) { return prev + item; }, 0 ); console .log(result); let ary5 = [1 , 2 , 3 , 4 ];for (let key of ary5.keys()) { console .log(key); } let ary6 = ["a" , "b" , "c" ];for (let item of ary6) { console .log(item); } for (let e of ary6.entries()) { console .log(e); }
处理数组数据 数据的变异(以下能改变原数组)pop
push
unshift
shift
splice
reverse
sort
查找合并indexof(查找位置)
lastIndexof
concat
slice
处理数据forEach
filter(过滤)
map(映射)
some
every
reduce
(include find es6)
of of of 对象会报错 obj is not iterble(迭代)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 let arr = [1 , 2 , 3 , 4 , 5 ];for (let i = 0 ; i < arr.length; i++) { console .log(arr[i]); } arr.forEach(function (item ) { console .log(item); }); arr.b = "100" ; for (let key in arr) { console .log(typeof key); } for (let val of arr) { console .log(val); } let obj = { name : "cwx" , age : 23 };for (let val of Object .keys(obj)) { console .log(obj[val]); }
filter 删除 filter 是否操作原数组: 不 返回结果 : 过滤后的新数组 回调函数的返回结果: 如果返回 true 表示这一项放在数组中
1 2 3 4 let newArr = [1 , 2 , 3 , 4 , 5 ].filter(function (item, index ) { return item > 2 && item < 5 ; }); console .log(newArr);
map 更新 map 映射 将原有的数组映射成一个新的数组[1,2,3]<li>1</li><li>2</li><li>3</li>
不操作原数组 返回新数组 回调函数中返回什么这一项就是什么
1 2 3 4 let arr1 = [1 , 2 , 3 ].map(function (item ) { return `<li>${item} </li>` ; }); console .log(arr1.join("" ));
includes 返回布尔值
1 2 let arr2 = [1 , 2 , 3 , 4 , 55 ];console .log(arr2.includes(5 ));
find 返回找到的那一项 不会改变数组 回调函数中返回 true 表示找到了,找到后停止循环
1 2 3 4 5 6 let arr2 = [1 , 2 , 3 , 4 , 55 , 555 ];let result = arr2.find(function (item, index ) { return item.toString().indexOf(5 ) > -1 ; }); console .log(result);
some 和 every some 找 true 找到 true 后停止 返回 true
1 2 3 4 5 6 let arr2 = [1 , 2 , 3 , 4 , 55 , 555 ];let result = arr2.some(function (item, index ) { return item.toString().indexOf(5 ) > -1 ; }); console .log(result);
reduce reduce 收敛四个参数 返回的是叠加后的结果 原数组不发生变化,回调函数返回的结果
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 let arr3 = [1 , 2 , 3 , 4 , 5 ];let sum = arr3.reduce(function (prev, next, index, item ) { console .log(arguments ); return prev + next; }); console .log(sum); let obj1 = [ { price : 30 , count : 2 }, { price : 20 , count : 3 }, ]; let sum2 = obj1.reduce(function (prev, next ) { return prev + next.price * next.count; }, 0 ); console .log(sum2);
数组扁平结合
1 2 3 4 5 6 7 let flat = [ [1 , 2 , 3 ], [4 , 5 , 6 ], ].reduce(function (prev, next ) { return prev.concat(next); }); console .log(flat);
defineProperty 1 2 3 4 5 6 7 let obj = {};Object .defineProperty(obj, "name" , { configurable : false , writable : false , enumerable : false , value : 1 , });
双向 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 <input type ="text" id ="input" /> <script > let input = document .getElementById("input" ); let obj = {}; let temp = {}; Object .defineProperty(obj, "name" , { get ( ) { return temp["name" ]; }, set (val ) { temp["name" ] = val; input.value = val; }, }); input.value = obj.name; input.addEventListener("input" , function ( ) { obj.name = this .value; }); </script >
四.箭头函数
arrow fn 不具备有 this,arguments 自己家没有 this 就找上一级的 this 如何更改 this 指向
1.call apply bind
2.var that=this
3.=>
如何确定 this 是谁 看谁调用的 .前面是谁 this 就是谁
1 2 3 4 5 6 7 8 9 10 11 function a (b ) { return b + 1 ; } let a = (b ) => b + 1 ; let a = (b ) => (c ) => b + c; console .log(a(1 )(2 )) [(1 , 2 , 3 )].forEach((item ) => console .log(item));
五.promise 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 let pro1 = new Promise ((resolve, reject ) => { resolve("success" ); reject("error" ); }); pro1.then( (res ) => { console .log(res); }, (e ) => { console .log(e); } ); pro1.then((res ) => {}).catch((e ) => {}); let p = new Promise ((resolve, reject ) => { setTimeout (() => { let a = "蘑菇" ; resolve(a); }, 2000 ); }); p.then( (data ) => { console .log(data); }, (err ) => { console .log("err" ); } );
ajax
All 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 let p1 = new Promise ((resolve, reject ) => { resolve("ok" ); }); let p2 = new Promise ((resolve, reject ) => { resolve("vue" ); }); let pAll = Promise .all([p1, p2]);console .log(pAll); pAll .then((res ) => { console .log(res); }) .catch((e ) => { console .log(e); });
race 1 2 3 4 5 6 7 8 9 10 Promise .race([p1, p2]) .then((res ) => { console .log(res); }) .catch((err ) => { console .log(err); });
六.set 和 map Set 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 console .log(new Set ([1 , 2 , 3 , 4 ])); console .log(new Set ("1234" )); function fn ( ) { console .log(new Set (arguments )); } fn(1 , 2 , 3 , 4 , 2 , 2 ); let set1 = new Set ([1 , 2 , "呵呵" , null , NaN ]);console .log(set1.add(10 ).add(100 )); console .log(set1.delete(1 )); console .log(set1.clear()); console .log(set1); let set2 = new Set ([1 , 2 , "哈哈" , NaN ]);console .log(set2.has(NaN )); set2.forEach((item, index, input ) => { }); for (let key of set2.keys()) { console .log(key); } for (let val of set2.values()) { console .log(val); } for (let [item, val] of set2.entries()) { console .log(item, val); }
数组去重 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 let ary = [1 , 1 , 2 , 2 , 3 , 4 , 4 ];console .log([...new Set (ary)]); function unique ( ) { return [...new set(ary)]; } let ary1 = [1 , 3 , 5 , 7 , 8 , 9 ];let ary2 = [2 , 4 , 6 , 7 , 8 , 9 ];function add (ary1, ary2 ) { return [...new Set ([...ary1, ...ary2])]; } console .log(add(ary1, ary2)); function same (ary1, ary2 ) { return ary1.filter((item ) => ary2.includes(item)); } console .log(same(ary1, ary2)); function diff (ary1, ary2 ) { return add(ary1, ary2).filter((item ) => !same(ary1, ary2).includes(item)); } console .log(diff(ary1, ary2));
Map 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 let obj = { name : "小明" , 1 : "1" , true : "true" , }; new Map ([ [{ name : "小明" }, "小明" ], [2 , "小红" ], ]); let map1 = new Map ([ [1 , "小明" ], [2 , "小红" ], ]); console .log(map1);console .log(map1.get(1 )); map1.forEach((value, key, input ) => {}); for (let key of map1.keys()) {} let ary = ["vue" , "node" , "React" ];let map3 = new Map ();for (let [index, item] of ary.entries()) { map3.set(index, item); } console .log(map3);
七.Proxy 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 let obj = { name : "小明" , age : "18" };let proxy1 = new Proxy (obj, { get (target, key, proxy ) { console .log("get拦截" ); return target[key]; }, }); console .log(proxy1.name); let obj = { name : "小法" };let proxy = new Proxy (obj, { get (target, propKey, receiver ) { return target[propKey]; }, set (target, propKey, value, receiver ) { console .log("设置" ); target[propKey] = value; return true ; }, has (target, propKey ) { console .log("has" ); if (propKey.startsWith("_" )) { return false ; } return propKey in target; }, }); proxy.age = "18" ; console .log(proxy); console .log("name" in proxy); console .log("__proto__" in proxy);
apply 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 function getObj ( ) { console .log(this ); return { name : "小米" }; } let proxy1 = new Proxy (getObj, { apply (target, object, args ) { console .log(target, object, args); if (object) { object.__proto__.fn = target; object.fn(...args); delete object.__proto__.fn; } else { target(...args); } }, }); proxy1(1 , 2 ); proxy1.call(obj, 1 , 2 );
八.class 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 function Fn ( ) { this .x = 10 ; } Fn.prototype.getX = function ( ) {}; let f = new Fn();class A { constructor ( ) { this .x = 10 ; } } let a = new A(10 ); console .log(a);console .log(typeof A);
class 的 name 的问题 1 2 3 4 5 6 7 8 9 10 11 12 let A = class AA { constructor ( ) { console .log(AA.name); } getA ( ) { console .log(AA.name); } }; let a = new A();console .log(A.name); a.getA();
执行的问题 1 2 3 4 5 6 let a1 = new (class { constructor (name ) { console .log(name); } })("杨小虎" );
class 是没有变量提升的
1 2 3 4 5 6 7 new GG(); class GG { constructor ( ) { this .gg = "gg" ; } }
class 的静态方法 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 class AA { constructor ( ) { this .a='aa' ; } getA ( ) { console .log("哈哈" ); } static getB ( ) { console .log("我是AA的静态方法" ); } } let aa=new AA();console .log(aa);aa.getA() console .log(aa.getB);AA.getB() class F { static getF ( ) { console .log("我是F的getF" ) } }; class G extends F { static getG ( ) { super .getF() } } G.getG() 1. function F ( ) { this .f='ff' ; } F.prototype.getF=function ( ) { let f=new F; for (let key in f){ console .log(key) } }; let f=new F();f.getF() 2. class FF{ constructor ( ) { this .ff="ff" } getF ( ) {}; } let ff=new FF();for (let key in ff){ console .log(key) } console .log(Object .getOwnPropertyDescriptor(FF.prototype, "getF" ));
继承 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 class A { constructor (x ) { this .x = x; } getX ( ) { console .log(this .x); } static getY ( ) { console .log(this ); } } A.getY(); class B extends A { constructor (x ) { super (x); this .y = 100 ; } getX ( ) { super .getX(); } getY ( ) { super .getY(); } } let b = new B("熊猫" );b.getX(); B.getY();
九.async 1 2 3 4 5 6 7 8 9 10 11 12 13 14 async function getA ( ) { throw new Error ("对不起" ); return "小明" ; } getA() .then((res ) => { console .log(res); }) .catch((e ) => { console .log(e); });
await 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 let p = new Promise ((resolve, reject ) => { resolve("小明" ); }); async function getA ( ) { let a = await p; return a; } getA() .then((res ) => { console .log(res); }) .catch((e ) => { console .log(e); });
十.迭代器和生成器 迭代器
,是 ES6 引入的一种新的遍历机制,主要讲解的是 Iterator 、迭代过程、可迭代的数据结构
Iterator
是 ES6 引入的一种新的遍历机制,迭代器有两个核心概念:
迭代器是一个统一的接口,它的作用是使各种数据结构可被便捷的访问,它是通过一个键为 Symbol.iterator 的方法来实现;
迭代器是用于遍历数据结构元素的指针(如数据库中的游标)。
1 2 3 4 5 6 7 8 9 10 const items = ["zero" , "one" , "two" ];const it = items[Symbol .iterator]();it.next(); it.next(); it.next(); it.next();
String,Array,Map,Set,Dom 元素是所有内置的可迭代对象,他们的原型对象都有一个 [Symbol.iterator] 方法。
我们将使用 for…of 循环(参见下文的 for…of 循环)对数据结构进行迭代。
1 2 3 4 5 6 7 for (let item of ["zero" , "one" , "two" ]) { console .log(item); }
迭代器用法二
1 2 3 4 5 6 7 const str = "wecy" ;const iterator = str[Symbol .iterator](); let obj = null ;do { obj = iterator.next(); console .log(obj.value); } while (!obj.done);
生成器案例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 function getUser ( ) { setTimeout (() => { let data = '用户数据' iterator.next(data) }, 1000 ) } function getOrder ( ) { setTimeout (() => { let data = '订单数据' iterator.next(data) }, 1000 ) } function getGoods ( ) { setTimeout (() => { let data = '商品数据' iterator.next(data) }, 1000 ) } function * gen ( ) { let user = yield getUser() console .log(user); let order = yield getOrder() console .log(order); let goods = yield getGoods() console .log(goods); } let iterator = gen() iterator.next()