首页 > 编程笔记 > JavaScript笔记
阅读:14
ES6解构赋值(数组和对象,附带实例)
解构表示对数据结构进行分解,赋值指为变量赋值。在 ES6 中,允许按照一一对应的方式,从数组或对象中提取值,然后将提取出来的值赋给变量。
解构赋值的优点是它可以让编写的代码简洁易读,语义更加清晰,并且可以方便地从数组或对象中提取值。
另一种情况是不完全解构,即等号左边的变量只匹配等号右边的部分数组。这种情况下,解构依然可以成功:
【实例】交换变量的值。
第 5 行代码使用解构赋值交换变量 x 和 y 的值,这样的写法不仅简洁,而且易读,语义非常清晰。
函数如果要返回多个值,可以将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。
【实例】提取函数返回的多个值。
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
【实例】提取JSON数据。
解构赋值的优点是它可以让编写的代码简洁易读,语义更加清晰,并且可以方便地从数组或对象中提取值。
ES6数组的解构赋值
ES6 以前,为变量赋值只能直接指定值。let a = 1; let b = 2; let c = 3;ES6允许写成下面这样:
let [a, b, c] = [1, 2, 3];上面代码表示,可以从数组中提取值,按照对应位置对变量赋值。本质上,这种写法属于“模式匹配”,只要等号两边的模式相同,左边的变量就会被赋予对应的值。
另一种情况是不完全解构,即等号左边的变量只匹配等号右边的部分数组。这种情况下,解构依然可以成功:
let [x, y] = [1, 2, 3];//x=1,y=2如果解构不成功,变量的值就等于 undefined。
let [foo] = []; let [bar, foo] = [1];以上两种情况都属于解构不成功,foo 的值都会等于 undefined。
【实例】交换变量的值。
<script> let x = 1; let y = 2; console.log('交换前 x=' + x + ',y=' + y); [x, y] = [y, x]; console.log('交换后 x=' + x + ',y=' + y); </script>
第 5 行代码使用解构赋值交换变量 x 和 y 的值,这样的写法不仅简洁,而且易读,语义非常清晰。
函数如果要返回多个值,可以将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。
【实例】提取函数返回的多个值。
<script> function example() { return [1, 2, 3]; } let [a, b, c] = example(); console.log(a, b, c); </script>第 5 行代码使用解构赋值取出函数返回的多个值。
ES6对象的解构赋值
对象的解构赋值,是先找到同名属性,然后赋给对应的变量。let { foo, bar } = { foo: 'aaa', bar: 'bbb' }; console.log(foo); // "aaa" console.log(bar); // "bbb"在上面代码中,变量 foo 和 bar 分别取对象的属性 foo 和 bar 的值。
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
let { bar, foo } = { foo: 'aaa', bar: 'bbb' }; console.log(foo); // "aaa" console.log(bar); // "bbb"在上面代码中,等号左边的两个变量的次序,与等号右边两个同名属性的次序不一致,但是对取值完全没有影响。
let { baz } = { foo: 'aaa', bar: 'bbb' }; console.log(bar); // undefined在上面代码中,变量baz没有对应的同名属性,导致解构失败,取不到值,最后等于undefined。
【实例】提取JSON数据。
let jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data } = jsonData; console.log(id, status, data); // 42 "OK" [867, 5309]第 7 行代码使用对象解构赋值,可以快速提取JSON数据的值。