ES6
ES6入门一
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> p{line-height: 40px;border-bottom: 1px solid green;} </style> </head> <body> <p>1、ES6: chrome、nodeJS 支持97%; ios10 safari 支持100%,<br/> 使用babel6.5 转换ES6为es5,只支持71%;<br/> 使用es6-shim解决 ES6兼容性问题,只支持18%;<br/> android 4.4 支持5%; android 5.1支持25%; <a href="http://kangax.github.io/compat-table/es6/">详情</a></p> <p>2.1、let const 在代码块内有效</p> <script> var a =2; { // a=22; // 报错 let a=1; // 代码块有a 的话,前面不能未定义先使用a console.log("a: "+a); // 代码块 } </script> <p>2.2、ES6 代码块内函数表达式</p> <script> { let a = 'secret'; let f = function () { return a ; } } if(true){ // if里面也算块级作用域 const MAX = 5; } // console.log("MAX: "+MAX); // error </script> <p>3.1变量的解构赋值:从数组和对象中提取值,对变量进行赋值</p> <script> 'use strict'; let [x,y,z]=[1,2,3]; console.log("x: "+x); let {name,age}={age:12,name:'xiaoming'}; console.log("name: "+name); console.log("age: "+age); const [a1,b1,c1,d1,e1]='hello'; console.log("a1: "+a1); console.log([[1,2],[3,4]].map(([a,b])=>a+b)); </script> <p>3.2解构赋值用途 详见文档 </p> <script> // [x2,y2]=[y2,x2]; // 交换变量的值 function example(){ // 从函数返回多个值 return [1,2,3]; } let [a3,b3,c3]=example(); // 返回一个对象 function example2(){ return{ a4:1, b4:2 }; } var {a4,b4}=example2(); // 函数参数定义 function f2({x3,y3,z3}){ //... } f2({z3:3,x3:2,y3:3}); // 提取json var jsonData={ id:42, age:11, name:'xiaoming' } let {id ,age2,name2}=jsonData; console.log("id: "+id); // 遍历map var map = new Map(); map.set('first','hello'); map.set('second','world'); for(let [key,value] of map){ console.log(key+" is "+ value); } </script> <p>4.1 字符串扩展 字符unicode 详见文档 </p> <script> // 字符串遍历 for(let point of 'string'){ console.log("point: "+point); } console.log('test'.charAt(2)); var s = 'hello world'; console.log(s.startsWith('hello')); // 详见文档 console.log(s.endsWith('d')); console.log(s.includes('r')); // true console.log('x'.repeat(3)); // xxx //console.log('x'.padStart(5,'ab')); // ES7 chrome 不支持 </script> <p>4.2模板字符串 见文档 </p> <div class="a">123</div> <div class="b">444</div> <script src="//cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script> <script> // 传统 /*$(".result").append( '<div>this is ' +basket.name+' and then..'+ '<span>'+basket.age+'</span>that is all' + '</div>' );*/ $(".a").append("" + "<div style='border: 1px solid red;'>" + " <span style='color: red;'>this is a</span>" + " <h1>this is h1</h1>" + "</div>"); /* 模板字符串*/ var name20='kang'; // 嵌入变量 用 ${} $(".b").append(` <div> <span>${name20}</span> <h1>ssss</h1> </div>`); var x20 =3; var y20 =6; console.log(`${x20}+${y20} = ${x20+y20}`); //记得添加 `` </script> <p>4.3标签模板 见文档</p> <p>5正则跳过</p> <p>6 Number</p> <script> console.log(Number.isFinite(222)); // true 只有数字才为true console.log(Number.isNaN('222')); // false console.log(Number.parseInt('1234')); console.log(Number.parseFloat('12.34')); // ES6 把 ES5的 全局函数parseInt转成 Number.parseInt() ,减少全局变量 console.log(Number.isInteger(23.3)); // false 是否整数 </script> <p>7.1数组</p> <h2>h2</h2> <h2>h2</h2> <h2>h2</h2> <h2>h2</h2> <script> var arraylike={ // 对象转数组 '0':'a', '1':'b', length:2 } let arr2 = Array.from(arraylike); // 对象转为数组 var arr3 = [].slice.call(arraylike); console.log("arr2: "+arr2); console.log("arr3: "+arr3[1]); let ps = document.querySelectorAll('h2'); // Array.from() Array.from(ps).forEach(function(p){ // 数组才有 forEach() 功能 console.log("p: "+ p.innerHTML); }) console.log(Array.from('hello')); // 字符串转数组 console.log('abcdefg'.charAt(3)); console.log(Array.from([1,2,3],x=>x*x)); // [1,4,9] // 第二个参数对前面的数组进行处理 把 每一个值 x 变了 x * x </script> <p>7.2 数组 Array.of() copyWithin()</p> <script> console.log(Array.of(3,1,4,5,6)); console.log(Array.of('a','b','c','d'));// ['a','b','c','d'] console.log(['aa','bb','cc','dd','ee'].copyWithin(0,2,4)); // 从0 位置开始,将2号'cc'到长度为(4-2)的'dd ee'复制替换掉aa // cc dd cc dd ee </script> </body> </html>
ES6入门二
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> p{line-height: 40px; border-bottom: 1px solid green;} </style> </head> <body> <p>7.4 数组 find() fill()空数组初始化 </p> <script> console.log([1,4,5,10].find(n=>n<6)); // 1 // 返回n<6的第一个值 console.log(new Array(3).fill(7)); //[7,7,7] console.log(['a','b'].fill(7)); </script> <p>7.5 数组遍历 keys() key的遍历, values() value的遍历 entries() 键值对遍历</p> <script> for(let index of ['a','b']){ console.log(index); } for(let index of ['a','b'].keys()){ // keys() console.log(index); } </script> <p>8.1函数 指定默认值</p> <script> function logs(x,y='world'){ console.log(x,y); } logs('hello'); //hello world // y为默认值world logs('hello','china'); // hello china function Point(x=0,y=0){ this.x = x; this.y = y; } var p = new Point(); console.log("p: "+p); </script> <p>8.2函数 解构赋值 函数的length属性,看文档</p> <script > function test1({x,y=5}){ console.log(x,y); } test1({x:10}); // 10 5 // 把对象{x,y=5}作为参数传进去 // 参数默认值是一个变量时,变量作用域先为当前函数作用域,再是全局作用域 var x = 11; function f(y=x){ let x = 2; console.log(y); } f(); // 函数调用时,y的默认值X 尚未在函数内部生成,此时,x 指向全局变量 </script> <p>8.3 rest参数 (...变量名) 传入一堆变量 </p> <script> function add(...nums){ let sum = 0; for(let num of nums){ sum+=num; } return sum; } console.log(add(2,1,3,4,5,33)); // 传入一堆数,求合 </script> <p>8.4 扩展运算符 ... 详见文档</p> <script > var nums=[4,33,23,3,5,532]; function add(x,y,z){ return x+y+z; } console.log(add(...nums)); console.log(Math.max(...[14,3,22])); // 数组求最大值 console.log(Math.max(14,3,32)); var arr1 = [0,1,2,3,4]; var arr2 = [5,6,7]; console.log([...arr1,...arr2]); // 合并数组 </script> <p>85. 函数 严格模式 es6规定只要函数参数使用了默认值、解构赋值,或者扩展运算符,那么函数内部 就不能显式设定为严格格式</p> <script > function test22(a,b=1){ // "use strict"; // 报错 参数用了默认值 console.log(a,b); } test22(3); </script> <p>8.6 函数 name属性 返回函数名</p> <script> function foo(){} console.log(foo.name); var foo1= function () { } console.log(foo1.name); </script> <p>箭头 => 函数</p> <script > var f = v => v; // 箭头前是参数,箭头后是对参数进行处理,返回 //上面函数等同于如下 /*var f = function (v) { return v; }*/ console.log(f(6)); // 如果箭头函数不需要参数或需要多个参数,则用一个圆括号来代表参数部分 var f1 = () => 533; // 等同于 /*var f1 = function () { return 5; }*/ console.log(f1()); var f2 = (num1,num2) => num1+num2; console.log(f2(3,4)); // 简化回调函数 // 正常写法 console.log([1,2,3,4].map(function (x) { return x * x; })); // 箭头函数 console.log([1,2,3,4].map(x=>x*x)); </script> <p>9.1 对象 简洁法</p> <script > var foo = 'bar'; var baz = {foo}; // == var baz = {foo:foo}; console.log(baz); // Object {foo:"bar"} // ------- function f3(x,y){ return {x,y}; // == return {x:x,y:y}; } console.log(f3(3,5)); // Object{x:3,y:5} // ------- var o = { test4(){ // == test4:function(){ return ...} return 'hello'; } }; console.log("o: "+ o.test4()); // ------ var birth = '2012/2/2'; var Person = { name:'xiaom', birth, // === birth:birth hello(){return 'my name is '+this.name+' '+this.birth;} } console.log("person: "+Person.name); console.log("person2: "+Person.hello()); // 表达式 let obj = { ['he'+'llo'](){ return 'hi'; } }; console.log("hi: "+obj.hello()); console.log("hi2: "+obj.hello.name); // 对象方法的name属性 </script> <p> object.is () 同值相等</p> <p>Object.assign 对象合并</p> <script> var target = {a:1}; var source1 = {b:2}; var souce2 = {c:3}; Object.assign(target,source1,souce2); console.log("source: "+target); // 合并成对象 target {a:1,b:2,c:3} // ------- var v1 = 'abcc'; var v2 = true; var v3 = 10; var obj10 = Object.assign({},v1,v2,v3); // 只有字符串才能转成对象 console.log("obj10: "+obj10[0]+ ' ;typeof: '+ typeof obj10); </script> </body> </html>
ES6入门三
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> p{line-height: 40px; border-bottom: 1px solid green;} </style> </head> <body> <p>9.2 Object.assign() 对象的合并,用途见文档</p> <p>10.1 Symbol 第7种数据类型,表示独一无二、对象的属性名独一无二</p> <script> let s = Symbol(); console.log("symbol: "+typeof s); var mySymbol = Symbol(); // ========== var a = {}; a[mySymbol] = 'hello'; // symbol作为对象属性名,表示独一无二,不会被覆盖 // ============= var b = { [mySymbol]: 'hello2' // 注意写法 } console.log("a[mySymbol]: "+a[mySymbol]); console.log("b[mySymbol]: "+b[mySymbol]); </script> <p>10.2增强对象写法</p> <script> let obj = { [s](arg){ // 对象中 属性名加[] 表示 symbol值,独一无二 return arg+' ...'; } } console.log("obj: "+obj[s](10)); // 10 ... 注意写法 </script> <p>Symbol.for() 重新使用同一个Symbol值</p> <script> var s1 = Symbol.for('dd'); var s2 = Symbol.for('dd'); if(s1===s2){ console.log("ok: "); }else{ console.log("no: "); } </script> <p>Symbol应用于Singleton 单例模式</p> <p>11.1 【难点】proxy代理 ,外界访问对象时,都先经过proxy get()/set() 应用于 js 对象的private</p> <script> var person = { name:'xiaoming' }; //var proxy2 = new Proxy(target,handler); //第一个指目标对象 person ,第二个对象handler{}是处理方法 var proxy = new Proxy(person,{ get:function (target, property) { if(property in target){ // 如果对象属性存在,则返回,否则抛出异常 return target[property]; }else{ throw new ReferenceError("property: "+property+" does not exist"); } } }) console.log("proxy.name: "+proxy.name); // console.log("proxy,age: "+proxy.age); // referenceError </script> <p>Reflect 看文档</p> <p>12.1 set 类似数组,但成员不重复</p> <script> // 1 var s2 = new Set(); [2,3,4,2,3,5,6,9].map(x => s2.add(x)); for(let i of s2){ console.log("set: "+i); // 2 3 4 5 6 9 } // 2 var s3= new Set([12,2,4,2,53]); console.log("...set: "+[...s3]); // 去除数组重复 [...new Set(array)] </script> <p>12.2 set 增删查改 add() delete() has() clear() </p> <script> var s4 = new Set(); s4.add(1).add(2); console.log("set2: "+[...s4]); s4.delete(1); console.log("set22: "+[...s4]); </script> <p>12.3 Array.from可以把 set 转换为数组</p> <script> var items= new Set([1,2,3,4,5]); var array = Array.from(items); console.log("array: "+array+" "+array[2]); </script> <p>12.3 set 遍历 keys() values() entries() 键值对 forEach()</p> <script> // 1 let s5 = new Set(['red','green','blue']); for(let item of s5.values()){ console.log("item: "+item); // red green blue } // 2 forEach 通过回调函数对成员进行处理 let s6 = new Set([1,2,44]); s6.forEach(value=>console.log(value*2)); </script> <p>12.4 weakSet 只能放对象,WeakSet中的对象都是弱引用,即垃圾回收机制不考虑WeakSet对该对象的引用</p> <p>12.5 Map键值对</p> <script> // 1 var map2 = new Map([ ['name','小明'], ['age',12] ]); console.log("map2: "+map2.get('name')); console.log("map2: "+map2.get('age')); // 2 let map = new Map() .set(1,'a') .set(2,'b') .set(3,'c'); console.log("map3: "+map.get(1)); console.log("map3: "+map.get(2)); console.log("map3: "+map.get(3)); </script> <p>13.1 Iterator 遍历器 for... of 原理见文档</p> <script> // 应用 // 1. 解构赋值 let set2 = new Set().add('a2').add('b2').add('c2'); let [x ,y]= set2; console.log("x: "+x); console.log("y: "+y); let [first, ...other] = set2; console.log("first: "+first); console.log("other: "+other); // 2 set let set3 = new Set().add('a3'); console.log("set3: "+[...set3]); // 用 [...set3]来输出 set var arrList = Array.from([...set3]); console.log("arrList: "+arrList[0]); // 3 扩展运算符 var str = 'hello'; console.log("str: "+[...str]); var str2 = [...str]; console.log("str2: "+str2[0]); </script> <p>14.1Generator 异步编程</p> <script> function* hello() { // 有个 * 号 yield 'hello'; // 使用 yield 暂停标志 yield 'world'; return 'ending'; } var hm = hello(); var first2=hm.next(); // 使用 Iterator 的 next()方法 console.log("first: "+first2.value); // hello console.log("hello: "+(yield 123)); </script> </body> </html>
ES6入门四
<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> <style> p{line-height: 40px; border-bottom: 1px solid green;} </style> </head> <p>14.1Generator函数是遍历器生成函数,把它赋值给对象的Symbol.iterator属性,则该对象具有Iterator接口</p> <body> <script> var my = {}; my[Symbol.iterator]=function* () { yield 1; yield 2; yield 3; }; console.log("test: "+[...my]); </script> <p>14.2 next方法的参数表示上一个yield语句的返回值</p> <script> function* f() { for(var i =0;true;i++){ var rest = yield i; if(rest){ i = -14; } console.log("rest: "+rest); } } var g = f(); console.log("f: "+g.next().value); console.log("f: "+g.next().value); console.log("f: "+g.next(true).value); console.log("f: "+g.next().value); //遇到 yield 语句,就暂停执行后面的操作,并将紧跟在yield后面的表达式的值 //作为返回的对象的value 属性值 function* foo(x) { var y = 2*(yield (x+1)); var z = yield (y/3); console.log("y: "+y); //24 console.log("z: "+z); //13 return (x+y+z); } var a = foo(5); console.log("a: "+a.next().value); console.log("a: "+a.next().value); console.log("a: "+a.next().value); var b = foo(5); console.log("b: "+b.next().value); //6 console.log("b: "+b.next(12).value); //8 // 把上一次yield 语句的值设为12 即 yield (x+1) = 12; y =2*12=24 console.log("b: "+b.next(13).value); //42 // 把上一次yield 语句的值设为13 即 yield (y/3) = 13; z =13 </script> <p>14.3 for...of 可以遍历Generator函数生成的Iterator对象,不需要next方法</p> <script> function* foo2() { yield 1; yield 2; yield 3; yield 4; return 5; } for(let v of foo2()){ // 注意是 foo2() console.log("v: "+v);// 1 2 3 4 不包括return 的结果 } </script> <p>14.4 for...of 扩展运算符... 解构赋值 Array.from,调用的都是遍历器接口,都可以 将Generator函数返回的Iterator对象,作 为参数</p> <script> function* num() { yield 1; yield 2; return 3; } // 注意写法 num() console.log("num: "+[...num()]); // [1,2] console.log("num: "+Array.from(num())); let [x,y]=num(); console.log("x: "+x); console.log("y: "+y); for(let n of num()){ console.log("n: "+n); } </script> <p>14.5 Generator try...catch...看文档</p> <p>14.6 Generator return</p> <script> function* num2() { yield 4; yield 5; } var num2= num2(); console.log("num2: "+num2.next().value); // 4 console.log("num2: "+num2.return(10).value); // 10 </script> <p>14.7 yield* 调用其他 Generator</p> <script> function* test() { yield 'a'; yield 'b'; } function* test2() { yield 'x'; yield* test(); yield 'y'; } for(let i of test2()){ console.log("test: "+i); } </script> <p>15.1 promise 异步编程,比回调函数、事件好 Generator也是异步编程</p> <script> var promise = new Promise(function (resolve, reject) { // 方式一 //解决 // 拒绝 /*if(/!*异步操作成功*!/){ resolve(value); // value 异步操作结果 }else{ reject(error); }*/ }); // 方式二 promise.then(function (value) { // success },function (error) { // failure }); </script> <p>15.2 promise 第一个then方法异步返回的结果可以传入第二个回调函数</p> <script> /* function getJSON() { // ... } getJSON("/a.json").then( post => getJSON(post.commentURL) ).then( comments => console.log("resoleved"), err => console.log("reject") ) */ // => 箭头函数 第一个是参数 => 后面是函数内容、返回值 var sum = x =>x*2; console.log("sum: "+sum(2)); </script> <p>15.3 promise.catch... 看文档</p> <p>16.4异步操作 1.回调函数 2.事件监听 3.Promise 传统回调函数要嵌套一堆函数,使用Promise 有一堆 then函数 使用Thunk 来自动执行 Generator函数 详见文档 ES7 提供 async 函数 </p> <p>17.1 Class 类 ES5基本实现了类的绝大部分功能,ES6引入 class类 </p> <script> class Bar{ constructor(x,y){ // 构造器 this.x=x; this.y=y; } toString(){ // 方法 return this.x+" --- "+this.y; } } var b = new Bar(1,2); // new console.log("b: "+b.toString()); var b2 = new Bar(3,4); b2.__proto__.test33=function () { // 扩展 test33() 方法,每个实例都可调用 return 'abc'; } console.log("b: "+b.test33()); console.log("b2: "+b2.test33()); </script> <p>17.2 class表达式</p> <script> const MyClass= class{ // 把类赋值给一个变量,最后变成 class MyClass{} constructor(name){ this.name=name; } getClassName(){ return this.name; } } var inst = new MyClass('xiaoming'); console.log("myclass: "+inst.getClassName()); </script> <p>17.3 class私有方法 this 见文档 </p> <p>17.4 extends</p> <script> class Points{ constructor(x,y){ this.x=x; this.y=y; } } class ColorPoints extends Points{ constructor(x,y,color){ super(x,y); // 调用父类构造函数用 super() this.color=color; } } if(Object.getPrototypeOf(ColorPoints)=== Points){ console.log("ook: "); } </script> <p>18. Decorator 类的修饰 ES7 babel转换器已支持 chrome 好像不支持</p> <script> // 1.添加属性 function testable(target) { target.isTestable=true; } @testable class People{} console.log("deco: "+People.isTestable); </script> <p>19.1 Module模块化 可取代 CommonJS(用于服务器) 和AMD规范(浏览器) ES6模块化思想,尽量静态化,编译时就有确定模块的依赖关系,使用严格模式</p> Node默认模块是CommonJS </body> </html>

浙公网安备 33010602011771号