关闭

初步探究ES6之解构

标签: 对象javascriptes6解构
738人阅读 评论(0) 收藏 举报
分类:

语法

解构可以使得我们用类似于数组或者对象文本的语法来指定数组的属性或者对象的属性。该语法比传统语法更加简便。

光说可能不好理解,下面看看用传统的方法来表示数组的前三项:

var first = someArray[0];
var second = someArray[1];
var third = someArray[2];

有了解构语法后,我们可以使用下面的语法来完成同样的工作:

var [first, second, third] = someArray;

看起来是不是简单多了。
解构的一般语法格式为:

[ variable1, variable2, ..., variableN ] = array;

我们可以用var,let和const来修饰:

var [ variable1, variable2, ..., variableN ] = array;
let [ variable1, variable2, ..., variableN ] = array;
const [ variable1, variable2, ..., variableN ] = array;

如果不知道let和const,可以看这篇文章

解构还可以满足复杂的结构

var [foo, [[bar], baz]] = [1, [[2], 3]];
console.log(foo);
// 1
console.log(bar);
// 2
console.log(baz);
// 3

不仅如此哦,解构还可以利用剩余参数或者无参数:

var [head, ...tail] = [1, 2, 3, 4];
console.log(tail);
// [2, 3, 4]
var [,,third] = ["foo", "bar", "baz"];
console.log(third);
// "baz"

下面看看解构生成器函数的demo吧:

function* fibs() {
  var a = 0;
  var b = 1;
  while (true) {
    yield a;
    [a, b] = [b, a + b];
  }
}

var [first, second, third, fourth, fifth, sixth] = fibs();
console.log(sixth);
// 5

上面说的都是数组,那么对象呢?对象同样可以解构

var robotA = { name: "Bender" };
var robotB = { name: "Flexo" };

var { name: nameA } = robotA;
var { name: nameB } = robotB;

console.log(nameA);
// "Bender"
console.log(nameB);
// "Flexo"

var { foo, bar } = { foo: "lorem", bar: "ipsum" };
console.log(foo);
// "lorem"
console.log(bar);
// "ipsum"

var complicatedObj = {
  arrayProp: [
    "Zapp",
    { second: "Brannigan" }
  ]
};

var { arrayProp: [first, { second }] } = complicatedObj;

console.log(first);
// "Zapp"
console.log(second);
// "Brannigan"

我们也可以在解构时对变量带上默认值

var [missing = true] = [];
console.log(missing);
// true

var { message: msg = "Something went wrong" } = {};
console.log(msg);
// "Something went wrong"

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

应用

好啦,说了这么半天的语法,大家也应该好奇这个解构虽然看起来比较炫,但实际上能够做些什么呢?毕竟大多数人是搞应用开发的,所以还是对应用更加重视啊。

第一个应用场景就是函数参数的定义。作为开发人员,我们经常要为别的程序员提供api。我们希望他人可以接受作为参数的多个属性的单个对象而不是逼迫他们记住参数的顺序。这个时候就可以用到解构。

function removeBreakpoint({ url, line, column }) {
  // ...
}

再想一想我们用过的jquery中的ajax方法,也可以利用解构来完成:

jQuery.ajax = function (url, {
  async = true,
  beforeSend = noop,
  cache = true,
  complete = noop,
  crossDomain = false,
  global = true,
  // ... more config
}) {
  // ... do stuff
};

这样就避免了一个一个的为属性赋值。

解构还可以配合其他ES6提出的方法一起来使用,比如map

var map = new Map();
map.set(window, "the global");
map.set(document, "the document");

for (var [key, value] of map) {
  console.log(key + " is " + value);
}
// "[object Window] is the global"
// "[object HTMLDocument] is the document"

for (var [key] of map) {
  // ...
}
for (var [,value] of map) {
  // ...
}

解构还有许多应用场景,这里就不一一描述了,总而言之,解构使javascript的语法变得更加简洁也更加富有表现力。

2
0
查看评论

ES6新特性-------解构、参数、模块和记号(续)

