美文网首页ES6标准入门
Z03_变量的解构赋值

Z03_变量的解构赋值

作者: Eastboat | 来源:发表于2020-01-03 00:55 被阅读0次

变量的解构赋值

数组的解构赋值

ES 中从数组和对象之中提取数值,对变量进行赋值,这个过程称为解构

let [a, b, c] = [1, 2, 3];
console.log(a, b, c);

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

let [foo] = [];
console.log(foo); //undefined

1. 对于 Set 解构也可以使用数组的解构赋值

let setData = new Set();
setData.add(1, 2);
setData.add(2);
console.log(setData); //[1,2]

let [x1, x2, x3] = new Set([1, 2]);
console.log(x1, x2, x3); //[1,2,undefined]

2. 事实上,只要某种数据结构具有 Iteator 解构,都可以采用数组的形式进行解构赋值

3. 默认值

let [x = 1, y = 2] = ["第一个值", "第二个值"];
console.log(x, y); //第一个值 第二个值

let [a = 1, b = 2] = [];
console.log(a, b); //1,2

4. ES6 内部使用严格相等运算符,判断一个位置是否有值,所以,如果一个数组的成员不严格等于 undefined,默认值是不会生效的

//数组中成员是null,默认值就不会生效,因为null不等于undefined
let [z = "z", v = "v"] = [undefined, null];
console.log(z, v); // z , null

5. 如果默认值是一个函数表达式,那么这个表达式是惰性求值的,即只有用到的时候,才会求值

function fn() {
  console.log("this is a function!!! ");
}
let [x = fn()] = [1];

//因为x能取到值,所以函数fn根本不会执行
console.log(x); //1

上面代码等价于

let x;
if ([1][0] === undefined) {
  x = fn();
} else {
  x = [1][0];
}

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

let [a = 10, b = a] = [];
console.log(a, 10);

let [a1 = 30, b1 = a1] = [2];
console.log(a1, b1); //[2]
let [c = 10, d = c] = [undefined, 20];
console.log(c, d); //10,20

对象的解构赋值

与数组不同的是

  1. 数组解构是根据次序排列的,变量的位置由他的位置决定的
  2. 对象的属性没有次序,变量名必须与属性同名才能获取到正确的值
const obj = {
  name: "Eastboat",
  age: 18,
  address: "上海市"
};

let { name, age, address: add } = obj;
console.log(name, age, add);

1. 如果变量名和属性名不一致,必须写成这样

let { foo:f } = { foo: "aaa", bar: "bbb" };
console.log(f, bar); // 'aaa','bbb'

//实际说明了对象的解构赋值是以下形式的简写

