欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

ES6快速入门第一章------解构赋值(可私信解惑)

程序员文章站 2022-07-16 21:57:09
...

概念

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构赋值。

如下面变量赋值

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

在ES6语法中可以写为

var [a,b,c]=[1,2,3];    // 等号两边的模式相同

如果解构不成功,变量的值就等于undefined。

如果等号的右边不是数组(不是可遍历的结构),将会报错。

解构赋值不仅适用于var命令,也适用于let和const命令。

var [foo, [[bar], baz]] = [1, [[2], 3]];    //可以嵌套
foo // 1
bar // 2
baz // 3
var [ , , third] = ["foo", "bar", "baz"];    // 可以忽略
third // "baz"
var [x, , y] = [1, 2, 3];
x // 1
y // 3
var [head, ...tail] = [1, 2, 3, 4];    // ... 表示剩余运算符
head // 1
tail // [2, 3, 4]
var  [x, y, ...z] = ['a'];
x // "a"
y // undefined
z // []

设置默认值

解构赋值允许指定默认值。当等式右边没值或是undefined时,使用默认值。

语法    let [变量=默认值]=[赋值]

let [num=2]=[];    // 输出为2
let [num1,num2=10]=[5];     //输出 num1为5, num2为10
let [x = 1, y = x] = [];     // x=1; y=1
let [x = 1, y = x] = [2];    // x=2; y=2
let [x = 1, y = x] = [1, 2];     // x=1; y=2
let [x = y, y = 1] = [];     // 报错,因为x用到默认值y时,y还没有声明
[x, y = 'b'] = ['a', undefined];  

对象的解构赋值

解构不仅可以用于数组,还可以用于对象。

 var { name, age } = { name: "sss", bar: "12" };    // name:sss ,age:12

注意变量必须与属性同名,才能取到正确的值,位置顺序没关系。

 

如果变量名与属性名不一致,必须写成下面这样:

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

let obj = { first: 'hello', last: 'world' };
let { first: a, last: b } = obj;        //a的值为hello,b的值为world

这说明对象的解构赋值是下面的简写

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

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

 

字符串的解构赋值

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

  let [a, b, c, d] = 'nice';     // a为n,b为i,c为c,d为e

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

let {length : name} = 'hello'; 
console.log(name)        // len:5

函数参数的解构赋值

函数的参数也可以使用解构赋值。

function add([x, y]){

  return x + y;

}

add([1, 2]);     // 3

上面代码中,函数add的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量x和y。对于函数内部的代码来说,它们接收的参数就是x和y。

 

函数参数的解构也可以使用默认值。

function move({x = 1, y = 2} = {}) {    // 默认参数 x=1,y=2

  return [x, y];
}

move({x: 3, y: 8});     // [3, 8]
move({x: 3});     // [3, 2]
move({});     // [1, 2]
move();     // [1, 2]

上面代码中,函数move的参数是一个对象,通过对这个对象进行解构,得到变量x和y的值。如果解构失败,x和y等于默认值。

不能使用圆括号的情况

ES6的规则,只要有可能导致解构的歧义,就不得使用圆括号。因此,建议只要有可能,就不要在解构中放置圆括号。

不能使用圆括号的情况

  • 变量声明语句中,不能带有圆括号。
 // 全部报错
var [(a)] = [1];
var {a: (c)} = {};
var ({a: c}) = {};
var {(a: c)} = {};
var {(a): c} = {};
  • 函数参数中,模式不能带有圆括号。
function f([(a)]) { return a; }        // 报错
  • 赋值语句中,不能将整个模式或嵌套模式中的一层,放在圆括号之中。
 // 全部报错
({ a: b}) = { a: 42 };
([a]) = [5];

 

解构赋值的使用场景

  • 交换变量的值
[x, y] = [y, x];
  • 方便从函数取值
 function func() {

  return [1, 2, 3];
}

var [a, b, c] = func();
  • 函数参数的定义
// 参数是一组无次序的值
function f({x, y, z}) { ... }

f({z: 1, y: 2, x: 3});
  • 提取JSON数据
var jsonData = {
  id: 12,
  name: "sss",
  data: [867, 5309]
};

let { id, name, data: number } = jsonData;
  • 函数默认参数值 
function move({x = 1, y = 2} = {}) { // 默认值

  return [x, y];
}

move({x: 3});     //   y使用默认值,x:3, y:2

第二章:ES6快速入门第二章------let和const(可私信解惑)