ES6

作者: Never_Yg | 来源:发表于2017-06-21 11:42 被阅读24次

    AJAX

    异步网络请求

    var request = new XMLHttpRequest(); // 新建XMLHttpRequest对象
    
    request.onreadystatechange = function () { // 状态发生变化时,函数被回调
        if (request.readyState === 4) { // 成功完成
            // 判断响应结果:
            if (request.status === 200) {
                // 成功,通过responseText拿到响应的文本:
                return success(request.responseText);
            } else {
                // 失败,根据响应码判断失败原因:
                return fail(request.status);
            }
        } else {
            // HTTP请求还在继续...
        }
    }
    
    // 发送请求:
    request.open('GET', '/api/categories');
    request.send();
    
    alert('请求已发送,请等待响应...');
    
    

    Promise

    使用了Promise对象之后可以链式调用的方式组织代码

    new Promise(test).then(function (result) {
        console.log('成功:' + result);
    }).catch(function (reason) {
        console.log('失败:' + reason);
    });
    

    Promise.all: 都成功才会返回
    Promise.race: 有一个成功就返回

    var p1 = new Promise(function (resolve) {
        setTimeout(function () {
            resolve("Hello");
        }, 3000);
    });
    
    var p2 = new Promise(function (resolve) {
        setTimeout(function () {
            resolve("World");
        }, 1000);
    });
    
    Promise.all([p1, p2]).then(function (result) {
        console.log(result); // ["Hello", "World"]
    });
    
    

    对象

    delete Person.name 删除对象属性
    'name' in Person 对象是否存在该属性
    in缺陷---属性是继承来的时候,仍然返回true
    最好使用 hasOwnProperty()
    Person.hasOwnProperty('name')

    Map

    对象缺陷: key必须是字符串
    Map就是支持全类型的key(如:number)

    var m = new Map([['Michael', 95], ['Bob', 75], ['Tracy', 85]]);
    m.get('Michael'); // 95
    
    
    var m = new Map(); // 空Map
    m.set('Adam', 67); // 添加新的key-value
    m.set('Bob', 59);
    m.has('Adam'); // 是否存在key 'Adam': true
    m.get('Adam'); // 67
    m.delete('Adam'); // 删除key 'Adam'
    m.get('Adam'); // undefined
    
    

    Set

    没有重复值得Array,重复值会被自动过滤掉

    var s1 = new Set(); // 空Set
    var s2 = new Set([1, 2, 3]); // 含1, 2, 3
    var s = new Set([1, 2, 3, 3, '3']);
    s; // Set {1, 2, 3, "3"}
    s.add(4) //添加(重复添加无效果)
    s.delete(3) //删除
    

    迭代器(iterable)

    for...in 遍历的是对象的属性名称(key) Array的key就是index

    var a = ['A', 'B', 'C'];
    a.name = 'Hello';
    for (var x in a) {
        alert(x); // '0', '1', '2', 'name'
    }
    

    for...of就是解决这个问题的循环

    var a = ['A', 'B', 'C'];
    a.name = 'Hello';
    for (var x of a) {
        alert(x); // 'A', 'B', 'C'
    }
    

    更好的方式: forEach

    var a = ['A', 'B', 'C'];
    a.forEach(function (element, index, array) {
        // element: 指向当前元素的值
        // index: 指向当前索引
        // array: 指向Array对象本身
        alert(element);
    });
    

    Set

    var s = new Set(['A', 'B', 'C']);
    s.forEach(function (element, sameElement, set) {
        alert(element);
    });
    

    Map

    var m = new Map([[1, 'x'], [2, 'y'], [3, 'z']]);
    m.forEach(function (value, key, map) {
        alert(value);
    });
    

    函数

    如果没有return语句,函数也会返回结果,只是结果为undefined
    arguments: 获取函数传入的所有参数
    rest: 抑制参数(用于获取定义参数之外的参数,不过要改写法)

    function foo(a, b, ...rest) {
        console.log('a = ' + a);
        console.log('b = ' + b);
        console.log(rest);
    }
    
    foo(1, 2, 3, 4, 5);
    // 结果:
    // a = 1
    // b = 2
    // Array [ 3, 4, 5 ]
    
    foo(1);
    // 结果:
    // a = 1
    // b = undefined
    // Array []
    
    

    变量

    var变量会提升到函数顶部声明(未赋值)
    局部作用域
    JS变量作用域实际上是函数内部, 那么在for循环语句块中是无法定义局部变量的

    function foo() {
        for (var i=0; i<100; i++) {
            //
        }
        i += 100; // 仍然可以引用变量i
    }
    
    

    let变量: 可以用来声明块级作用域的变量

    function foo() {
        var sum = 0;
        for (let i=0; i<100; i++) {
            sum += i;
        }
        i += 1; // SyntaxError
    }
    
    

    const: 定义常量

    方法

    对象绑定方法

    var xiaoming = {
        name: '小明',
        birth: 1990,
        age: function () {
            var y = new Date().getFullYear();
            return y - this.birth;
        }
    };
    
    xiaoming.age; // function xiaoming.age()
    xiaoming.age(); // 今年调用是25,明年调用就变成26了
    

    this: 指向当前对象
    apply call绑定函数

    function getAge() {
        var y = new Date().getFullYear();
        return y - this.birth;
    }
    
    var xiaoming = {
        name: '小明',
        birth: 1990,
        age: getAge
    };
    
    xiaoming.age(); // 25
    getAge.apply(xiaoming, []); // 25, this指向xiaoming, 参数为空
    
    

    另一个与apply()类似的方法是call(),唯一区别是:
    • apply()把参数打包成Array再传入;
    • call()把参数按顺序传入。
    比如调用Math.max(3, 5, 4),分别用apply()和call()实现如下:

    Math.max.apply(null, [3, 5, 4]); // 5
    Math.max.call(null, 3, 5, 4); // 5
    

    对普通函数调用,我们通常把this绑定为null。

    高级函数

    map(): 定义在Array中,对数组中每个元素执行map中传入的操作,并返回新数组

    function pow(x) {
        return x * x;
    }
    
    var arr = [1, 2, 3, 4, 5, 6, 7, 8, 9];
    arr.map(pow); // [1, 4, 9, 16, 25, 36, 49, 64, 81]
    
    

    reduce(): 定义在Array中,必须接受两个参数,并把结果和下一个元素,做累积计算

    var arr = [1, 3, 5, 7, 9];
    arr.reduce(function (x, y) {
        return x + y;
    }); // 25
    
    

    filter(): 定义在Array中,过滤掉元素,返回剩下的元素

    var arr = [1, 2, 4, 5, 6, 9, 10, 15];
    var r = arr.filter(function (x) {
        return x % 2 !== 0;
    });
    r; // [1, 5, 9, 15]
    
    

    sort(): 定义在Array中,排序函数

    var arr = [10, 20, 1, 2];
    arr.sort(function (x, y) {
        if (x < y) {
            return -1;
        }
        if (x > y) {
            return 1;
        }
        return 0;
    }); // [1, 2, 10, 20]
    
    

    箭头函数

    箭头函数相当于匿名函数

    // 两个参数:
    (x, y) => x * x + y * y
    
    // 无参数:
    () => 3.14
    
    // 可变参数:
    (x, y, ...rest) => {
        var i, sum = x + y;
        for (i=0; i<rest.length; i++) {
            sum += rest[i];
        }
        return sum;
    }
    
    

    如果要返回一个对象

    // SyntaxError:
    x => { foo: x } //错误写法
    // ok:
    x => ({ foo: x })
    //因为和{...}函数体的语法冲突
    

    箭头函数和匿名函数的区别:
    匿名函数会出现this的错指向

    var obj = {
        birth: 1990,
        getAge: function () {
            var b = this.birth; // 1990
            var fn = function () {
                return new Date().getFullYear() - this.birth; // this指向window或undefined
            };
            return fn();
        }
    };
    
    

    箭头函数已绑定this,不会出现错指向

    var obj = {
        birth: 1990,
        getAge: function () {
            var b = this.birth; // 1990
            var fn = () => new Date().getFullYear() - this.birth; // this指向obj对象
            return fn();
        }
    };
    obj.getAge(); // 25
    
    

    generator(多返回函数) 使用function*定义

    function* foo(x) {
        yield x + 1;
        yield x + 2;
        return x + 3;
    }
    

    闭包: 返回值是函数, 函数的参数记录父函数的环境,这样就把东西带出来了

    面向对象

    JS不区分类和对象的概念,而是通过原型(prototype)实现面向对象编程

    var Student = {
        name: 'Robot',
        height: 1.2,
        run: function () {
            console.log(this.name + ' is running...');
        }
    };
    
    var xiaoming = {
        name: '小明'
    };
    
    xiaoming.__proto__ = Student;
    
    

    JS没有类的概念,多有的都是对象,使用原型实现继承
    原型链

    arr ----> Array.prototype ----> Object.prototype ----> null
    

    构造函数

    function Student(name) {
        this.name = name;
        this.hello = function () {
            alert('Hello, ' + this.name + '!');
        }
    }
    //这确实是一个普通函数,但是在JavaScript中,可以用关键字new来调用这个函数,并返回一个对象:
    var xiaoming = new Student('小明');
    xiaoming.name; // '小明'
    xiaoming.hello(); // Hello, 小明!
    

    prototype: 可以用来扩展原型的属性和方法

    相关文章

      网友评论

          本文标题:ES6

          本文链接:https://www.haomeiwen.com/subject/zrizqxtx.html