一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第7天,点击查看活动详情。
解构赋值 - es6语法学习!主要应用于数组 和对象的赋值!
看了后面的文章,把解构赋值和rest参数和spread语法一起写了!
- rest参数 - 在函数位置上的 ... 代表剩余参数
- spread语法 - 用于拆解数组或对象,也是 ... 和rest的区别,注意位置!!
学习链接
Rest 参数与 Spread 语法 (javascript.info)
简介
解构赋值 - 主要应用于 数值 和对象,用于提取它们的一部分,也可以简化赋值过程!
再次介绍一下数组,对象 和Map,set
- 数组,基于对象,开辟一个连续的空间,一个有序的集合
- 对象,主要存储键值对,其中键得是 字符串
- Map,也可以存储键值对,键可以是任意值,NaN也可以当键!
- Set,存储唯一 值!值的集合!
为什么要解构? 如果我们只需要对象,数组中的一部分,可以通过解构的方式提取出来!
数组的解构!- []
let arr = ["John", "Smith"]
let [firstName, surname] = arr; - 注意这里解构数组,用的方括号!!
也可以这样!
let [firstName, surname] = 'John Smith'.split(' '); - 重点是解构的是数组!可迭代!
它等于
let firstName = arr[0]
let surname = arr[1] - 上面一个方括号就可以解决!
使用逗号,可以忽略不要的元素!
let [firstName, ,title] = 'John Smith XXXXXX'.split(' ')
这个title = XXXXXX
左侧被赋值的,也可以是对象中的属性!
let user = {}
let [user.firstName, ,user.title] = 'John Smith XXXXXX'.split(' ')
for of 中的解构 - 对象
// [key, value] - 解构赋值
// Object.entries(user) 对象的遍历方法,返回 [key, value]
for(let [key, value] of Object.entries(user)) {
}
for of - map
for(let [key, value] of map) { // 因为map是可迭代的!
}
数组解构总结:
- 左侧被赋值用方括号,右侧可迭代!- 数组解构
交换变量值
- 传统方法,一个临时变量保存,然后交换
- [guest, amdin] = [admin, guest] - 这样就交换了
剩余参数 - 也叫rest参数
- 在传入的参数中定义,如果传入的参数太多,不想一个一个写上去怎么办?
- 可以在最后一个参数上,写入...rest,这个重点是前面的三个点,后面的名字有意义即可
- 一定要放在最后!
- 这个rest的值,就等于剩下的参数了!
默认值
- 在解构赋值的时候,
- 如果右边的值,为空怎么办?
- 可以提前给左边的值赋值,如果没有的话,就优先使用!
对象的解构!- {}
数组和对象都是可迭代的 - 可以循环!
看看对象的解构!
- 用的是 {} 大括号!- 数组用的是方括号[]!
- 等号右侧应该是个对象!
- 对象的解构意思是,把对象属性的值,赋值给变量!
- 变量的顺序不重要,变量,看起来都是对象的键。。
如何修改解构赋值的 变量名?
- 加个 : 冒号 - 修改名字
- 代表 - “什么值:赋值给谁”
- 如果用的是 = 等号,代表默认值
- 冒号和等号,还可以结合使用,即修改了名字,又有了默认值。。。。。
对象中的剩余参数
- 也是使用 ...代表剩下的,通过它可以访问右侧对象中的剩余变量!
- 低级的浏览器,可能不支持,需要polyfill,第三方工具。。如bable
这里有个特殊的情况。。
- 以上代码,都是用 解构的方式 初始化 出来的变量!
- 如果事先已经有了变量,如何进行解构赋值????
- 在外层加个括号,,还没有遇见过这样的情况。。先记录一下。。
嵌套对象,解构!
- 指的是,对象有很多层级 - 对象套对象 或对象套数组,接着往下套。。。。
- 有啥定义啥。。。。
智能函数参数
- 指的是,传递参数时
- 如果要传递的有很多很多,一个一个写,很麻烦
- 如何解决? 直接传递一个对象
- 然后在函数的参数中,用解构的方法,解构那个传递的对象!
- 如果想直接用默认值,直接传递一个空的对象,啥都不传,会报错。。
2232. 向表达式添加括号后的最小结果
2232. 向表达式添加括号后的最小结果 - 力扣(LeetCode) (leetcode-cn.com)
给你一个下标从 0 开始的字符串 expression ,格式为 "+" ,其中 和 表示正整数。请你向 expression 中添加一对括号,使得在添加之后, expression 仍然是一个有效的数学表达式,并且计算后可以得到 最小 可能值。左括号 必须 添加在 '+' 的左侧,而右括号必须添加在 '+' 的右侧。
用到了解构赋值,也用到了之前学的字符串,数组转字符串,很棒的题!
思路:
- 给了一个字符串 247+38 , 他的最小值是 2 * (47 + 38 ) = 2 * 85 = 170
- 以 加号,分两个数组,分出的数组,当作倍数,必须要添加 一个括号进去!
- 枚举 - 两个for,用slice分割数组
- 每次求解和,如果出现更小的数,改变值,并记录下标
- 退出循环的时候,就找到最小值的位置,可以插入 左右括号 - 左右两个数组中。。
- 返回,把数组拼接 加号,通过join返回字符串。。。
// 以 + 做为分割点
let arr = expression.split('+'); //两个数组 - 247,38,还需要继续拆!
let min = Infinity, minIndex = [0, 0]; // 最小值的初始值
let left = arr[0].split(''), right = arr[1].split(''); // 两个数组!用于插入左右括号
// 比较数据
for(let i = 0; i < left.length; i++) // 左侧枚举
{
//右侧从第一个位置开始,因为括号,不能直接加在 加号旁边,至少得有个数。。。
for(let j = 1; j <= right.length; j++)
{
// 前面的+号,是转成数字,
// 通过slice分割数组并串联成字符串,前面用 加号,隐式转换成数字类型
// 公式,就是,拆出去的乘以 中间用括号包裹的, 乘以右边拆出去的。
// 主要就是这个下标
// [0,i] * ([i,] + [0, j]) * [j,] - 如果不存在留个初始值。
let sum = (+left.slice(0, i).join('') || 1) *
((+left.slice(i).join('') || 1) + (+right.slice(0, j).join('') || 0)) *
(+right.slice(j).join('') || 1);
if(sum < min) {
min = sum;
minIndex = [i, j]; // 记录下标,因为值变小了。。
}
}
}
// 插入
left.splice(minIndex[0], 0, '('); // 左侧插入 左括号 - splice - yyds
right.splice(minIndex[1], 0, ')');
// 拼接!
return [...left, '+', ...right].join('') }; - 解构赋值!!spread 语法!
总结
定义,传送,接收,解构!
解构主要用于数组和对象,写到这,总算是看出方便之处了!
- 数组解构 - [], 对象解构 - {}
- 剩余参数 - 后面的参数不想写了,可以用!
- 解构赋值 - 不想一个一个let,不想写数组下标,可以用!
- 解构用于交换值,很好!
- for of中解构,[key, value]
- 嵌套对象解构,一个一个按层级走吧。。。
- 智能函数参数 - 传入对象,在参数中解构,使用默认值就很棒!
你没有摘到的,只是春天里的一朵花,整个春天还是你的。