ES6 解构赋值

Posted samweb

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ES6 解构赋值相关的知识,希望对你有一定的参考价值。

  解构赋值,就是怎么快速地从对象和数组中获取到你想要的数据。对象的结构赋值和数组的解构赋值用法差不多,只不过解构赋值的方式不同,一个是依据的是属性,一个依据的是数组的索引。先来看对象的解构赋值。看一个实例就知道怎么使用了,语法很简单

let person = {
    name: ‘sam‘,
    age: ‘28‘
};

let {name, age} = person; //  解构赋值
console.log(name, age) // ‘sam‘ 28

  对象字面量的方式声明了两个变量name 和age, let {name, age} 放到了等号的左边, 右边就是我们要想从中获取数据的对象。赋值的依据就是对象的属性,我们声明的变量名和对象的属性名一致。对象的解构赋值就是对对象进行分解,从对象中找出和我们声明的变量名一致的属性名,然后把属性值赋值给对应的变量。这时,你也很容易发现一个问题,当声明的变量名,在对象中没有对应的属性名呢,那怎么办?很简单,这个变量取值undefined. 

let {job } = person; 
console.log(job) // undefined

  但有时候,你并不想这个变量取值undefined, 那就给它一个默认值。默认值的方式和函数的默认参数一样,直接使用= 进行赋值。

let {job = ‘web‘ } = person; 
console.log(job) // web

  还有一个问题,声明的变量名必须和对象的属性名一致吗?我能不能声明其他的变量名,也能获取到对象属性的值?当然可以,不过语法稍微复杂了一点

let {name: localName } = person; 
console.log(localName) // sam

  语法为{对象的属性名: 声明变量名}, 意思是获取到对象中name 属性对应的值,然后把它赋值给 localName变量,所以,在这种情况下,是不能访问name的,否则会报错。当然在这种赋值方式下,也可以提供默认值,因为我们始终是从对象中获取属性值,很容易取到对象中没有的属性

let {job: localJob = ‘web‘ } = person; 
console.log(localJob) // sam

  取person 对象中的job 属性的值,赋值给localJob 变量,很明显,赋值的是undefined, 因为person 中没有job 属性,localJob 变量也就取值undefined, 有必要给它提供一个默认值。

  以上都是声明变量,使用解构赋值,其实单纯的赋值也可以是使用解构赋值。变量之前就已经声明了,我们只想给已声明的变量赋值,那就直接把变量放到大括号里面,再放到等号的左边,右边放要解构的对象

let person = {
    name: ‘sam‘,
    age: ‘28‘
};

let age = 10;
({age} = person) // 只是赋值,注意要把解构表达式放到小括号里面

  要注意一点,使用解构的方式,只进行赋值操作时,要把整个表达式用小括号括起来。如果不用括号括起来,{age} = person,  第一个{ 会被js 解析为块级作用域的开始,你不能给一个作用域赋值,所以就会报错。像{age} = person 这样的解构赋值表达式,赋值完之后,整个表达式的值仍然是=后面的对象,说起来可能有点不太理解,举个例子就简单了

let age = 10;
let obj;
obj = {age} = person;

console.log(age, obj) // 28 { name: ‘sam‘, age: ‘28‘ }

  看一下obj = {age} = person;  赋值操作都是从右边开始计算, 先{age} = person person 对象进行解构赋值,然后再赋值给obj. 正如刚才所说,解构赋值表达式最终的结果是=后边的对象, {age} = person 解构赋值完成以后得到的值是person 对象,然后把person 对象赋值给了obj, 现在obj === person 为true.

 

以上是关于ES6 解构赋值的主要内容,如果未能解决你的问题,请参考以下文章

ES6-----学习系列二(解构赋值)

阮一峰老师的ES6入门:变量的解构赋值

ES6 之 解构赋值

ES6数组的解构赋值( 下)

Es6 新增解构赋值

ES6学习 第二章 变量的解构赋值