Skip to content

ES6

https://es6.ruanyifeng.com/

一、 const、let

let
const

二、 字符串扩展

2.1 模版字符串

是增强版的字符串,用反引号(`)标识

变量名写在${}之中。

如果使用模板字符串表示多行字符串,所有的空格和缩进都会被保留在输出之中。

可以使用trim方法消除它。

还能调用函数

javascript
 basket = {};
$('#result').append(`
  There are <b>${basket.count}</b> items
   in your basket, <em>${basket.index}</em>
  are on sale!
`).trim();
// trim() 消除空格和缩进

三、 数组的扩展

3.1 扩展运算符

扩展运算符(spread)是三个点(...

该运算符将一个数组,变为参数序列

3.2 扩展运算符应用

  • a. 复制数组

数组是复合的数据类型,直接复制的话,只是复制了指向底层数据结构的指针,而不是克隆一个全新的数组。

javascript
// ES5的方法,
const a1 = [1, 2];
const a2 = a1;

上面代码中,a2并不是a1的克隆,而是指向同一份数据的另一个指针。修改a2,会直接导致a1的变化。

以下两种修改a2不会对a1产生影响

javascript
// ES5的方法,
const a1 = [1, 2];
const a2 = a1.concat();
javascript
// ES6的方法,
const a1 = [1, 2];
const a2 = [...a1];
  • b. 合并数组

以下为浅拷贝(它们的成员都是对原数组成员的引用,这就是浅拷贝)

javascript
const arr1 = ['a', 'b'];
const arr2 = ['c'];
const arr3 = ['d', 'e'];

// ES5 的合并数组
arr1.concat(arr2, arr3);
// [ 'a', 'b', 'c', 'd', 'e' ]

// ES6 的合并数组
[...arr1, ...arr2, ...arr3]
// [ 'a', 'b', 'c', 'd', 'e' ]
  • c. 字符串

将字符串转为真正的数组。

javascript
[...'hello']

d. 数组的遍历

javascript

 var arr3 = arr1.map((item, index) => {
     // index:每一项值,index:下标
 });
 // 只有一个参数()可省略

 var arr4 = arr1.map(item => item + 1);
 // 返回遍历后的结果

e. 数组实例的 entries(),keys() 和 values()

ES6 提供三个新的方法——entries(),keys()和values()——用于遍历数组。它们都返回一个遍历器对象(详见《Iterator》一章),可以用for...of循环进行遍历,唯一的区别是keys()是对键名的遍历、values()是对键值的遍历,entries()是对键值对的遍历。

javascript

for (let index of ['a', 'b'].keys()) {
  console.log(index);
}
// 0
// 1

for (let elem of ['a', 'b'].values()) {
  console.log(elem);
}
// 'a'
// 'b'

for (let [index, elem] of ['a', 'b'].entries()) {
  console.log(index, elem);
}
// 0 "a"
// 1 "b"

四、Promise

callback hell

回调地域的产生

javascript
$.get(url1, (data1) => {
    console.log(data1);
    $.get(url2, (data2) => {
        console.log(data2);
        $.get(url3, (data2) => {
            console.log(data3);
            // ...
        })
    })
})

promise链式调用来解决

javascript
function loadImg(src) {
    return new Promise(
        (resolve, reject) => {
            const img = document.createElement('img')
            img.onload = () => {
                resolve(img)
            }
            img.onerror = () => {
                const err = new Error(`图片加载失败 ${src}`)
                reject(err)
            }
            img.src = src
        }
    )
}

const url1 = 'https://forguo.cn/favicon.ico'
const url2 = 'https://forguo.cn/favicon.ico'

loadImg(url1).then(img1 => {
    console.log(img1.width)
    return img1 // 普通对象
}).then(img1 => {
    console.log(img1.height)
    return loadImg(url2) // promise 实例
}).then(img2 => {
    console.log(img2.width)
    return img2
}).then(img2 => {
    console.log(img2.height)
}).catch(ex => console.error(ex))

应用

封装一个ajax

javascript
// ajax封装
const request = function (params) {
    return new Promise((resolve, reject) => {
        const {
            method = 'get',
            url,
            data
        } = params;
        const xhr = new XMLHttpRequest();

        xhr.open(method, url, true);
        xhr.setRequestHeader('Content-Type', 'application/json; charset=utf-8')
        xhr.onreadystatechange = function () {
            /**
             * readyState
             * 0:还没调用
             * 1:载入(正在发送)
             * 2:载入完成
             * 3:解析响应内容
             * 4:解析完成
             */
            if (xhr.readyState == 4) {
                /**
                 * http状态码
                 * 2XX 成功返回
                 * 3XX 重定向
                 * 4XX 客户端错误
                 * 5XX 服务端错误
                 */
                if (xhr.status == 200) {
                    resolve(JSON.parse(xhr.responseText));
                } else {
                    reject(xhr);
                }
            }
        }
        xhr.send(JSON.stringify(data) || null);
    });
}

let submit = function () {
    request({
        method: 'post',
        url: 'https://forguo.cn/api/common/wechat/sdk',
        data: {
            url: 'www',
        }
    }).then(res => {
        console.log(res);
    }, (err) => {
        console.warn(err);
    });
}

五、Generator函数

javascript

function* helloWorldGenerator() {
    yield 'hello';
    yield 'world';
    return 'ending';
}

let hd = helloWorldGenerator();

hd.next(); // { value: 'hello', done: false }
hd.next(); // { value: 'world', done: false }
hd.next(); // { value: 'ending', done: true }
hd.next(); // { value: undefined, done: true }

// value属性表示当前的内部状态的值,是yield表达式后面那个表达式的值;done属性是一个布尔值,表示是否遍历结束。
// 调用 Generator 函数,返回一个遍历器对象,代表 Generator 函数的内部指针。

Generator函数(翻译:生成器)

yield: 产出,yield暂停执行的标记,next 用于恢复执行

分段执行

Generator 函数可以不用yield表达式,这时就变成了一个单纯的暂缓执行函数。这时就变成了一个单纯的暂缓执行函数

如何使用 Generator 函数(一个异步任务的封装)

javascript

let getNow = function () {
    let now = new Date();
    return now.getHours() + ':' + now.getMinutes() + ':' + now.getSeconds();
};

function* get() {
    var result = yield getNow();
    console.log(result);
}
let g = get();
g.next();

图片响应式

html
<img srcset="photo_w350.jpg 1x, photo_w640.jpg 2x" src="photo_w350.jpg" alt="">

如果屏幕的dpi = 1的话则加载1倍图,而dpi = 2则加载2倍图

六、class

javascript
class App {
    init() {
        console.log('init')
    }
    test() {
        console.log('test')
    }
}

let app = new App();
app.init();

class的原型本质

七、Proxy

javascript

let obj = new Proxy({}, {
    get: function (target, key, receiver) {
        console.log(`getting ${key}!`);
        return Reflect.get(target, key, receiver)

    },
    set: function (target, key, value, receiver) {
        console.log(`setting ${key}!`);
        console.log(`value ${value}!`);
        return Reflect.set(target, key. value, receiver)
    }
});

obj.count = 1;
//  setting count!
// ++obj.count;


let proxy = new Proxy({},{
    get: function (target, property) {
        return 35;
    }
});

...