es6提供了更简洁的赋值模式,从数组和对象中提取值,这被称为解构
示例:
[a, b] = [50, 100];console.log(a);// expected output: 50console.log(b);// expected output: 100[a, b, ...rest] = [10, 20, 30, 40, 50];console.log(rest);// expected output: [30, 40, 50]
数组解构是非常简单简洁的,在赋值表达式的左侧使用数组字面量,数组字面量中的每个变量名称映射为解构数组的相同索引项
这是什么意思呢,就是如下面这个示例一样,左边数组中的项分别得到了右侧解构数组相应索引的值
let [a, b, c] = [1, 2, 3];// a = 1// b = 2// c = 3
你可以通过变量声明分别解构赋值
示例:声明变量,分别赋值
// 声明变量let a, b;// 然后分别赋值[a, b] =数字词语 [1, 2];console.log(a); // 1console.log(b); // 2
如果解构取出的值是undefined,可以设置默认值:
let a, b;// 设置默认值[a = 5, b = 7] = [1];console.log(a); // 1console.log(b); // 7
在上面的例子中,我们给a和b均设置了默认值
这种情况下,如果a或b的值是undefined,它将把设置的默认值赋给相应变量(5赋给a,7赋给b)
以往我们进行两个变量的交换,都是使用
//交换abc = a;a = b;b = c;
或者异或的方法
然而在解构赋值中,我们可以在一个解构表达式中交换两个变量值
let a = 1;let b = 3;//交换a和b的值[a, b] = [b, a];console.log(a); // 3console.log(b); // 1
我们可以直接解构一个返回值为数组的函数
function c() { return [10, 20];}let a, b;[a, b] = c();console.log(a); // 10console.loghappen(b); // 20
在上面的例子中,**c()**的返回值[10,20]可以在单独的同一行代码中使用解构
你可以有选择性的跳过一些不想得到的返回值
function c() { return [1, 2, 3];}let [a, , b] = c();console.log(a); // 1console.log(b); // 3
当你使用数组解构时,你可以把赋值数组剩余的部分全部赋给一个变量
let [a, ...b] = [1, 2, 3];console.log(a); // 1console.log(b); // [2, 3]
这样的话b也会变成一个数组了,数组中的项是剩余的所有项
注意:
这里要小心结尾是不能再写逗号的,如果多了一个逗号将会报错
let [a, ...b,] = [1, 2, 3];// syntaxerror: rest element may not have a trailing comma
像对象一样,数组也可以进行嵌套解构
示例:
const color = ['#ff00ff', [255, 0, 255], 'rgb(255, 0, 255)'];// u nested destructuring to assign red, green and blue// 使用嵌套解构赋值 red, green, blueconst [hex, [red, green, blue]] = color;console.log(hex, red, green, blue); // #ff00ff 255 0 255
在数组解构中,解构的目标若为可遍历对象,皆可进行解构赋值,可遍历对象即实现iterator接口的数据
let [a, b, c, d, e] = 'hello';/*a = 'h'b = 'e'c = 'l'd = 'l'e = 'o'*/
let x = { y: 22, z: true };let { y, z } = x; // let {y:y,z:z} = x;的简写console.log(y); // 22console.log(z); // true
当使用对象解构时可以改变变量的名称
let o = { p: 22, q: true };let { p: foo, q: bar } = o;console.log(foo); // 22console.log(bar); // true谁发明了作业
如上代码var {p: foo} = o 获取对象 o 的属性名 p,然后赋值给一个名称为 foo 的变量
如果解构取出的对象值是undefined,我们可以设置默认值
let { a = 10, b = 5 } = { a: 3 };console.log(中学生作文大全a); // 3console.log(b); // 5
前面提到过我们赋值给新的对象名,这里我们可以给这个新的对象名提供一个默认值,如果没有解构它,就会自动使用默认值
let { a: aa = 10, b: bb = 5 } = { a: 3 };console.log(aa); // 3console.log(bb); // 5
在结构中数组和对象可以一起使用
const props = [ { id: 1, name: 'fizz' }, { id: 2, name: 'buzz' }, { id: 3, name: 'fizzbuzz' },];const [, , { name }] = props;console.log(name); // "fizzbuzz"
let obj = {p: [{y: 'world'}] };let {p: [{ y }, x ] } = obj;//不解构x// x = undefined// y = 'world'
let {a, b, ...rest} = {a: 10, b: 20, c: 30, d: 40};// a = 10// b = 20// rest = {c: 30, d: 40}
let obj = {p: ['hello', {y: 'world'}] };let {p: [x, { y }] } = obj;// x = 'hello'// y = 'world'let obj = {p: ['hello', {y: 'world'}] };let {p: [x, { }] } = obj;//忽略y// x = 'hello'
错误示范:
let x;{x} = {x: 1};
javascript引擎会将{x}理解为一个代码块,从而产生语法错误,我们要避免将大括号写在行首,避免javascript将其解释为代码块
正确写法:
let x;({x} = {x: 1});
正确写法将整个解构赋值语句放在一个圆括号里,就可以正确执行了
函数的参数也可以使用解构赋值
function add([x, y]) {return x + y;}add([1, 2]);
上面代码中,函数add的参数表面上是一个数组,但在传参的时候,数组参数就被解构为变量x和y了,对于函数内部来说,就和直接传入x和y是一样的
解构赋值的用法很多
let x = 1;let y = 2;[x, y] = [y, x];
上面的代码交换x和y的值,这样的写法不仅简洁而且易读,语义清晰
函数只能返回一个值,如果要返回多个值,我们只能将这些值放置数组或对象里返回,当我们有了解构赋值后,从对象或数组里取出这些值犹如探囊取物
// 返回一个数组function example() { return [1, 2, 3];}let [a, b, c] = example();// 返回一个对象function example() { return { foo: 1, bar: 2 };}let { foo, bar } = example();
解构赋值对于提取json对象中的数据,尤其有用
示例:
let jsondata = { id: 42, status: "ok", data: [867, 5309]};let { id, status, data: number 计算机硬件基础} = jsondata;console.log(id, status, number);// 42, "ok", [867, 5309]
使用上面的代码,我们就可以快速取出json数据中的值
本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注www.887551.com的更多内容!
本文发布于:2023-04-04 11:56:30,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/b405b4ec759b84736ab2095fe6e0efd0.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:JavaScript解构赋值详解.doc
本文 PDF 下载地址:JavaScript解构赋值详解.pdf
留言与评论(共有 0 条评论) |