es6 [记录]
将a数组 与b数组进行合并
a=[1,2,3]
b=[4,5,6]
c = a.concat(b);//c=[1,2,3,4,5,6]
this.listArr.forEach((el, i) => { el.is_dafault = (el.id === obj.id) ? 0 : 1; })
ECMA ≈ js ECMAScript = ECMA = ES 兼容性 ES5 很少不兼容 ES6(ES2015): IE10+ 、 Google 、FireFox 、 移动端 、 NodeJs 解决:编译 、转换 转换: 1.在线转换 2.提前编译(!提倡,在线转换费时间) 在线转换: babel == browser.js 使用方式:引入browser.js+script标签(代码范围)定义type=“text/babel” 编译需要时间 ES6 1. 变量 let(变量,可以不断修改) / const(常量,不能修改) 不能重复声明 块级作用域 { ... } div > input*3 click=function alert(i) 解决1 for里面垫了一层作用域(function(i)){a.onclik=fn})(i); 解决2 for(let i=0 ...) 2. 函数 箭头函数 function name(){} ()=>{} function去掉加=> 1.如果只有一个参数 ()可以省 a=>{...} 2.如果只有一个return {}可以省 a=>a*2; 函数的参数 1.参数扩展+数组展开(剩余参数) function(a,b,...args){ //args 可以随便取名字 // a,b,...args,c [X] alert(a); alert(b); alert(args); } show(12,15,8,9,20); +收集剩余参数 *Rest Parameter必须是最后一个 +展开一个数组 let arr = [1,2,3]; ...arr 相当于 1,2,3 展开后的效果,跟直接把数组的内容写出来一样 let arr = [...arr1,...arr2] 不符合语法情况(以下赋值) let a; let arr = [1,2,3] a = ...arr; [X] // a = 1,2,3; alert(a); 2.默认参数 如:animation 里面的时间 function show(a,b=5,c=12){ console.log(a,b,c) } show(99,19) --- 99,19,12 3. 数组 + map 映射 => 一个对一个 [12,58,86,45,91] => [不及格,不及格,及格,不及格,及格] [12,58,86,45,91] => [{...},{...},{...},{...},{...}] let arr=[12,5,8] arr.map(function(item){ alert(item*2) }) arr.map(item=>item*2) + reduce 汇总 => 一堆出来一个 算个总数 平均数 ... [1,2,3] => 6 let arr =[12,69,180,8763] arr.reduce(function(tmp他是中间结果 临时结果用于下一次,item,index){ return tmp+item }) 中间结果 return 0+12 -> return 12+69 -> return 81+180 ... 平均数 求和+最后一次单独处理if(index != arr.length-1) + filter 过滤器 留一部分删一部分 let arr = [12,5,8,99,27,36,75] 能被3整除的留下 let res = arr.filter(item=>item%3==0) + forEach 循环(迭代) arr.forEach(el=>{...}) arr.forEach((el,index)=>{...}) 4. 字符串 1.多两个新方法 startsWith str.startsWith('a') 字符串是否以a开头 https:// endsWith str.endsWith('.com') 163.com 2.字符串模板 反单引号 1边上 let a = 12; `uuu${a}` ==> uuu12 把变量放到字符串 拼接html 普通字符串不能折行,模板字符串能折行 let str='<div>\ <h3>'+h3+'</h3>\ <p>'+p+'</p>\ </div>'; 5. 面向对象 + 面向对象 function User(name,pass){ this.name=name; this.pass=pass; } User.prototype.showName=function(){alert(this.name);} User.prototype.showPass=function(){alert(this.pass);} var u1 = new User('n1','123456'); alert(u1.showName); alert(u1.showPass); 类和构造函数一样+散开 新版面向对象 class User{ constructor(name,pass){ this.name=name; this.pass=pass; } showName(){alert(this.name);} showPass(){alert(this.pass);} } 1.class关键字、构造器和类分开 2.class里面直接加方法 + 继承: function VipUser(name,pass,level){ User.call(this,name,pass); this.level = level; } VipUser.prototype=new User(); VipUser.prototype.constructor=VipUser; VipUser.prototype.showLevel=function(){alert(this.level);} 新版本继承 class VipUser extends User{ 继承自User constructor(name,pass,level){ super(name,pass); ------ super 超类=父类 call this.level = level; } showLevel(){alert(this.level);} } + 面向对象实例 (应用--react) react:组件化-class + JSX(JSX==babel==browser.js react依赖于JSX JSX是js扩展版) react.js + react-dom.js + browser.js script type='text/babel' class 新组件Name extends React.Component{ constructor(...args){ super(...args); } render(){ return <span>{this.props.str}</span>; 也可以return 组件 <新组件Name str='我想传参'></新组件Name> } } window.onload=function(){ ReactDom.render( <新组件Name str='我想传参'></新组件Name>, ...... ) } 6. Promise -- 承诺 异步:操作和操作之间没有关系 可以同时进行多个操作 缺:代码更复杂 ajax('/banners',function(){ 继续往下ajax 请求别的 一层层往下走 },function(){ alert('get Error') }) 同步:同时只能做一件事 代码简单 顺序往下写ajx代码即可 Promise -- 清除异步操作 * 用同步一样的方法 来书写异步代码 需要Promise 需要new let p = new Promise(function(resolve解决,reject拒绝){ // 异步代码 // resolve -- 成功了 // reject -- 失败了 $.ajax({ url:'arr.txt', dataType:'json', sucess(arr){ // 成功的时候调用 resolve resolve(arr); }, error(err){ // 失败的时候调用 reject reject(err); } }) }) 应用 p.then(function(arr){ // 成功调用的方法 },function(err){ // 失败调用方法 }) // 应用到点 let p1 = ...... arr let p2 = ...... json Promise.all([p1,p2]).then(function(arr){ alert('全都成功') cosnole.log --- arr = [ arr , json ] 分解 let [res1,res2] = arr },function(){ alert('至少有一个失败了') }) 写两个Promise 麻烦 => 封装 function createPromise(url){ return new Promise(function(resolve,reject){ $.ajax({ url, dataType:'json', sucess(arr){resolve(arr);}, error(err){reject(err);} }) }) } Promise.all([createPromise(url1),createPromise(url2)]).then(........) 高版本jq 自带 Promise 不用自己封装 Promise.all([ $.ajax({url:'url1',dataType:'json'}), $.ajax({url:'url2',dataType:'json'}) ]).then(res=>{ let [arr,json] = res; },err=>{}) *其他用法 Promise.race 竞速 用的少 all 一个个都要成功 一个不能缺一个不能少 race 需求 谁先来执行谁 Promise.race([ $.ajax({url:'url1',dataType:'json'}), $.ajax({url:'url2',dataType:'json'}) ]) 7. generator - 生成器 generat - 生成 普通函数 -- 一条路走到底 + generator函数 -- 中间能暂停 function *show(){ *爱贴着谁贴着谁 但是不能一起贴 alert('a'); 和*配 yield; 暂时放弃执行 alert('b'); } 不能直接show(); 创建出了generator对象 踹一脚走一步 - let genObj=show(); - genObj.next(); a - genObj.next(); b 为什么要停? function 函数(){ 代码... ajax(xxx,function(){ 代码... }); } 相当于 不用回调 function *函数(){ 代码... yield ajax(xxx);// 这里配置 代码... } + yield 既可以传参 又可以返回 ++ 传参 function *show(){ alert('a'); yield; let a = yield; alert('b'); alert(a) a=5 } let genObj=show(); genObj.next(12); genObj.next(5); next里面可以传参 传参的参数会到yield里面 yield 里面接参数 let a = yield; a=5 解释: 第一个next 执行开始到yeild let a = 不包括 第二个next 从 let a = 开始 5从这时候进去 第一个next 传参是废的 ++ 返回 中间结果 (每一步都有一个中间结果) + 最后结果(return) yield后面可以跟东西 function *show(){ alert('a'); yield 12; alert('b'); } let gen=show(); let res1 = gen.next(); console.log(res1); --- {value:12,done:false} done 还未完成 let res2 = gen.next(); console.log(res2) --- {value:undefined,done:true} 执行最后一个了undefined = return的东西 function *炒菜(菜市场买回来的菜){ 洗菜 --> 洗好的菜 let 干净的菜 = yield 洗好的菜; 干净的菜 --> 切 --> 丝 let 切好的菜 = yield 丝; 切好的菜 --> 炒 --> 熟的菜 return 熟的菜; } 开始到 yield 右边 --- 一个程序 + generator 实例 Runner 需要组件支持 cnpm i yield-runner-blue 主要要js index.js runner.js + runner.js runner(function *(){ let data1 = yield $.ajax({url:'url1',dataType:'json'}); let data2 = yield $.ajax({url:'url2',dataType:'json'}); let data3 = yield $.ajax({url:'url3',dataType:'json'}); console.log(data1,data2,data3) }) 可以像写同步一样写异步 $.ajax({url:'url1',dataType:'json'});-Promise对象 yield出去 给runner 异步操作: 1.回调 $.ajax(.....sucess($.ajax(.....sucess(......)))) 2.Promise Promise.all([$.ajax,$.ajax]).then(......) 3.generator runner(function *(){ let d1 = yield $.ajax(....); * n }) ++ 带逻辑处理 用户-vip------ Promise.all([$.ajax]).then(res=>{ if(xxx == 'vip'){ Promise.all...... }else{ ........ } },......) 比普通回调还麻烦 generator (generator函数不能写成箭头函数) runner(function *(){ let u = yield $.ajax(....); if(u=='vip'){ let u2 = yield $.ajax(....); }else{ let u2 = yield $.ajax(....); } }) Promise - 适合 一次读一堆 没有什么逻辑 generator - 逻辑性比较强 (他的本质就是Promise) + generator 实例 KOA(NodeJs框架) KOA里面如何用generator cnpm i koa cnpm i koa-mygsql const koa = require(koa) const koa = require(koa-mygsql) let db = mygsql.createPool........... let server = new koa(); server.user(function *(){ 这里就是generator let data = yield db.query(....................) db 就是个异步 this.body = data; }) server.listen(8080) 8. 模块化 变量: var 可以重复声明 作用域为函数级 无法限制修改 常量π PI 没有块级作用域 解构赋值: 1.左右两边的解构必须一样 2.右边 必须是个东西 3.声明和赋值不能分开(必须在一句话中完成) + let [a,b,c] = [1,2,3] 相当于 let a = 1; ....... let {a,b,c} = {a:1,b:2,c:3} + 注意 [...] = {...} [X] {a,b} = {12,5} [X] let [a,b]; [a,b]=[2,5] [X] JSON 1.json对象 let json={a:12,b:5}; let str='http://apiUrl........?data='+encodeURLComponent(JSON.stringify(json)) JSON.stringify let str="{a:12,b:5}" let json = JSON.parse(str); 标准写法: 1.只能用双引号 不能用单引号 2.所有名字都必须用双引号包起来 {"a":12,"b":56} 2.简写 名字一样 let a = 5; let json = {a:a,b:15} ==> json = {a,b:15} 名字和值一样 key = value 方法 let json = { a: 12, // show:function(){ // alert(this.a); // } show(){......} } :function 一块删
ES7预览 Google 59+ 1.数组 includes 数组里面是否包含某个东西 arr.includes(99); keys/values/entries for...of 循环迭代器 for(let i in arr) i为值=value for(let i in json) i 报错 json对象是一个可迭代的对象,不是一个迭代器 for...of不能用于json for...in 循环json for(let i in arr) i为下标=key for(let i in json) i=key for...of keys=>所有的key拿出来 0,1,2,3 values=>所有的value拿出来 12,5,99 entries=>所有的key-value对拿出来 {key:0,value:12},{key:1,value:5}...... * entry实体 for(let key of arr.keys()){......} for(let val of arr.values()){......} !!!ES7 for(let entry of arr.entries()){......} = for(let [key,value] of arr.entries()){......} 2.幂 求幂 之前:Math.pow(3,8) 3**8 3.字符串padStart/padEnd console.log('abc'.padStart(10)) 从起始位置补10个 end 往后补 第二个参数console.log('abc'.padStart(10,'0')) 不补空格 补0 时钟09 4.语法容忍度 + 数组容忍度 [1,2,3] => [1,2,3,] ie---- [1,2,3,] 直接不认 + 参数容忍度 function aa(1,2,3,) {} 5.async await !!!要求浏览器版本59+++ async await => generator yield 的取代 generator 需要runner async function show(){alert('a');await;alert('b');} async function readData(){ let d1 = await $.ajax(......) ............ } 1.async可以写成箭头函数 let read = async ()=>{......} 2.不依赖于外部的runner 统一+性能高