滥用可选链运算符(?.)
const result = obj?.a?.b?.c?.d
- ?前面的属性如果是空值(null或undefined),则result值是undefined,如果都不是空值,则会返回最后一个d属性值
只有可能是空值,而且业务逻辑中有空值的情况,就用;其它情况尽量不要用
隐式过滤了异常,不能快速定位问题
api.get(...).then(result => {
const id = result?.id
// use id to do something
})
- 个别情况返回的 result=null,但是由于前端这里加了
?.,导致页面没有任何反应,js不抛错,console也没有log,后续流程出错了,这时候如果想找原因就会很困难
编译后代码冗余
不要再滥用可选链运算符(?.)啦! - 掘金 (juejin.cn)
in操作符(in)
- 判断一个属性是否属于一个对象,返回值是布尔值
const author = {
name: "CUGGZ",
age: 18
}
"height" in author; // false
"age" in author; // true
- 判断一个属性是否属于对象原型链的一部分
let arr = ["hello", "jue", "jin"];
"length" in arr; // true
delete操作符
-
删除对象的某个属性或者数组元素
-
删除引用类型对象属性的本身,不会删除属性指向的对象
const o = {};
const a = { x: 10 };
o.a = a;
delete o.a; // o.a属性被删除
console.log(o.a); // undefined
console.log(a.x); // 10, 因为{ x: 10 } 对象依然被 a 引用,所以不会被回收
-
原型中声明的属性和对象自带的属性无法被删除
-
通过var声明的变量和通过function声明的函数拥有dontdelete特性,不能被删除
instanceof只能正确判断引用数据类型,而不能判断基本数据类型
空值合并操作符(??)
- 某个属性不为 null 和 undefined,那么就获取该属性,如果该属性为 null 或 undefined,则取一个默认值
const name = dogName ? dogName : 'default';
- 通过 || 来简化,当 dogName 为 0 或 false 的时候也会走到 default 的逻辑
const name = dogName || 'default';
- ES2020 引入了 ?? 运算符,只有 ?? 左边为 null 或 undefined时才返回右边的值
const dogName = false;
const name = dogName ?? 'default';
void操作符(void)
-
不需要返回表达式的计算结果,让表达式返回 undefined
-
不想让链接标签发生跳转:
href="javascript:void(0)
let a = b = c = 2; // 定义并初始化变量的值
d = void (a -= (b *= (c += 5))); // 执行void运算符,并把返回值赋予变量d
console.log(a); // -12
console.log(b); // 14
console.log(c); // 7
console.log(d); // undefined
-
void 优先级高于普通运算符的优先级
-
用小括号明确 void 运算符操作的操作数