前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >ES6面试点-对象的解构赋值

ES6面试点-对象的解构赋值

作者头像
用户10106350
发布2022-10-28 13:25:39
5120
发布2022-10-28 13:25:39
举报
文章被收录于专栏:WflynnWeb

对象的解构赋值

对象解构的基本用法:

代码语言:javascript
复制
let {a, b} = {a: 'aaaa', b: 'bbbb'} // a='aaaa' b='bbbb'
let obj = {d: 'aaaa', e: {f: 'bbbb'}}
let {d, e:{f}} = obj // 嵌套解构 d='aaaa' f='bbbb'
let g;
(g = {g: 'aaaa'}) // 已声明变量解构 g='aaaa'
let [h, i, j, k] = 'nice' // 字符串解构 h='n' i='i' j='c' k='e'

基本赋值

代码语言:javascript
复制
var o = {p: 42, q: true};
var {p, q} = o;

console.log(p); // 42
console.log(q); // true

字符串也可以解构赋值

这是因为此时,字符串被转换成了一个类似数组的对象。

代码语言:javascript
复制
const [a, b, c, d, e] = 'hello';
a // "h"
b // "e"
c // "l"
d // "l"
e // "o"
代码语言:javascript
复制
类似数组的对象都有一个length属性,因此还可以对这个属性解构赋值。
代码语言:javascript
复制
let {length : len} = 'hello';
len // 5

无声明赋值:一个变量可以独立于其声明进行解构赋值。

代码语言:javascript
复制
var a, b;
({a, b} = {a: 1, b: 2});
代码语言:javascript
复制
注意
  • 赋值语句周围的圆括号 ( ... ) 在使用对象字面量无声明解构赋值时是必须的。
  • {a, b} = {a: 1, b: 2} 不是有效的独立语法,因为左边的 {a, b} 被认为是一个块而不是对象字面量。
  • 然而,({a, b} = {a: 1, b: 2}) 是有效的,正如 var {a, b} = {a: 1, b: 2}你的 ( ... ) 表达式之前需要有一个分号,否则它可能会被当成上一行中的函数执行。
  • 因为 JavaScript 引擎会将{a, b} 理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免 JavaScript 将其解释为代码块,才能解决这个问题。

解构赋值允许等号左边的模式之中,不放置任何变量名。

下面的表达式虽然毫无意义,但是语法是合法的,可以执行

代码语言:javascript
复制
({} = [true, false]);
({} = 'abc');
({} = []);

数组进行对象属性的解构

数组本质是特殊的对象,下面代码对数组进行对象解构。数组arr0键对应的值是1[arr.length - 1]就是2键,对应的值是3。方括号这种写法,属于“属性名表达式”

代码语言:javascript
复制
let arr = [1, 2, 3];
let {0 : first, [arr.length - 1] : last} = arr;
first // 1
last // 3

给新的变量名赋值

可以从一个对象中提取变量并赋值给和对象属性名不同的新的变量名。

代码语言:javascript
复制
var o = {p: 42, q: true};
var {p: foo, q: bar} = o;
 
console.log(foo); // 42
console.log(bar); // true

默认值

变量可以先赋予默认值。当要提取的对象没有对应的属性,变量就被赋予默认值。

代码语言:javascript
复制
var {a = 10, b = 5} = {a: 3};

console.log(a); // 3
console.log(b); // 5

对象的解构与数组不同点

数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。

代码语言:javascript
复制
let { bar, foo } = { foo: 'aaa', bar: 'bbb' };
foo // "aaa"
bar // "bbb"

let { baz } = { foo: 'aaa', bar: 'bbb' };
baz // undefined

嵌套结构的对象

代码语言:javascript
复制
let obj = {
  p: [
    'Hello',
    { y: 'World' }
  ]
};

let { p: [x, { y }] } = obj;
x // "Hello"
y // "World"
代码语言:javascript
复制
注意,这时p是模式,不是变量,因此不会被赋值。如果p也要作为变量赋值,可以写成下面这样。
代码语言:javascript
复制
let obj = {
  p: [
    'Hello',
    { y: 'World' }
  ]
};

