总结一下强大的ES6符号
空值合并运算符 ‘??’
第一个参数不是 null/undefined
,则 ??
返回第一个参数。否则,返回第二个参数。
result = a ?? b
,可以理解为这样:
result = (a !== null && a !== undefined) ? a : b;
可选链 “?.”
可选链 ?.
是一种访问嵌套对象属性的安全的方式。即使中间的属性不存在,也不会出现错误。
let user = {}; // 一个没有 "name" 属性的 user 对象
alert(user.name); // Error!
alert( user?.name ); // undefined(不报错)
可选链 ?.
不是一个运算符,而是一个特殊的语法结构(犀牛书:操作符)。它还可以与函数和方括号一起使用。
扩展、剩余操作符(Rest参数与Spread操作符)
Rest操作符
- …rest必须是最后一个参数哦
用法一:用于函数
function sumAll(...args) { // 数组名为 args
let sum = 0;
for (let arg of args) sum += arg;
return sum;
}
alert( sumAll(1) ); // 1
alert( sumAll(1, 2) ); // 3
alert( sumAll(1, 2, 3) ); // 6
Rest 参数可以通过使用三个点 ...
并在后面跟着包含剩余参数的数组名称,来将它们包含在函数定义中。这些点的字面意思是“将剩余参数收集到一个数组中”。
用法二:数组和对象的解构
var [a, ...restArr] = [1,2,3,4]
var {name: n, ...restObj} = {name: 'zyp', age: 18, like: 'sleep'}
console.log(restArr) //[2,3,4]
console.log(restObj)//{age: 18, like: 'sleep'}
扩展操作符
用法一:将数组扩展成函数参数
function foo(a,b, c) {
console.log(a);//1
console.log(b);//2
console.log(c)//3
}
var arr = [1,2,3]
foo(...arr)
用法二:数组合并
var arr1 = [1,2,3], arr2 = [4,5,6];
arr1.push(...arr2) // arr1为[1, 2, 3, 4, 5, 6]
var arr1 = [1,2,3], arr2 = [4,5,6];
arr1.push(...arr2) // arr1为[1, 2, 3, 4, 5, 6]
用法三:字符串转数组
var str = 'zyp';
var strArr = [...str] //strArr为["z", "y", "p"]
用法四:将类数组对象转化成数组(arguments)
function foo() {
var argArr = [...arguments]
console.log(argArr) //[1,2,3,4]
console.log(argArr instanceof Array) //true
}
foo(1,2,3,4)
arguments
是一个类数组,也是可迭代对象,但它终究不是数组。它不支持数组方法,因此我们不能调用 arguments.map(...)
等方法。
箭头函数是没有 "arguments"
(箭头函数没有上下文,意味的也没有this)
如果我们在箭头函数中访问 arguments
,访问到的 arguments
并不属于箭头函数,而是属于箭头函数外部的“普通”函数。