最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • ES6-解构赋值-上

    正文概述 掘金(Name_Is_NaN)   2021-01-09   364

    1.数组的解构赋值

    1.1基本用法

    let [a,b,c] = [1,2,3] 
    
    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]; //结合扩展运算符
    head // 1
    tail // [2, 3, 4]
    
    let [x, y, ...z] = ['a'];
    x // "a"
    y // undefined
    z // []
    

    其实并不只是数组可以解构赋值,只要具有Iterator接口的,都可以实现解构赋值,如下:

    // 使用ES6 yeild 实现 斐波那契数列
    function* fibs() {
      let a = 0;
      let b = 1;
      while (true) {
        yield a;
        [a, b] = [b, a + b];
      }
    }
    
    let [first, second, third, fourth, fifth, sixth] = fibs();
    sixth // 5
    

    1.2默认值

    解构赋值可以允许指定默认值

    let [foo = true] = [];
    foo // true
    
    let [x, y = 'b'] = ['a']; // x='a', y='b'
    let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'
    
    let [x = 1] = [undefined];
    x // 1
    
    let [x = 1] = [null];
    x // null
    

    上述第二个未生效的原因是: null != undefiend

    另外注意,默认值表达式为惰性求值,如下:

    function f() {
      console.log('若被默认赋值,则执行f函数并输出该行文字');
    }
    
    let [x = f()] = [1];
    
    //控制台无输出
    

    在这种情况下,因为一开始x就能取值,所以f根本就不会执行。

    另外 默认值可以引用解构赋值的其他变量,但该变量必须已经被声明。

    2.对象的解构赋值

    2.1基础的对象解构赋值

    注意

    对于对象的解构赋值,等号的右侧 必须有和左侧对应的key-value 形式

    如下图所示

    ![image-20200707144027174](/Users/chenlei/Library/Application Support/typora-user-images/image-20200707144027174.png)

    对方法的赋值 同理

    ![image-20200707144100039](/Users/chenlei/Library/Application Support/typora-user-images/image-20200707144100039.png)

    最基础的对象解构

    let { foo, bar } = { foo: 'aaa', bar: 'bbb' };
    foo // "aaa"
    bar // "bbb"
    

    数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

    同时,对象解构 也可以很方便的将现有的方法进行赋值。

    // 例一
    let { log, sin, cos } = Math; // 将Math方法赋值给log sin cos 三个变量
    
    // 例二
    const { log } = console;
    log('hello') // hello
    

    特殊情况,如果需要变量名和属性名不一致的情况,可以按照如下方式写。

    let { foo: baz } = { foo: 'aaa', bar: 'bbb' };  // 注意:此时foo是匹配模式,baz才是变量,真正被赋值的是baz
    baz // "aaa"
    
    let obj = { first: 'hello', last: 'world' };
    let { first: f, last: l } = obj;
    f // 'hello'
    l // 'world'
    

    另外,复杂的嵌套对象也可以通过解构来进行实现,如下

    let obj = {
      p: [
        'Hello',
        { y: 'World' }
      ]
    };
    
    let { p: [x, { y }] } = obj;  // 此种情况下p不会作为变量被赋值
    x // "Hello"
    y // "World"
    
    let {p,p: [x,{y}]} = obj 
    x // "Hello"
    y // "World"
    p // ["Hello,{y: "World"}"]
    

    一个复杂的 嵌套赋值的例子

    let obj = {};
    let arr = [];
    
    ({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true });
    
    obj // {prop:123}
    arr // [true]
    

    另外,在进行对象的解构赋值时候,是可以取到继承的属性的。

    const obj1 = {};
    const obj2 = { foo: 'bar' };
    Object.setPrototypeOf(obj1, obj2);
    
    const { foo } = obj1;
    foo // "bar"
    

    2.2对象赋值默认值设定

    var {x = 3} = {};
    x // 3
    
    var {x, y = 5} = {x: 1};
    x // 1
    y // 5
    
    var {x: y = 3} = {};
    y // 3
    
    var {x: y = 3} = {x: 5};
    y // 5
    
    var { message: msg = 'Something went wrong' } = {};
    msg // "Something went wrong"
    

    默认值生效的条件为: 对象的属性值严格等于(===)undefind

    var {x = 3} = {x: undefined};
    x // 3
    
    var {x = 3} = {x: null};
    x // null
    

    2.3注意点

    如果要将一个已经声明的变量用于解构赋值,必须非常小心。

    // 错误的写法
    let x;
    {x} = {x: 1};
    // SyntaxError: syntax error
    

    上面代码的写法会报错,因为 JavaScript 引擎会将{x}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。

    // 正确的写法
    let x;
    ({x} = {x: 1});
    

    上面代码将整个解构赋值语句,放在一个圆括号里面,就可以正确执行。关于圆括号与解构赋值的关系,参见下文。

    (2)解构赋值允许等号左边的模式之中,不放置任何变量名。因此,可以写出非常古怪的赋值表达式。

    ({} = [true, false]);
    ({} = 'abc');
    ({} = []);
    

    上面的表达式虽然毫无意义,但是语法是合法的,可以执行。

    (3)由于数组本质是特殊的对象,因此可以对数组进行对象属性的解构。

    let arr = [1, 2, 3];
    let {0 : first, [arr.length - 1] : last} = arr;
    first // 1
    last // 3
    

    上面代码对数组进行对象解构。数组arr0键对应的值是1[arr.length - 1]就是2键,对应的值是3。方括号这种写法,属于“属性名表达式”(参见《对象的扩展》一章)。

    3.字符串的解构赋值

    字符串也可以解构赋值。这是因为此时,字符串被转换成了一个类似数组的对象。

    const [a, b, c, d, e] = 'hello';
    a // "h"
    b // "e"
    c // "l"
    d // "l"
    e // "o"
    

    类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。

    let {length : len} = 'hello';
    len // 5
    

    起源地下载网 » ES6-解构赋值-上

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元