https://github.com/able8/hello-es6#1es6%E6%80%8E%E4%B9%88%E6%9D%A5%E7%9A%84

let 和 const

  • var的问题

    • 可以重复声明,没有报错和警告
    • 无法限制修改
    • 没有块级作用域 { }
  • let 和 const

    • 不能重复声明
    • 都是块级作用域 { }块内声明的,块外无效
    • let是变量可以修改
    • const 是常量不可修改
  • 块级作用域举例

    • 原来用var的方式,结果弹出的都是3
    • 将变量封装到函数里,限制作用域,但比较麻烦
    • 用let最简单,直接var改let ,解决作用域问题

如果把var改成了let 或者 const,变量是不会被绑定到window上的,所以此时会打印出三个undefined

  1. let a = 10
  2. console.log(window.a) //undefined
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <meta http-equiv="X-UA-Compatible" content="ie=edge">
  7. <title>Document</title>
  8. <script>
  9. window.onload= function () {
  10. /*
  11. var aBtn = document.getElementsByTagName('input')
  12. for (var i=0; i < aBtn.length; i++) {
  13. aBtn[i].onclick = function () {
  14. alert(i)
  15. }
  16. }*/
  17. var aBtn = document.getElementsByTagName('input')
  18. for (let i = 0; i < aBtn.length; i++) {
  19. aBtn[i].onclick = function () {
  20. alert(i)
  21. }
  22. }
  23. /*
  24. var aBtn = document.getElementsByTagName('input')
  25. for (var i = 0; i < aBtn.length; i++) {
  26. // 封装到函数里,限制作用域
  27. (function (i) {
  28. aBtn[i].onclick = function () {
  29. alert(i)
  30. }
  31. })(i)
  32. }*/
  33. }
  34. </script>
  35. </head>
  36. <body>
  37. <input type="button" value="按钮1">
  38. <input type="button" value="按钮2">
  39. <input type="button" value="按钮3">
  40. </body>
  41. </html>

函数-箭头函数

  • 箭头函数,就是函数的简写
    • 如果只有一个参数,()可以省
    • 如果只有一个return,{ }可以省
  1. //普通函数
  2. function name(){
  3. }
  4. //箭头函数
  5. ()=>{
  6. }
  1. let show1 = function(){
  2. console.log('abc')
  3. }
  4. let show2 = ()=>{
  5. console.log('abc')
  6. }
  7. show1()
  8. show2()
  9. let show4 = function(a){
  10. return a * 2
  11. }
  12. let show5 = a=>a*2
  13. console.log(show4(10))
  14. console.log(show5(10))

函数-参数

  • 参数拓展/展开 …args
    • 收集剩余的参数,必须当到最后一个参数的位置
    • 展开数组,简写,效果和直接把数组的内容写在这儿一样
  • 默认参数
  1. function show(a,b,...args){
  2. console.log(a)
  3. console.log(b)
  4. console.log(args)
  5. }
  6. console.log(show(1,2,3,4,5))
  7. let arr1 = [1,2,3]
  8. let arr2 = [4,5,6]
  9. let arr3 = [...arr1,...arr2]
  10. console.log(arr3)
  11. function show(a,b=5,c=8){
  12. console.log(a,b,c)
  13. }
  14. show(88,12) //88 12 8

解构赋值

  • 解构赋值
    • 左右两边解构必须一样
    • 右边必须是个东西
    • 声明和赋值不能分开,必须在一句话里
  1. let [a,b,c] = [1,2,3]
  2. console.log(a, b, c)
  3. let {x,y,z} = {x:1,y:2,z:3}
  4. console.log(x,y,z)
  5. let [json,arr,num,str] = [{a:1,b:2},[1,2,3],8,'str']
  6. console.log(json, arr, num, str)

数组

  • 新增四个方法

  • map 映射:一个对一个 ```javascript let arr = [12,5,8] let result = arr.map(function(item){ return item 2 }) //简写 let result2 = arr.map(item=>item2) console.log(result) console.log(result2)

let score = [18,86,88,24] let result3 = score.map(item=>item>=60?’及格’:’不及格’) console.log(result3) // [“不及格”, “及格”, “及格”, “不及格”]

  1. - reduce 汇总: 一堆出来一个
  2. - 用于算个总数,算个平均
  3. ```javascript
  4. 求和:
  5. var arr = [1,3,5,7]
  6. var result = arr.reduce(function(tmp,item,index){
  7. //tmp 上次结果,item当前数,index次数1开始
  8. console.log(tmp,item,index)
  9. return tmp+item
  10. })
  11. console.log(result)
  12. 求平均数:
  13. var arr = [1,3,5,7]
  14. var result = arr.reduce(function(tmp,item,index){
  15. if(index != arr.length-1){//不是最后一次
  16. return tmp + item
  17. }else{
  18. return (tmp+item)/arr.length
  19. }
  20. })
  21. console.log(result)
  • filter 过滤器 保留为true的 ```javascript var arr = [12, 4, 8, 9] //实际的工作原理,下面的结果与此一样 var result = arr.filter(item => (item % 3 === 0) ? true : false) console.log(result) //[12, 9]

var result = arr.filter(item => item % 3 === 0) console.log(result)

var arr = [ { title: ‘苹果’, price: 10 }, { title: ‘西瓜’, price: 20 }, ] var result = arr.filter(json=>json.price >= 20) console.log(result)

  1. - forEach循环迭代
  2. ```javascript
  3. var arr = [12,4,8,9]
  4. var result = arr.forEach(item=>console.log(item))
  5. var result = arr.forEach((item,index)=>console.log(item,index))

