资讯专栏INFORMATION COLUMN

ECMAScript6 新特性——“变量的解构赋值”

Eric / 1380人阅读

摘要:数组的解构赋值允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。如果变量名与属性名不一致,必须写成下面这样。

1 数组的解构赋值

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

基本用法

{
    var [a,[b,c],d,,...f] = [1,[2,3],4,5,6,7];
    console.log(a); //1
    console.log(b); //2
    console.log(c); //3
    console.log(d); //4
    console.log(f); //[6,7]
}

另一种情况是不完全解构,解构赋值不仅适用于var命令,也适用于let和const命令

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

默认值

解构赋值允许指定默认值,必须严格等于undefined时才会生效

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

如果默认值是一个表达式,那么这个表达式是默认求值的

let [a = f()] = [undefined];
function f() {
    return 2;
}
console.log(a); //2如果不是undefined,f()不会求值
2 对象的解构赋值

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

let {a,b} = {a: 1, b:2}
console.log(a,b); //1 2

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

let {a:a2,b} = {a: 1, b:2}
console.log(a2,b); //1 2

对于let、const而言,变量不能重新声明,所以一旦赋值的变量之前声明过,则会报错

let a2
let {a:a2,b} = {a: 1, b:2}
console.log(a2,b); //Identifier "a2" has already been declared

所以需要写成下面的形式:

let a2
({a:a2,b} = {a: 1, b:2})
console.log(a2,b); //1 2

这里需要加上小括弧,因为要避免JS引擎将{x}理解为一个代码块

也可以用于嵌套解构的对象

var obj = {
    persion: [
        {name: "Oliver"},
        {friends: ["Alice", "Troy"]}
    ]
}
var {persion: [{name},{friends}]} = obj;
console.log(name,friends); //Oliver ["Alice", "Troy"]

对象的解构也可以指定默认值

var {prop:x = 3} = {prop:undefined};
console.log(x); //3

默认值生效的条件是对象的属性值严格等于undefined

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

var obj = {
    name: "Oliver",
    age: 18
};
var {name,age: x} = obj;
console.log(name,x); //Oliver 18
3 字符串的解构赋值

字符串也可以解构赋值

var {string: [a,b,c]} = {string: "str"};
console.log(a,b,c); //s t r

也可以访问其属性

var {length: len} = "hello";
console.log(len); //5
4 数值和布尔值的解构赋值

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

let {toString: str} = 123;
console.log(str); //toString() { [native code] }
//两者都有toString方法(函数)
5 函数参数的解构赋值

函数的参数也可以解构赋值

function add([x,y]) {
    console.log(x+y);
}
add([1,2]); //3

也可以使用默认值

function add([x,y] = [0,0]) {
    console.log(x+y);
}
add([1,2]); //3
add(); //0
6 圆括号问题

尽量不要在模式中使用圆括号

7 实际用途

交换变量的值

var [x,y] = [1,2];
[x,y] = [y,x];
console.log(x,y); //2 1

从函数返回多个值

//返回数组
function init() {
    return [1,2,3];
}
var [a,b,c] = init();
console.log(a,b,c); //1 2 3

//返回对象
function init() {
    return {
        name: "Oliver",
        age: 18
    };
}
var {name: n, age: a} = init();
console.log(n,a); //Oliver 18
var {name} = init();
console.log(name); //Oliver

函数参数的定义

//有序的数组
function init([x,y,z]) {
    return x+y+z;
}
console.log(init([1,2,3])); //6

//无序的对象
function init({x,y,z}) {
    return x+y+z;
}
console.log(init({z:1,y:2,x:3})); //6

提取JSON数据

var obj = {};
var jsonData = {
    name: "Oliver",
    id: "007",
    upload: [1,2,3]
};
{
    let {name,id,upload} = jsonData;
    console.log(name,id,upload); //Oliver 007 [1, 2, 3]
}

函数参数默认值

function f([x,y] = [1,1]) {
    console.log(x+y);
}
f(); //2

遍历Map结构

var map = new Map();
map.set("first", "hello");
map.set("second", "world");

for (let [key, value] of map) {
  console.log(key + " is " + value);
}
// first is hello
// second is world

输入模块的指定方法

const { SourceMapConsumer, SourceNode } = require("source-map");

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/79059.html

相关文章

  • ECMAScript6标准入门(一)变量与数据结构

    摘要:一简介与的关系是的规格,是的一种实现另外的方言还有和转码器命令行环境安装直接运行代码命令将转换成命令浏览器环境加入,代码用环境安装,,根目录建立文件加载为的一个钩子设置完文件后,在应用入口加入若有使用,等全局对象及上方法安装 一、ECMAScript6 简介 (1) 与JavaScript的关系 ES是JS的规格,JS是ES的一种实现(另外的ECMAScript方言还有Jscript和...

    Tangpj 评论0 收藏0
  • ES6学习摘要(02)(人学习)

    摘要:默认值同时,对象解构赋值也允许设置默认值,默认值生效的判断条件同数组,只有在对应值严格等于时会生效。报错如果要将一个已经声明的变量用于解构赋值,必须非常小心。的规则是,只要有可能导致解构的歧义,就不得使用圆括号。 ECMAScript6/ES6 入门 let和const命令 四、变量的解构赋值 在ES6之前,数组和对象属性赋值只能直接指定固定值,ES6 允许按照一定模式,从数组和对象中...

    Jonathan Shieber 评论0 收藏0
  • ES6-变量解构赋值(3)

    摘要:数组的解构赋值特点根据数据的下标来赋值的,有次序。模式能够匹配起来,如长度为数值和布尔值的解构赋值解构赋值的规则是只要等号右边的值不是对象或数组,就先将其转为对象。布尔值解构赋值为字符串的一种。在很多独立细小的方面,解构赋值都非常有用。 1、解构赋值简介 官方解释:按照一定的模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。 举个例子,想获取数组中...

    Jason_Geng 评论0 收藏0
  • ES6

    摘要:情况一情况二这两种情况,根据的规定都是非法的。的作用域与命令相同只在声明所在的块级作用域内有效。因此,将一个对象声明为常量必须非常小心。顶层对象的属性与全局变量挂钩,被认为时语言最大的设计败笔之一。 这是ES6的入门篇教程的笔记,网址:链接描述,以下内容中粗体+斜体表示大标题,粗体是小标题,还有一些重点;斜体表示对于自身,还需要下功夫学习的内容。这里面有一些自己的见解,所以若是发现问题...

    AZmake 评论0 收藏0
  • ES6基础

    一、块级作用域 1. var 首先看看ES5中得变量声明方式 if (true) { var a = 2 } console.log(a) // 2 以上代码等同于 var a if (true) { a = 2 } console.log(a) 以上可知 : 在块内部定义变量 变量提升,到函数最顶部 通过var声明的变量,无论在何处声明,均为全局作用域 2.let 和 ...

    BigTomato 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<