let { p, p: [x, { y }] } = obj;
x // "Hello"
y // "World"
p // ["Hello", {y: "World"}]
代码语言:javascript
复制
下面是另一个例子。
代码语言:javascript
复制
const node = {
  loc: {
    start: {
      line: 1,
      column: 5
    }
  }
};

let { loc, loc: { start }, loc: { start: { line }} } = node;
line // 1
loc  // Object {start: Object}
start // Object {line: 1, column: 5}
代码语言:javascript
复制
上面代码有三次解构赋值,分别是对loc、start、line三个属性的解构赋值。注意,最后一次对line属性的解构赋值之中,只有line是变量,loc和start都是模式,不是变量。

如果解构模式是嵌套的对象,而且子对象所在的父属性不存在,那么将会报错。

下面代码中,等号左边对象的foo属性,对应一个子对象。该子对象的bar属性,解构时会报错。原因很简单,因为foo这时等于undefined,再取子属性就会报错。

代码语言:javascript
复制
// 报错
let {foo: {bar}} = {baz: 'baz'};

对象的解构赋值可以取到继承的属性

下面代码中,对象obj1的原型对象是obj2foo属性不是obj1自身的属性,而是继承自obj2的属性,解构赋值可以取到这个属性。

代码语言:javascript
复制
const obj1 = {};
const obj2 = { foo: 'bar' };
Object.setPrototypeOf(obj1, obj2);

const { foo } = obj1;
foo // "bar"

数值和布尔值的解构赋值

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

代码语言:javascript
复制
let {toString: s} = 123;
s === Number.prototype.toString // true

let {toString: s} = true;
s === Boolean.prototype.toString // true
代码语言:javascript
复制
上面代码中,数值和布尔值的包装对象都有toString属性,因此变量s都能取到值。

解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefinednull无法转为对象,所以对它们进行解构赋值,都会报错。

代码语言:javascript
复制
let { prop: x } = undefined; // TypeError
let { prop: y } = null; // TypeError

函数参数的解构赋值

函数的参数也可以使用解构赋值。

代码语言:javascript
复制
function add([x, y]){
  return x + y;
}

add([1, 2]); // 3
代码语言:javascript
复制
上面代码中,函数add的参数表面上是一个数组,但在传入参数的那一刻,数组参数就被解构成变量x和y。对于函数内部的代码来说,它们能感受到的参数就是x和y。

下面是另一个例子。

代码语言:javascript
复制
[[1, 2], [3, 4]].map(([a, b]) => a + b);
// [ 3, 7 ]
代码语言:javascript
复制
函数参数的解构也可以使用默认值。
代码语言:javascript
复制
function move({x = 0, y = 0} = {}) {
  return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, 0]
move({}); // [0, 0]
move(); // [0, 0]
代码语言:javascript
复制
上面代码中,函数move的参数是一个对象,通过对这个对象进行解构,得到变量x和y的值。如果解构失败,x和y等于默认值。

注意,下面的写法会得到不一样的结果。

代码语言:javascript
复制
function move({x, y} = { x: 0, y: 0 }) {
  return [x, y];
}

move({x: 3, y: 8}); // [3, 8]
move({x: 3}); // [3, undefined]
move({}); // [undefined, undefined]
move(); // [0, 0]
代码语言:javascript
复制
上面代码是为函数move的参数指定默认值,而不是为变量x和y指定默认值,所以会得到与前一种写法不同的结果。

undefined就会触发函数参数的默认值。

代码语言:javascript
复制
[1, undefined, 3].map((x = 'yes') => x);
// [ 1, 'yes', 3 ]

iOS开发视频_无线互联(2GB)

链接:https://pan.baidu.com/s/1H4W_Bo3awjs7chE9gGYZXw

提取码:ng1l

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-12-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 WflynnWeb 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 函数参数的解构赋值
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档