1.空置合并运算符 (??)
左边值为 null 或者 undefined ,返回右边结果值,否则取反
例:
const foo = null ?? 'default string';
结果是:default string
const baz = 0 ?? 42;
结果: 0
2. 三元运算符:JavaScript 唯一使用三个操作数的运算符
条件后 跟一个问号(?),如果条件为真,执行冒号前的表达式;条件为假,执行冒号后的表达式。是if...else语句的简捷形式。
语法:
condition ? exprIfTrue : exprIfFalse(等于false或者可以转换为false的值)
描述::
除了false,可能的假值表达式还有:null / NaN / 0 / (空字符串)"" / undefined
例子:
1.常见的处理null值方法
const greeting = (person) => {
const name = person ? person.name : "stranger";
return `Howdy, ${name}`;
}
console.log(greeting({ name: "Alice" })); // "Howdy, Alice"
console.log(greeting(null)); // "Howdy, stranger"
2.三元运算符是右结合,可以像if...else if...else if...else结合起来使用
function example() {
return condition1 ? value1
: condition2 ? value2
: condition3 ? value3
: value4;
}
等价于:
function example() {
if (condition1) {
return value1;
} else if (condition2) {
return value2;
} else if (condition3) {
return value3;
} else {
return value4;
}
}
3.逻辑空赋值 (??=)
被判断的参数为空值(null 或者 undefined)时对其赋值
const a = { duration: 50 };
a.duration ??= 10;
console.log(a.duration);
结果: 50
a.speed ??= 25;
console.log(a.speed);
结果: 25
4.可选链运算符 (?.)
可读取对项链深处的属性值,不必验证链中的每个引用是否有效。
?. 类似于 链式运算符(.),但是它可以在值或者函数为null 或 undefined 时不报错,返回undefined
语法:
obj.val?.prop
obj.val?.[expr]
obj.func?.(args)
例子:
const adventurer = {
name: 'Alice',
cat: {
name: 'Dinah'
}
};
const dogName = adventurer.dog?.name;
console.log(dogName);
//结果: undefined
console.log(adventurer.someNonExistentMethod?.());
// 结果: undefined
5.属性访问器
有两种,点号(.) 或者 方括号([ ])
const person1 = {};
person1['firstname'] = 'Mario';
person1['lastname'] = 'Rossi';
console.log(person1.firstname);
结果: "Mario"
const person2 = {
firstname: 'John',
lastname: 'Doe'
};
console.log(person2['lastname']);
结果: "Doe"
6. 取余数 (%)
结果是:左侧除以右侧 的余数,值的结果符号与左侧(被除数)正负保持一致
console.log(13 % 5);
结果: 3
console.log(-13 % 5);
结果: -3
console.log(4 % 2);
结果: 0
console.log(-4 % 2);
结果: -0
7. 取余数并赋值 (%=)
变量除以右侧数,将余数赋值给该变量
语法:x %= y 等价于 x = x % y
let bar = 5;
bar %= 2; // 1
bar %= 'foo'; // NaN
bar %= 0; // NaN
8.展开语法(....)
在函数调用或者数组构造是,可将数据或者string,以及字面量对象进行展开。
字面量一般指 [1, 2, 3]
或者 {name: "mdn"}
这种简洁的构造方式
//语法:
函数调用:myFunction(...iterableObj);
字面量数组构造或字符串:[...iterableObj, '4', ...'hello', 6];
字面量对象拷贝:let objClone = { ...obj };
例子:
function myFunction(x, y, z) { }
var args = [0, 1, 2];
myFunction(...args);
或者:
function myFunction(v, w, x, y, z) { }
var args = [0, 1];
myFunction(-1, ...args, 2, ...[3]);