JS中的...
在学习JS的过程中,
...
这个语法总是在大大简化代码的同时也提升了理解难度。本文先介绍了解构赋值,并介绍了解构赋值中...
作为剩余语法的作用,之后介绍了...
作为展开语法的作用。
解构赋值
解构赋值是对Object
和Array
进行简化操作的一种特殊语法,让我们可以把数组或对象拆到一系列的变量之中。
数组解构
1 | let arr = ["LLLeo", "Li"]; |
解构赋值与下面的写法是等价的:
1 | let firstName = arr[0]; |
实际上,这里的“数组”可以拓展为任何的可迭代对象(通过Symbol.iterator
实现了迭代功能),比如Set,Map等。
1 | let user = new Map(); |
JS中著名的交换两个变量值的技巧(Python中也有类似的操作,还不用写[]
):
1 | [a,b] = [b,a]; |
默认值:
1 | let [name = "Guest", surname = "Anonymous"] = ["Julius"]; |
左侧可以是任何LVal
1 | let user = {}; |
数组解构中的...
1 | let [a, b, ...c] = ['1','2','3','4','5']; |
...
表示获取其余数组项,使用时必须位于解构赋值的最后一个参数位置。
对象解构
1 | let {var1, var2} = {var1:…, var2:…} |
变量的顺序并不重要,我们还可以对变量进行重命名和默认赋值:
1 | let {height : h, width : w = 1000, title : t = "舞!舞!舞!"} = { title: "寻🐏冒险记", height: 200, width: 100 } |
默认赋值只在没有提供对应值时调用,同时默认值可以是任意表达式或者函数调用。
1 | let {width = prompt("width?"), title = prompt("title?")} = options; |
对象同时支持嵌套解构,但需要结构一一对应。
对象解构中的...
对象解构中的...
可以获取到对象的剩余属性。
1 | let options = { title: "寻🐏冒险记", height: 200, width: 100 } |
实际应用——智能函数参数
开发中很多函数都需要很多参数,如果我们把函数声明都写成:
1 | function showMenu(title = "无", width = 200, height = 100, items = []) { |
为萝卜们填坑的过程将会造成很大的记忆负担,同时可能传递很多undifined
,浪费编程时间。
我们可以只传递一个对象,然后通过解构赋值的方式来把传递的对象解构成各个参数:
1 | let options = { |
虽然已经大大简化了函数传参,但是当我们直接进行showMenu()
调用时还会报错。
1 | function showMenu({title = "无", width = 200, height = 100, items = []} = {}) { |
我们通过指定空对象为参数对象默认值来解决问题。
展开语法
- 展开语法可以在函数调用/数组构造时,将数组表达式或者String在语法层面展开。
- 展开语法在构造字面量对象时,可以将对象表达式按键值对形式展开。
展开语法与
Object.assign()
的行为一致,都是执行了浅拷贝。
同样,这里的“数组”可以拓展为可迭代对象。
函数调用 / Rest参数 / 数组构造
函数调用:
1 | const Func1 = (x,y,z)=>{ |
函数Rest参数:
1 | function sumAll(...args) { // 数组名为 args |
数组构造:
1 | let args = ['123', '456']; |
使用展开语法可以替代一些数组操作:
1 | let arr1 = [1,2,3]; |
字面量对象
1 | let obj1 = { foo: 'bar', x: 42 }; |
参考:
展开语法 - JavaScript | MDN (mozilla.org)
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 LLLeoのBlog!