let/const

变量和常量

不能重复定义

case1

{
    //js
    var a = 10
    a = 20
    // es6
    let b = 10
    b = 30
    const c = 10
    c = 40  //报错
}

存在块级作用域

case2

{
    const obj = {
        a: 10
    }
    obj.b = 20
}

多行字符串/模板变量

case

{
    var name = 'susan', age = 18, html = ''
    //JS
    html += '<div>' +
                '<p>' + name + '</p>' +
                '<p>' + age + '</p>' +
            '</div>'
    //ES6
    html += `<div>
                <p>${name}</p>
                <p>${age}</p>
            </div>
            `
}

解构赋值

case1

{
    var obj = {
        a: 10,
        b: 20
    }
    // JS
    var a = obj.a
    var b = obj.b
    // ES6
    let {a, b} = obj
}

case2

{
    function fn(){
        return {
            a: 10,
            b: 20
        }
    }
    let {a, b} = fn()
    console.log(a, b)
}

块级作用域

case

{
    var arr = [1, 2, 3, 4, 5]
    // JS
    for(var i = 0; i < arr.length; i++) {}
    console.log(i)
    // ES6
    for (let j = 0; j < arr.length; j++) {}
    console.log(j)
}

函数默认参数

case

{
    // JS
    function fn(a, b) {
        if (b==null){
            b=0
        }
    }
    // ES6
    function fn(a, b=0){}
}

箭头函数

case1

{
    var arr = [1, 2, 3, 4, 5]
    // JS
    var arr1 = arr.map(function(item) {
        return item+1
    })
    console.log(arr1)
    // ES6
    let arr2 = arr.map(item => item+1)
    let arr3 = arr.map((item, index) => {
        return item+index
    })
    console.log(arr2)
    console.log(arr3)
}

case2

{
    function fn() {
        var arr = [1, 2, 3, 4, 5]
        console.log('fn: '+this)
        arr.map(function(item){
            console.log('JS: '+this)
        })
        arr.map(item=>{
            console.log('ES6: '+this)
        })
    }
    fn.call({a:10})
}

分析:第一个this是{a:10},第二个this是window对象,第三个this是{a:10}。

 Class

先回顾下JS构造函数

case

{
    function MathHandle(x,y){
        this.x=x
        this.y=y
    }
    MathHandle.prototype.add=function(){
        return this.x+this.y
    }
    var m = new MathHandle(1,2)
    console.log(m.add())
}

然后我们看下class语法

{
    class MathHandle {
        constructor(x,y){
            this.x=x
            this.y=y
        }
        add(){
            return this.x+this.y
        }
    }

    var m = new MathHandle(1,2)
    console.log(m.add())
    console.log(typeof MathHandle)
    console.log(MathHandle === MathHandle.prototype.constructor)
    console.log(m.__proto__ === MathHandle.prototype)
}

上面case我们后面添加了2个console

typeof MathHandle // function

MathHandle === MathHandle.prototype.constructor // true

m.__proto__ === MathHandle.prototype // true

我们可以看出class是语法糖,它的本质还是function

继承

 先看下JS的继承如何书写

case

function Animal(name){
  this.name = name
  this.eat = function(){
      console.log(this.name + ' eat')
  }
}
function Dog(name){
  Animal.call(this, name)
  this.bark = function(){
      console.log(this.name + ' bark')
  }
}
Dog.prototype = new Animal()
var dog = new Dog('hashiqi')
dog.bark()
dog.eat()

ps:原型链继承可以继承构造函数里面以及原型链上的属性和方法,实例化子类的时候没法给父类传值。对象冒充继承,没法继承原型链上的属性和方法。

然后看下es6继承如何实现

{
    class Animal{
        constructor(name){
            this.name=name
        }
        eat(){
            console.log(`${this.name}+ eat`)
        }
    }
    class Dog extends Animal{
        constructor(name){
            super(name)
            this.name=name
        }
        bark(){
            console.log(`${this.name} bark`)
        }
    }
    const dog = new Dog('gou')
    dog.bark()
    dog.eat()
}

 Promise的基本语法

解决Callback Hell

case

{
    function loadImg(src, callback, fail) {
        var img = document.createElement('img')
        img.onload=function(){
            callback&&callback(img)
        }
        img.onerror=function(){
            fail()
        }
        img.src=src
    }
    var src='https://......jpeg'
    loadImg(src, function(){
        console.log('success')
    }, function(){
        console.log('fail')
    })
}

case2

{
    function loadImg(src) {
        const promise = new Promise(function(resolve, reject){
            var img = document.createElement('img')
            img.onload=function(){
                resolve(img)
            }
            img.onerror=function(){
                reject()
            }
            img.src=src
        })
        return promise
    }

    var src='https://.....jpeg'
    var result = loadImg(src)
    result.then(function(img){
        console.log('success', img)
    }, function(){
        console.log('fail')
    })
    result.then(function(img){
        console.log('success', img.height)
    })
}

 new Promise  并返回promise

有两个函数参数,函数有resolve,reject

成功执行resolve,失败调用reject

then监听结果

模块化

 case1

export let A = 123

export function test(){
    console.log('test')
}
export class Hello {
    test(){
        console.log('hello')
    }
}
import {A, test, Hello} from './a'

console.log(A, test, Hello)
import * as m from './a'

console.log(m.A, m.test, m.Hello)

case2

let A = 123

function test(){
    console.log('test')
}
class Hello {
    test(){
        console.log('hello')
    }
}
export default{
    A,
    test,
    Hello
}
import m from './a'

console.log(m.A, m.test, m.Hello)

 注意有无default

posted on 2019-03-14 23:31  苏荷酒吧  阅读(319)  评论(0编辑  收藏  举报