JavaScript 运算符

39 阅读2分钟

滥用可选链运算符(?.)

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,后续流程出错了,这时候如果想找原因就会很困难

编译后代码冗余

image.png

不要再滥用可选链运算符(?.)啦! - 掘金 (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 运算符操作的操作数