字符串

  • 新增2个新方法
    • startsWith
    • endsWith
  1. var url = 'http://qq.com'
  2. console.log(url.startsWith('http')) //true
  3. console.log(url.endsWith("com")) //true
  • 字符串模板
    • 使用反引号 ${变量}
    • 可以拆行
  1. let a = 12
  2. let star1 = `asdf${a}`
  3. console.log(star1) //asdf12
  4. let title = '标题'
  5. let content = '内容'
  6. let str = `<div>
  7. <h1>${title}</h1>
  8. <p>${content}</p>
  9. `
  10. console.log(str)

面向对象-基础

  • 原来写法
    • 类和构造函数一样
    • 属性和方法分开写的 ```javascript function User(name,pass){ this.name = name this.pass = pass }

User.prototype.showName = function(){ console.log(this.name) } User.prototype.showPass = function(){ console.log(this.pass) } var u1 = new User(‘able’,’123’) u1.showName() u1.showPass() //老版本继承 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(){ console.log(this.level) } var v1 = new VipUser(‘chu’,’1234’,3) v1.showName() v1.showLevel()

  1. - 新版面向对象
  2. - 有了class关键字,构造器
  3. - class里面直接加方法
  4. - 继承 super超类 == 父类
  5. ```javascript
  6. class User{
  7. constructor(name,pass){
  8. this.name = name
  9. this.pass = pass
  10. }
  11. showName(){
  12. console.log(this.name)
  13. }
  14. showPass(){
  15. console.log(this.pass)
  16. }
  17. }
  18. var u1 = new User("able",'111')
  19. u1.showName()
  20. u1.showPass()
  21. //新版本继承
  22. class VipUser extends User{
  23. constructor(name,pass,level){
  24. super(name,pass)
  25. this.level = level
  26. }
  27. showLevel(){
  28. console.log(this.level)
  29. }
  30. }
  31. v1 = new VipUser('chu','123',3)
  32. v1.showLevel()

Promise

  • 异步和同步

    • 异步,操作之间没有关系,同时执行多个操作,代码复杂
    • 同步,同时只能做一件事,代码简单
  • promise对象

    • 用同步的方式来书写异步代码
    • promise让异步操作写起来,像在写同步操作的流程,不必一层层的嵌套回调函数
    • 改善了可读性,对于多层嵌套的回调函数很方便
    • 充当异步操作与回调函数之间的中介,使得异步操作具备同步操作的接口
  • promise 也是一个构造函数

    • 接受一个回调函数f1作为参数,f1里面是异步操作的代码
    • 返回的p1就是一个Promise实例
    • 所有异步任务都返回一个Promise实例
    • Promise实例有一个then方法,用来指定下一步的回调函数
  1. function f1(resolve, reject) {
  2. // 异步代码...
  3. }
  4. var p1 = new Promise(f1);
  5. p1.then(f2); // f1的异步操作执行完成,就会执行f2。
  • promise 使得异步流程可以写成同步流程 ```javascript // 传统写法 step1(function (value1) { step2(value1, function(value2) { step3(value2, function(value3) {
    1. step4(value3, function(value4) {
    2. // ...
    3. });
    }); }); });

// Promise 的写法 (new Promise(step1)) .then(step2) .then(step3) .then(step4);

  1. - Promise.all(promiseArray)方法
  2. - 将多个Promise对象实例包装,生成并返回一个新的Promise实例
  3. - promise数组中所有的promise实例都变为resolve的时候,该方法才会返回,并将所有结果传递results数组中
  4. - promise数组中任何一个promisereject的话,则整个Promise.all 调用会立即停止,并返回一个reject的新的promise对象
  5. ```javascript
  6. var p1 = Promise.resolve(1),
  7. p2 = Promise.resolve(2),
  8. p3 = Promise.resolve(3);
  9. Promise.all([p1, p2, p3]).then(function (results) {
  10. console.log(results); // [1, 2, 3]
  11. });
  • Promise.rece([p1,p2,p3])
    • Promise.race就是赛跑的意思
    • 哪个结果获得的快,就返回哪个结果
    • 不管结果本身是成功还是失败状态

generator

  • generator 生成器函数
    • 普通函数,一路到底
    • generator函数,中间可以停,到哪停,用yield配合,交出执行权
    • yield有 放弃 退让 退位的意思
    • 需要调用next()方法启动执行,需要遇到yield停,踹一脚走一步
    • generator函数前面加一个 * 两边可以有空格,或靠近函数或function
    • 背后实际生成多个小函数,实现走走停停