let {foo:foo,bar:bar}= {foo:"aaa",bar:"bbb}

2. 和数组一样,解构也可用于嵌套结构的对象

let obj = {
  parent: "ul",
  children: [
    "child",
    {
      name: "li"
    }
  ]
};

let {
  parent: a,
  children,
  children: [b, { name: c }]
} = obj;
console.log(a); /// ul
console.log(children); //[ 'child', { name: 'li' } ]
console.log(b); // child
console.log(c); // li

3. 嵌套赋值

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

对象的解构赋值可以很方便的把现有的对象的方法赋值到某个变量

let { log, sin, cos } = Math;

字符串的解构赋值

const str = "weclome";
let [a, b, c, d, e] = str;
console.log(a, b, c, d, e); //w e c l o

let { length: len } = str;
console.log(len); //7

数组和布尔值的解构赋值

1. 解构赋值时,如果等号右边是数值和布尔值,则会先转换为对象

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

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

//数组和布尔值的包装对象都有toString属性,因此变量s能取到值

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象,由于 undefined 和 null 无法转换为对象,所以对他们进行解构赋值时都会报错

let { prop: x } = undefined; //TyprError
let { prop: y } = null; //TyprError

函数参数的解构赋值

function add([x, y]) {
  return x * y;
}
console.log(add([2, 4])); //8

[
  [1, 2],
  [3, 4]
].map(([a, b]) => a + b); // [3,7]
  1. 函数参数的解构也可以使用默认值
function move({ x = 0, y = 0 } = {}) {
  return [x, y];
}
console.log(move({ x: 3 })); //[3,0]
console.log(move({})); //[0,0]
console.log(move()); //[0,0]
  1. 必须为变量指定默认值,而不是为参数指定默认值
function move2({ x, y } = { x: 0, y: 1 }) {
  return [x, y];
}
console.log(move2({ x: 3 })); //[3,undefined]
console.log(move2({})); //[undefined,undefined]
  1. undefined 会触发函数参数的默认值
[1, undefined, 3].map((x = "默认值") => x); // [1,'默认值',3]

圆括号问题

  1. 不可以使用圆括号的情况
变量声明语句
函数参数
赋值语句的模式

2.可以使用圆括号的情况只有一种:赋值语句的非模式部分可以使用圆括号

[a] = [3](({ p: d } = {}));

变量解构赋值的用途

1.交换变量的值

2.从函数返回多个值

function func() {
  return [1, 2, 3];
}
function func2() {
  return {
    foo: 1,
    bar: 2
  };
}

let [a, b, c] = func();
let { foo, bar } = func2();

3.函数参数的定义

//解构赋值可以将一组参数与变量名对应起来
function func([x, y, z]) {}
func([1, 2, 3]);

function func2({ x, y, z }) {}
func2({ x: 1, y: 2, z: 3 });

4.提取 JSON 数据(重要)

let jsonDate = {
  id: 1,
  status: "ok",
  data: [1, 2, 3]
};

let { id, status, data: number } = jsonData;

5.函数参数的默认值

6.变量 Map 解构

let map = new Map();
map.set("name", "cc");
map.set("age", 19);
for (let [key, value] of map) {
  console.log(key, value);
}
/*
name cc
age 19
*/

//只获取键名

for (let [key] of map) {
  console.log(key);
}

//只获取键值
for (let [, value] of map) {
  console.log(key);
}

7.输入模块的指定方法

加载模块时,往往需要指定输入的方法,解构赋值使得输入语句非常清晰

const [SourceMapConsumer, SourceNode] = require("source-map");

相关文章

  • Z03_变量的解构赋值

    变量的解构赋值 数组的解构赋值 ES 中从数组和对象之中提取数值,对变量进行赋值,这个过程称为解构 1. 对于 S...

  • 解构赋值

    解构赋值:ES6 中新增了变量赋值的方式,从数组和对象中提取值,对变量进行赋值。 单独赋值给变量,解构赋值。 解构...

  • ES6笔记(解构赋值)

    ES6笔记(解构赋值) 解构赋值 变量的解构: 解构赋值允许指定默认值。 解构赋值必须保证赋值方 被赋值方类型一...

  • 变量的解构赋值

    数组的解构赋值: 解构,就是从数组和对象中提取值,然后对变量进行赋值 解构赋值: 解构不成功,变量的值就等于und...

  • ES6系列之变量的解构赋值

    本篇目录: 数组的解构赋值变量声明并赋值时的解构变量先声明后赋值时的解构不完全解构默认值交换变量解析一个从函数返回...

  • 解构赋值

    解构赋值 数组的解构赋值 嵌套,默认值,展开符 对象的解构赋值 对象解构赋值的本质与简写 对象解构的模式与变量 对...

  • 『ES6脚丫系列』变量的解构赋值

    『ES6脚丫系列』变量的解构赋值 第一章:变量的解构赋值的概念 【01】Q:什么是变量的解构赋值?有哪些方式? 吃...

  • ES6的解构赋值

    一、前言 什么是“解构赋值”呢?就是从数组或者对象中取值,对变量进行赋值,这就是变量的解构赋值。 二、数组的解构赋...

  • 名词

    1 解构: 从数组或对象中提取值,给变量赋值这被称为解构解构赋值的变量都会重新声明解构赋值的规则是,只要等号右边的...

  • 变量的解构赋值 - 字符串、数值、布尔值、函数参数

    一、字符串的解构赋值 二、数值和布尔值的解构赋值 三、函数参数的解构赋值 变量的解构赋值 - 数组篇[https:...

网友评论

    本文标题:Z03_变量的解构赋值

    本文链接:https://www.haomeiwen.com/subject/yqbaoctx.html