一、ES6的解构赋值
解构赋值语法是一种 Javascript 表达式。通过解构赋值,可以将属性/值从对象/数组中取出,赋值给其他变量,解构赋值在js非常常用。
// obj对象
const obj = {
a: 1,
b: 2,
c: 3,
d: 4,
e: 5,
}
// 取obj对象中的值
const {a, b, c, d, e} = obj; // 可以用{}解构出obj中的值
console.log(a, b, c, d, e); // 结果是 1, 2, 3, 4, 5
// 这个取值是基础的常用的,目前只能用obj对象的属性名,如果我们不需要这个属性名,那么还需要重新赋值,其实我们可以这么写;
const {a: abandon} = obj;
console.log(abandon); // 结果是 1,就是obj.a的值
// 我们也可以用 ...解构obj对象剩余值;
const {a: abandon, ...last} = obj;
console.log(abandon, last); // 结果是 1,{b: 2, c: 3, d: 4, e: 5}
// 如果obj2对象里嵌套有对象,也可以解构出来;
const obj2 = {
a: {
a1: 1,
b1: 2,
}
}
const {a: {a1, b1}} = obj2;
console.log(a1, b1); //结果是 1, 2
// 可以在解构时赋默认值,在没有解构出这个属性时可以用默认值
const obj2 = {
a: {
a1: 1,
b1: 2,
}
}
const {b = 95} = obj2;
console.log(b); // 结果是95
二、可选链运算符(?.)
可选链运算符( ?. ) 允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 运算符的功能类似于 . 链式运算符,不同之处在于,在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。
当尝试访问可能不存在的对象属性时,可选链运算符将会使表达式更短、更简明。在探索一个对象的内容时,如果不能确定哪些属性必定存在,可选链运算符也是很有帮助的。
const obj = {
value: {
name: 'ss',
},
};
console.log(obj?.value?.app?.id) // 结果是 undefined
当用了可选链,在访问不存在的对象属性时,返回undefined。
三、空值合并运算符(??)
空值合并运算符( ?? )是一个逻辑运算符,当左侧的操作数为 null 或者 undefined 时,返回其右侧操作数,否则返回左侧操作数。
与逻辑或运算符(||)不同,逻辑或运算符会在左侧操作数为假值时返回右侧操作数。也就是说,如果使用 || 来为某些变量设置默认值,可能会遇到意料之外的行为。比如为假值(例如,'' 或 0)时。见下面的例子。
console.log('' || 1); // 结果为 1
console.log(0 || 1); // 结果为 1
以前,如果想为一个变量赋默认值,通常的做法是使用逻辑或运算符(||),然而,由于 || 是一个布尔逻辑运算符,左侧的操作数会被强制转换成布尔值用于求值。任何假值(0, '', NaN, null, undefined)都不会被返回,导致你如果需要0或''等值的时候会出现不可预料的后果。
let value = 0; // 比如 value 是需要判断是否有值的数据
console.log(value || '未取值'); // 结果是 未取值,如果 0 也是我需要的值就不能这么判断了
console.log(value ?? '未取值'); // 结果是 0
在判断用户是否在输入框中输入值时,我们可以这么判断
if(value !== null && value !== undefined && value !== '') {}
但是这个写法比较麻烦,可以用 空值合并运算符(??)
if((value ?? '') !== '' ) {}
四、默认参数值
函数默认参数允许在没有值或undefined被传入时使用默认形参。
以前,一般设置默认参数的方法是在函数体测试参数是否为undefined,如果是的话就设置为默认的值。
// 如果不传参数,就设置默认参数
function fn (a, b) {
const a1 = a || 0;
const b1 = b || '';
console.log(a1, b1);
}
fn(1);
有了默认参数,我们不需要再在函数体内做不必要的检查。
function fn (a = 0, b = '') {
console.log(a, b);
}
fn(1);