ES6 解构和forEach()

2,686 阅读2分钟

怎么个解构法叻?

先来个例子:

用了ES6解构的:

    let zoo = { dog: 'harry', cat: 'miumiu' };
    let { dog: a, cat: b } = zoo;
    console.log(a)  // 'harry'
    console.log(b)  // 'miumiu'

与旧写法的比较:

    let zoo = { dog: 'harry', cat: 'miumiu' };
    let a = zoo.dog;
    let b = zoo.cat;
    console.log(a)  // 'harry'
    console.log(b)  // 'miumiu'

所以结构就是 => 按照你自己的意愿从数组和对象中提取值,然后对你定的变量进行赋值,这种以前写很多行现在只要一行的方式,被称为解构(Destructuring)。


看了上面的例子,聪慧的妹子们应该就知道大概是个什么意思了吧,下面就是解构常见的用法;

有像这样的:

    let [foo, [[bar], baz]] = [1, [[2], 3]];
    foo // 1
    bar // 2
    baz // 3

以及这样的:

    let [ , , third] = ["foo", "bar", "baz"];
    third // "baz"

还有这样的:

    let [head, ...tail] = [1, 2, 3, 4];//"..."这三个点是ES6里的扩展运算符,意思是将一个数组转为用逗号分隔的参数序列。
    head // 1
    tail // [2, 3, 4]

所以从上面这些例子可以看出:“解构遵循“模式匹配”,只要等号两边的模式或者说是结构相同,左边的变量就会被赋予相对应的值。

PS:
“如果解构不成功,变量的值就等于undefined。”比如:

let [x, y, ...z] = ['a'];
    x // "a"
    y // undefined
    z // []”

结构可以设定默认值:

    [x, y = 'b'] = ['a']; // x='a', y='b'
    [x, y = 'b'] = ['a', undefined]; // x='a', y='b'

当某一个值严格等于(===)undefined时,默认值会自动生效;


对象解构

由于对象与数组不同,对象的属性们可是不分先后的,所以变量名必须与对象的属性名相同;

对象的解构其实是:先找到同名属性,再赋值给对应变量

一个例子:

    var { foo: baz } = { foo: "aaa", bar: "bbb" };
    baz // "aaa"
    foo // error: foo is not defined

上面代码中,真正被赋值的是变量baz,而不是模式foo


forEach()与解构;

forEach() 方法用于调用数组的每个元素,并将元素传递给回调函数;
语法:

    array.forEach(function(Value, index, arr), thisValue);

例子:

    var sum = 0;

    [1, 2, 3, 4].forEach(function (item, index, array) {
      sum += item;
    });

    alert(sum); // 10

与解构配合天衣无缝:

    let items = [ ['foo', 3], ['bar', 9] ];
    items.forEach(([word, count]) => console.log(word+' '+count));

上面等于:

    let items = [ ['foo', 3], ['bar', 9] ];
    items.forEach(({word: w, count: c}) => console.log(w+' '+c));

ps:ES6的for-of循环语句中也可以使用解构:

    let items = [ ['foo', 3], ['bar', 9] ];
    for ([word, count] of items) {
    console.log(word+' '+count);
}