基本示例

  1. function *show() {
  2. alert("a")
  3. yield;
  4. alert("b")
  5. }
  6. let genObj = show()
  7. genObj.next()
  8. genObj.next()

yield 传参
yield 返回
**

  1. function* show() {
  2. alert("a")
  3. yield 12
  4. alert("b")
  5. return 55
  6. }
  7. let gen = show()
  8. let res1 = gen.next() //{value: 12, done: false}
  9. console.log(res1);
  10. let res2 = gen.next()
  11. console.log(res2) //{value: 55, done: true}

image.png


set

它类似于数组,但是成员的值都是唯一的,没有重复的值。
Set本身是一个构造函数,用来生成Set数据结构

涉及题目
去除一个数组中重复的成员

  1. Set 方法
  2. [...new Set(array)]

也可以用于去除字符串里面的重复字符

  1. [...new Set('ababbc')].join('')

Set实例的属性和方法

set 结构的实例有以下属性

  • Set.prototype.constructor 构造函数,默认就是Set函数
  • Set.prototype.size 返回Set实例的成员总数

实例方法分为两大类: 操作方法(用于操作数据)和遍历方法(用于遍历成员)

  • Set.prototype.add(value) 添加某个值,返回Set结构本身
  • Set.prototype.delete(value) 删除某个值,返回一个布尔值,表示删除是否成功
  • Set.prototype.has(value) 返回一个布尔值,表示该值是否为Set成员
  • Set.prototype.clear() 清除所有成员,没有回值

https://blog.csdn.net/bdss58/article/details/54985676
https://blog.csdn.net/Zhihua_W/article/details/52184289

Promise 对象

1.Promise的含义

Promise 就是一个容器,里面保存着某个未来才会结束的事件(通常是一个异步操作)的结果.
有了Promise对象,就可以将异步操作以同步操作的流程表达出来,避免了层层嵌套的回调函数,此外,Promise对象提供统一的接口,使得控制异步操作更加容易

Promise 对象的特点

  • 对象的状态不受外界影响
    • pending(进行中)
    • fulfilled(已成功)
    • rejected(已失败)
  • 一旦状态改变,就不会在变,任何时候都可以得到这个结果.
    • pending => fulfilled
    • pending => rejected

resolved (已定型)

2.基本用法

  1. const promise = new Promise(function(resolve, reject) {
  2. // ... some code
  3. if (/* 异步操作成功 */){
  4. resolve(value);
  5. } else {
  6. reject(error);
  7. }
  8. });
  9. promise.then(function(value){
  10. //success
  11. },function(error){
  12. //failure
  13. })

resolve 函数的作用是,将Promise对象的状态从 未完成 变为 成功 (即从pending 变为 resolved) 在异步操作成功时调用,并将异步操作的结果,作为参数传递出去,
reject函数的作用是,将Promise对象的状态从 未完成 变成 失败(即从pending 变为 rejected) 在异步操作失败时调用,并将操作报出的错误,作为参数传递出去.
Promise 实例生成以后,可以用then方法分别指定 resolved 状态和 rejected状态的回调函数

其中第二个参数时可选的. 这两个函数都接受 Promise 对象传出的值作为参数

  1. 例子
  2. function timeout(ms){
  3. return new Promise((resolve,reject)=>{
  4. setTimeout(resolve,ms,'这个参数将被传入回调函数中')
  5. })
  6. }
  7. timeout(100).then((value)=>{
  8. console.log(value)
  9. })
  10. timeout 方法返回一个Promise 实例 表示一段时间以后才会发生的结果,过了指定的时间(ms参数)以后,
  11. Promise实例的状态变为 resolved 就会触发then 方法绑定的回调函数.

Promise 新建后就会立即执行

  1. let promise = new Promise(function(resolve, reject) {
  2. console.log('Promise');
  3. resolve();
  4. });
  5. promise.then(function() {
  6. console.log('resolved.');
  7. });
  8. console.log('Hi!');
  9. // Promise
  10. // Hi!
  11. // resolved

上面代码中,Promise 新建后立即执行,所以首先输出的是 Promise 然后, then 方法指定的回调函数,将在当前脚本所有同步任务执行完才会执行,所以resolved最后输出.

http://es6.ruanyifeng.com/#docs/promise

es6 node


ES5面向对象

ES6面向对象

  1. function Point(x,y){
  2. this.x = x
  3. this.y = y
  4. }
  5. Point.prototype.toString = function(){
  6. return '(' + this.x + ', ' + this.y + ')';
  7. }
  8. var p = new Point(1,2)

=> Class 写法

  1. class Point {
  2. constructor(x, y) {
  3. this.x = x
  4. this.y = y
  5. }
  6. toString(){
  7. return '(' + this.x + ', ' + this.y + ')';
  8. }
  9. }
  10. 其中 constructor 方法就是构造方法,而this关键字则代表实例对象
  11. toString() 方法,前面不需要加上function关键字,直接把函数定义放进去就可以了
  1. class Point {
  2. // ...
  3. }
  4. typeof Point // "function"
  5. Point === Point.prototype.constructor // true