ES6精解:变量的解构赋值

1.数组的解构赋值

我们知道以前我们给一个变量赋值要这样如下:


let a = 1;
let b = 2;
let c = 3;

但是ES6出来之后,我们可以这样:


let [a, b, c] = [1, 2, 3]

以上就是从数组中提起值,一一对应赋值,a、b、c分别为1、2、3


 let [aa, [[bb], cc]] = [1, [[2], 3]]

aa,bb,cc分别对应1,2,3


     let [,,d] = [10, 20, 30];
     console.log(d);

d的值为30


  let [e, ...f] = [1, 2, 3, 4, 5];

e为1, f为[2,3,4,5]


let [x, y, ...z] = [1];

x为1,y为undefined,z为[],如果没有对应值会等于undefined

解构赋值也允许默认值, 如下:


let [ x = '默认值'] = [];

x的值为默认值


  let [ a = 123 ] = [ undefined ];
  let [ b = 321 ] = [ null ];

a的值为123,b的值为321,因为ES6中是严格遵循(===),所以只有当数组对应的值为undefined的时候,才能等于默认值

默认值可以引用解构赋值的其他变量,但是这个变量必须得声明过的,如下:


 let [ a = 0, b = a] = [];

这里a、b分别为0,0

但是如果这个变量没有声明,就会报错,如下:


  let [ a = b, b = 1] = [];

这里就会报错:Uncaught ReferenceError: b is not defined

2.对象的解构赋值


 let { a, b } = { a: 1, b: 2 };

a,b的值为1,2

对象解构赋值可以无需按照顺序一一对应,但是括号两边的变量名称和属性名称要相同,才能取到正确值


let { a, b } = { a: 1, c : 2};

a为1,b为undefined,这里b在右边括号中没有对应的属性值与其对应,所以此时b为undefined

如果变量名和属性名不一样,则要按照如下写:


 let { aa: fa, bb: fb } = { aa: 1, bb: 2 };

fa为1,fb为2

这里可以说明,对象解构赋值实际上是如下的简写:


let { aa: aa, bb: bb } = { aa: 1, bb: 2}

也就是说,对象的解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而不是前者。


 let { aa: fa } = { aa: 1 }

 //fa为 1
 //aa为 Uncaught ReferenceError: aa is not defined

这里就说明了,fa是真正被赋值的,此时的aa是模式而不是变量,如果你要让aa为变量,则如下:


  {
       let { aa: fa, aa } = { aa: 1 };
       // aa 为 1
       // fa 为 1
     }

此时aa为1,bb为1,此时aa就是变量了

当然对象也可以多层嵌套如下:


   {
        let obj = {
          p: [1, { y: 2 }]
        }

        let { p: [x, { y }]} = obj;
        console.log(x); // 1
        console.log(y); // 2
      }

   {
        let obj = {};
        let arr = [];
        ({a: obj.name, b: arr[0] } = { a: 321, b: 123});

        console.log(obj); // { name: 321 }
        console.log(arr); // [123]
      }

对象解构默认值:


  {
         let { x = 1 } = {};
         console.log(x); //1
       }

       {
         let { x : y = 4 } = {};
         console.log(y); //4
       }

       {
        let { x : y = 4 } = { x: 5};
         console.log(y); //5
       }

默认属性生效条件必须是对象的属性严格等于undefined,如果是null就不会生效,如下:


   {
      let { x = 1 } = { x : null};
      console.log(x); //null
   }

已声明的变量解构赋值:


  {
    let x;
    ({ x } = { x : 1 });
    console.log(1); // 1
  }

得要加个小括号才可以,否则会报错;

数组对应对象属性的解构:


   {
     let arr = [1, 2, 3];
     let  { 0 : one, [arr.length-1] : three } = arr;
     console.log(one); // 1
     console.log(three); // 3
   }

3.字符串的解构赋值

字符串也可以解构赋值,因为字符串可以转换成一个类似数组的对象


  {
      let [a, b, c, d] = 'hero';

      console.log(a); //h
      console.log(b); //e
      console.log(c); //r
      console.log(d); //o
    }

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


  {
    let { length: len } = 'hero';
    console.log(len); // 4
  }

4.数值和布尔值的解构赋值

解构赋值时,如果等号右边是数值或者布尔值时,则会先转换成对象


 {
    let { toString: s } = 123;
    console.log(s === Number.prototype.toString); //true
  }

   {
    let { toString: s } = true;
    console.log(s === Boolean.prototype.toString); //true
  }

解构赋值的规则:如果等号右边的值不是对象或者数组则会先转为对象,由于undefined和null无法转为对象,所以无法对它们进行解构赋值,会报错,如下:


{
    let { props: x} = undefined; //报错
    let { props: y} = null; //报错
}

5.函数参数的解构赋值


{
  const arr = [[1,2],[3,4]].map(([a, b])=> a+b);
  console.log(arr); //[3,7]
}

函数参数默认值:


function func({x = 0, y = 0} = {}) {
  return [x, y];
}

console.log(func({x:5,y:6})); //[5,6]
console.log(func({x:5})); //[5,0]
console.log(func({})); //[0, 0]
console.log(func()); //[0, 0]

如果按照以下定义就不同了,如下:


function fn({x, y} = { x: 1, y: 2}) {
  return [x, y];
}
console.log(fn({ x: 11, y: 22})); // [11, 22]
console.log(fn({ x: 11 })); // [11, undefined]
console.log(fn({})); // [undefined, undefined]
console.log(fn()); // [1, 2]

undefined会触发函数参数的默认值,如下:


