JS解构怎样理解?解构赋值的应用有哪些?
Admin 2021-10-22 群英技术资讯 915 次浏览
本文介绍的JS解构的内容,什么是JS解构呢?ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构,简单的了解完JS解构,接下来我们看数组解构、对象的解构赋值、字符串解构、解构赋值的应用等等。感兴趣的朋友就继续往下看吧。
ES6允许按照一定模式,从数组和对象中提取值,对变量进行赋值,这被称为解构。它在语法上比ES5所提供的更加简洁、紧凑、清晰。它不仅能减少你的代码量,还能从根本上改变你的编码方式。
以前,为变量赋值,我们只能直接指定值,比如
let a = 1; let b = 2; let c = 3;
现在可以用数组解构的方式来进行赋值
let [a, b, c] = [1, 2, 3]; console.log(a, b, c); // 1, 2, 3
这是数组解构最基本类型的用法,还可以解构对象数组
// 对象数组解构 let [a, b, c] = [{name: 'jacky'}, {name: 'monkey'}, {name: 'houge'}]; console.log(a, b, c); // {name: 'jacky'}, {name: 'monkey'}, {name: 'houge'}
这条可以理解为等号左边和等号右边的形式要统一,如果不统一解构将失败。
let [a, [b, c], d] = [1, [2, 3], 4]; console.log(a, b, c, d); // 1 2 3 4 // 提取除第二、三个外的所有数值 let [a, , , d] = [1, 2, 3, 4]; console.log(a, d); //1 4 let [a, ...b] = [1, 2, 3, 4]; console.log(a, b); // 1 [2, 3, 4] let [a, , , ...d] = [1, 2, 3, 4, 5]; console.log(a, d); // 1 [4, 5] 如果解构不成功,变量的值就等于undefined let [a, b, c] = [2, 3]; console.log(a, b, c); // 2 3 undefined let [c] = []; console.log(c); // undefined
如果解构不成功,变量的值就等于undefined
let [a, b, c] = [2, 3]; console.log(a, b, c); // 2 3 undefined let [c] = []; console.log(c); // undefined
上述是完全解构的情况,还有一种是不完全解构,即等号左边的模式,只匹配一部分的等号右边的数组,解构依然可以成功。
let [x, y] = [1, 2, 3]; console.log(x, y); // 1 2 let [a, [b], d] = [1, [2, 3], 4]; console.log(a, b, d); // 1 2 4
解构赋值允许指定默认值。
let [a, b=2] = [1]; console.log(a, b); // 1 2 let [a=1, b=2, c, d=13] = [10, 11, 12]; console.log(a, b, c, d); // 10 11 12 13
对象的解构与数组有一个重要的不同。数组的元素是按次序排列的,变量的取值由它的位置决定;而对象的属性没有次序,变量必须与属性同名,才能取到正确的值。
// 对象解构赋值的内部机制,是先找到同名属性,然后再赋给对应的变量。真正被赋值的是后者,而非前者。 let obj = { a: "aaa", b: "bbb" }; let { a: x, b: y } = obj; console.log(x, y); // aaa bbb let { a, b } = { a: 'aaa', b: 'bbb' }; console.log(a, b); // aaa bbb // 不按照顺序 let { b, a } = { a: 'test1', b: 'test2' } console.log(a, b) // test1 test2 // 嵌套解构 let { obj: { name }} = { obj: { name: 'jacky', age: '22' } } console.log(name) // jacky // 稍微复杂的嵌套 let obj = { p: [ 'Hello', { y: 'World' } ] }; let { p: [x, { y }] } = obj; console.log(x, y); // Hello World
如果变量名与属性名不一致,必须写成下面这样。
var { foo: rename } = { foo: "aaa",bar: "bbb" }; console.log(rename); // aaa console.log(foo); // Uncaught ReferenceError: foo is not defined
如果在解构之前就定义了变量,这时候再解构会出现问题。下面是错误的代码,编译会报错(因为js引擎会将{a}理解成一个代码块,从而发生语法错误。只有不将大括号写在行首,避免js将其解释成代码块,才能解决这个问题)
let a; let obj = { a: "aaa" }; {a} = obj; // Uncaught SyntaxError: Unexpected token '='
要解决报错,使程序正常,这时候只要在解构的语句外边加一个圆括号就可以了
let a; let obj = { a: "aaa" }; ( {a} = obj ); console.log(a); // aaa
函数的参数也可以使用解构赋值。
function add([x, y]){ return x + y; } add([1, 2]); // 3
函数参数的解构也可以使用默认值。
function fn(x, y = 7) { return x + y; } console.log(fn(3)); // 10
字符串被转换成了一个类似数组的对象。
const [a, b, c, d, e, f] = "hello"; console.log(a); //h console.log(b); //e console.log(c); //l console.log(d); //l console.log(e); //o console.log(f); //undefined
解构赋值时,如果等号右边是数值和布尔值,则会先转为对象。
let {toString: s} = 0; console.log(s === Number.prototype.toString); // true let {toString: s} = true; console.log(s === Boolean.prototype.toString); // true
解构赋值的规则是,只要等号右边的值不是对象或数组,就先将其转为对象。由于undefined和null无法转为对象,所以对它们进行解构赋值,都会报错
let { prop: x } = undefined; // TypeError let { prop: y } = null; // TypeError
通常交换两个变量的方法需要一个额外的临时变量,如下
let a = 1; let b = 2; let temp; temp = a; a = b; b = temp; console.log(a, b); // 2 1
用ES6解构赋值的话,会变得很简洁
let a = 1; let b = 2; [a, b] = [b ,a]; console.log(a, b); // 2 1
函数只能返回一个值,如果要返回多个值,只能将它们放在数组或对象里返回。有了解构赋值,取出这些值就非常方便。
// 返回一个数组 function example() { return [1, 2, 3]; } let [a, b, c] = example(); // 返回一个对象 function example() { return { foo: 1, bar: 2 }; } let { foo, bar } = example();
有种场景,比如有一个数组(可能为空)。并且希望访问数组的第一个、第二个或第n个项,但如果该项不存在,则使用指定默认值。
通常会使用数组的length属性来判断
const list = []; let firstItem = 'hello'; if (list.length > 0) { firstItem = list[0]; } console.log(firstItem); // hello
如果用ES6解构赋值来实现上述逻辑
const list = []; const [firstItem = 'hello'] = list; console.log(firstItem); // 'hello'
let jsonData = { id: 42, status: "OK", data: [867, 5309] }; let { id, status, data: number } = jsonData; console.log(id, status, number); // 42, "OK", [867, 5309]
任何部署了 Iterator 接口的对象,都可以用for...of循环遍历。Map 结构原生支持 Iterator 接口,配合变量的解构赋值,获取键名和键值就非常方便。
const map = new Map(); map.set('first', 'hello'); map.set('second', 'world'); for (let [key, value] of map) { console.log(key + " is " + value); } // first is hello // second is world
如果只想获取键名,或者只想获取键值,可以写成下面这样。
// 获取键名 for (let [key] of map) { // ... } // 获取键值 for (let [,value] of map) { // ... }
关于JS解构及解构赋值的应用就介绍到这,上述实例具有一定的借鉴价值,感兴趣的朋友可以参考,希望能对大家有帮助,想要了解更多JS解构的内容,大家可以关注其它的相关文章。
文本转载自脚本之家
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
前几天在vue运行项目过程中报错了,所以下面这篇文章主要给大家介绍了关于Vue报错Syntax Error:TypeError: this.getOptions is not a function的解决方法,需要的朋友可以参考下
目前Nodejs开发中有很多痛点,其中有一个是修改完代码以后需要我们重启服务才能看到效果。这样一次次的杀进程、重启,杀进程、重启很让人头大。程序员是最痛恨重复工作的物种,之前有了解过的同学可能知道 forever 。 forever 可以帮我们解决上面的问题,通过对资源变化的检测做到变化后自动重启。开发阶段我们使用 nodefile.js 来启动另外由于Nodejs的单线程,任何异常都会导致整个
监听属性可以针对某个属性进行监听,当监听的属性的值发生了变化,则会执行相应的函数,下面这篇文章主要给大家介绍了关于Vue监听属性的相关资料,需要的朋友可以参考下
这篇文章主要给大家分享了vue全局过滤器概念及注意事项和基本使用方法,下面文字围绕vue全局过滤器的相关资料展开具体的详细内容,需要的朋友可以参考一下,希望对你有所帮助
node服务CPU过高怎么办?怎么排查?下面本篇文章给大家整理分享下node服务CPU过高的排查思路,希望对大家有所帮助!
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008