六、解构   解构提供了一个方便的地从对象或数组中提取数据的方法,请看下面的例子: 1 2 3 4 5 6 7 //ES6 let [x,y]=[1,2];//x=1,y=2 ...
  • hsany330
  • hsany330
  • 2016-11-30 16:49
  • 341

深入浅出ES6(六):解构 Destructuring

什么是解构赋值? 解构赋值允许你使用类似数组或对象字面量的语法将数组和对象的属性赋给各种变量。这种赋值语法极度简洁,同时还比传统的属性访问方法更为清晰。 通常来说,你很可能这样访问数组中的前三个元素: var first = someArray[0]; var second =...
  • lgh1117
  • lgh1117
  • 2016-04-28 23:08
  • 966

ES6 变量解构赋值的用途

变量的解构赋值
  • web1504
  • web1504
  • 2017-05-15 17:21
  • 561

ES6——Day3(字符串的解构赋值+函数参数解构赋值)

1、字符串也可以进行解构赋值 形成一个类似于“数组”的对象。 案例1-1:简单的字符串(类似于“数组”) const [a,b,c,d,e] ="Hello"; console.log(a); //H console.log(b); //e console.log...
  • zxy9602
  • zxy9602
  • 2017-03-10 18:07
  • 312

ES6学习——新的语法:函数参数解构

解构赋值也可以发生在函数传参的时候,ES6中函数参数的灵活性大大提高了。函数参数的解构既可以用数组形式,也可以用对象形式,先看两个简单的例子: function foo( [ x, y ] ) { trace( x + " " +y ); } foo( [ 1, 2 ]...
  • kittyjie
  • kittyjie
  • 2016-01-01 15:56
  • 6524

ECMAScript6(ES6)标准之解构赋值语法及应用

在七种方案解决JavaScript交换两个变量值的问题中 我写的最后一种方案就是用到了ES6的解构赋值语法[a, b] = [b, a]下面我来详细说明一下什么是解构赋值数组解构基本概念按照一定模式,从数组和对象中提取,对变量进行赋值,称为解构 通过解构我们可以让赋值更优雅便捷// 一般赋值 v...
  • q1056843325
  • q1056843325
  • 2016-12-18 20:53
  • 1901

ECMAScript 6 学习系列课程 (ES6 默认值和解构赋值的使用)

ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构(Destructuring)。对于ES5标准,我们定义一个变量,需要这样写var a = 1; var b = 2; var c = 3;如果用ES6标准,可以写成这样:var [a, b, c] = [1, 2, 3]对于...
  • jiangbo_phd
  • jiangbo_phd
  • 2016-07-12 14:59
  • 1987

ES6学习——新的语法:数组解构(Array Destructuring)

上一篇文章讲了Object的解构,这篇讲一下Array的解构,概念大同小异,只是写法会有一些不同,先看个简单的例子: let [x, y] = ['a', 'b','c']; // x = 'a'; y = 'b' 跟对...
  • kittyjie
  • kittyjie
  • 2015-12-31 10:03
  • 3231

ES6学习——新的语法:对象解构(Object Destructuring)

解构在ES6中应该是一种新的语法,在其他语言中我没怎么见到这种语法,也可以说是赋值操作的另一种形式,因为解构的整个定义都在规范的赋值操作符章节下面,有兴趣的可以看规范的12.14.5。目前浏览器对这个新语法的支持还不是很好,但是Firefox 43已经支持了大部分解构特性,这里我们仍然继续使用Kin...
  • kittyjie
  • kittyjie
  • 2015-12-30 16:55
  • 5595

ES6之——变量的解构赋值

一、数组的结构赋值1>、什么是解构?ES6允许我们队数组和对象中提取值,对变量进行赋值,这被叫做“解构”。 通常我们像下面这样为变量赋值:var a = 1; b = 2; c = 3;但是,ES6允许我们像下面这样做:var [a, b, c] = [1, 2, 3];即从数...
  • u014695532
  • u014695532
  • 2016-07-03 14:01
  • 3023
    个人资料
    • 访问:311721次
    • 积分:4627
    • 等级:
    • 排名:第7504名
    • 原创:146篇
    • 转载:0篇
    • 译文:0篇
    • 评论:86条
    博客专栏