{
  const a = [1, undefined, 3].map((x = 'noundefine') => x);
  console.log(a); //[1, "noundefine", 3]
}

6.圆括号问题

圆括号只能一种情况才能使用:赋值语句的非模式部分,可以使用圆括号


[(b)] = [3]; // 正确
({ p: (d) } = {}); // 正确
[(parseInt.prop)] = [3]; // 正确

上面三行语句都可以正确执行,因为首先它们都是赋值语句,而不是声明语句;其次它们的圆括号都不属于模式的一部分。第一行语句中,模式是取数组的第一个成员,跟圆括号无关;第二行语句中,模式是p,而不是d;第三行语句与第一行语句的性质一致。

本文参考链接:http://es6.ruanyifeng.com/#do...
主要是看了阮一峰老师的文章,自己整理了一下,供后期自己看笔记用的

来源:https://segmentfault.com/a/1190000017416618

原文地址:https://www.cnblogs.com/datiangou/p/10158886.html

时间: 2024-08-03 14:17:23

ES6精解:变量的解构赋值的相关文章

ES6学习之变量的解构赋值

前言:什么是ES6?ECMAScript 6(简称ES6)是JavaScript语言的下一代标准,已经在2015年6月正式发布了.其中相比较于ES5新增了诸多的特性,并且ES6可转换为ES5的语法.->在线ES6转换为ES5工具. 本系列学习随笔参考了阮一峰老师的<ES6标准入门>. 一.解构赋值简述 在学习ES6之前,如果我们要从一个数组将值取出来,我们要如何去做? let arr=[1,2,3]; let a=arr[0]; let b=arr[1]; let c=arr[2]; 是

JavaScript学习笔记 -- ES6学习(三) 变量的解构赋值

1.解构赋值的定义 在ES6中,允许按照一定模式,从数组和对象中提取值(所谓解构),然后对变量进行赋值. var a = 1; var b = 2; var c = 3; //等价于 var [a, b, c] = [1, 2, 3]; 如果解构不成功,对应的变量就会赋值undefined. let [x, y, ...z] = ['a']; x // "a" y // undefined z // [] 另一种情况是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组.这种情况

ES6入门之变量的解构赋值(二)

前言 在上一章 ES6入门之let和const命令中我们对ES6的相关语法已经有了初步了解,上一章中我们主要学习了三大部分的内容,let命令的使用,块级作用域,const命令的使用,那么从本篇博客将进一步深入了解ES6中的相关语法,毕竟未来ES6是主流. 本章目标 学会数组的解构赋值 学会对象的解构赋值 学会字符串的解构赋值 学会数值和布尔值的解构赋值 学会函数参数的解构赋值 学会解构赋值的用途 本人对解构赋值的理解:模式匹配,匹配成功获取值,匹配不成功则为undefined,好比开心消消乐一样

ES6系列二 变量的解构赋值

一丶数组的解构赋值 1.完全解构 let [foo, bar] = [1, 2]; foo // 1 bar // 2 2.不完全解构,但是解构一样成功 let [foo, bar] = [1]; foo // 1 bar // undedefined 二丶对象的结构赋值 1.完全解构 let { foo, bar } = { foo: "aaa", bar: "bbb" }; foo // "aaa" bar // "bbb"

es6 变量的解构赋值

一.数组的解构赋值 数组解构赋值,索引很重要,即顺序很重要 1.解构[1,2,3] //把1,2,3分别赋值给a,b,c var [a,b,c]=[1,2,3]; console.log(a+' | '+b+' | '+c);//1 | 2 | 3 2.更复杂,更强大的赋值,解构[1,[2,3]] //把1,2,3分别赋值给a,b,c var [a,[b,c]]=[1,[2,3]]; console.log(a+' | '+b+' | '+c);//1 | 2 | 3 3.跳着赋值 //把1赋值

es6分享——变量的解构赋值

变量的解构赋值:ES6 允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring). 以前的写法: var a = 1; var b = 2; es6允许的写法: let [a,b] = [1,2]; 一般用途: 1.交换变量的值 [x,y] = [y,x]; 2.函数返回多个值 function f1() { return [1,2,3]; } var [a,b,c] = f1(); // 返回json对象: function f1() { return

《ES6标准入门》10~28Page let和const命令 变量的解构赋值

1.let和const命令 (1)let命令 let命令类似于ES3中的var命令,但是所声明的变量只在let所在的代码块内有效. 1 { 2 let a = 10; 3 var b = 1; 4 } 5 6 console.log(a); //报错 7 console.log(b); //1 let相较var来讲有三个特殊性质,分别是不存在变量提升.暂时性死区和不允许重复声明. 1 //不存在变量提升 2 console.log(a); //报错 3 let a = 1; 4 5 //你无法在

ES6:变量的解构赋值

1.数组的解构赋值 基本用法: ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring).  以前,为变量赋值,只能直接指定值. var a = 1; var b = 2; var c = 3; ES6允许这样写: var [a,b,c] = [1,2,3]; console.log(a); //1 console.log(b); //2 console.log(c); //3 上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值. 本质上,

es6变量解构赋值的用途

这里是我觉得es6解构赋值,在平时我们写js的时候非常有用,而且经常用到的地方,能简化我们的代码,让写代码简介优雅易读; 用途 1.交换变量的值,太方便了这逼,写法不仅简介而且一看就明白 let [x,y]=[1,2]; [x,y]=[y,x]; console.log(x);//输出2 console.log(y);//输出1 2.从函数返回多个值 函数只能返回一个值,如果要返回多个值,只能将它们放在数组或者对象里面返回.有了解构赋值,取出这些值那是非常的方便,最关键是易读 function