title: 变量的解构赋值

数组的解构赋值

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

let [a, b, c] = [1, 2, 3]

上面代码表示,可以从数组中提取值,按照对应位置,对变量赋值。

注意,let数组里的值,可以是数字、变量、对象、函数等、但无法拿到空格占位。

let [a,b,c,d,,] = [1,"aaa",{name:'sayname'},function(){}];
console.log(a,b,c,d);

Rest参数

  • rest参数只包括那些没有给出名称的参数,arguments包含所有参数;
  • arguments对象不是真正的array,而rest参数是Array的实例,可以直接应用sort, map, forEach, pop等方法;
  • arguments对象拥有一些自己额外的功能。

Rest参数接收函数的多余参数,组成一个数组,放在形参的最后,形式如下:

function func(a, b, ...theArgs) {
    // ...
}

例:剩余参数数组里值的和

var sum = (a,...rest) => {
let rests = 0
for(let i=0;i<rest.length;i++){
    if( isNaN(Number(rest[i])) ){continue}
        rests += Number(rest[i]) ;        
}
//continue(继续)
return rests
}
console.log(`输出:${rests}`)

数组的扩展用 ... 展开

例子:连接两个数组

let arr1 = [1,2,3,4]
let arr2 = [5,6,7,8]
//ES5写法:var arr = arr1.concat(arr2,[9])
var arr = [...arr1,...arr2,9]
console.log(arr)

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

对象的解构赋值

对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。如果变量名与属性名不一致,必须写成下面这样。

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

let obj = { first: 'hello', last: 'world' };
let { first: f, last: l } = obj;
f // 'hello'
l // 'world'

例子:利用对象解构赋值变量取属性同名的值

//父组件
<Modal title='标题' cancelText='取消' okText='确定' show={this.state.show} onShow={this.handleClick}  >
                    <p>Some contents...</p>
                    <p>Some contents...</p>
                    <p>Some contents...</p>
                    <p>Some contents...</p>
                </Modal>
子组件想拿到父组件里的同名属性
let {title,children,cancelText,okText} = this.props
//等同于声明一个变量等于this.props下的同名属性
//let title = this.props.title等等
//下面使用时不用再写this.props.title可以代替直接用title代替
let hello = ({name,age}) => (
    console.log(`my name:${name},age:${age}`)
)
hello({name:'Liu',age:'24'})

对象的解构赋值是下面形式的简写

let { foo: foo, bar: bar } = { foo: "aaa", bar: "bbb" };
//简写形式:let{foo,bar}={foo: "aaa", bar: "bbb"}

将obj中的对象foo赋值给一个变量。

let obj = {bar:'bbb',foo:'aaa',name:'sayname'};
let {foo} = obj;
console.log(foo);
var foo = obj.foo;

字符串的解构赋值

按字符串下标赋值。

const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"

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

let {length : len} = 'hello';
len // 5

对象的结构赋值:

let name = 'liuenqing';
let age = 22;
let say = function(){
    console.log(1)
}
let obj = {
    name,
    age,
    say,
    run(){
        console.log('run')
    }
}
console.log(obj)

对象的扩展(合并)

let obj1 = {name:'Liu'}
let obj2 = {age:'24',Gender:'man'}
Object.Assign({},obj1,obj2)
//必须都为对象
//obj.name会对name的值进行字符串解构

更为强大的 ...

let obj1 = {name:'Liu'}
let obj2 = {age:'24',Gender:'man'}
var obj = {...obj1,...obj2,say(){}}
console.log(obj)