【JS】--- " || " 、 " && " 、" ?? "、" ?. "

77 阅读3分钟

1. &&

  1. 两边条件都为true时,结果才为true;
  2. 如果有一个为false,结果就为false;
  3. 当第一个条件为false时,就不再判断后面的条件

注意:当数值参与逻辑与运算时,结果为true,那么会返回的会是第二个为真的值;如果结果为false,返回的会是第一个为假的值。

2. ||

  1. 只要有一个条件为true时,结果就为true;
  2. 当两个条件都为false时,结果才为false;
  3. 当一个条件为true时,后面的条件不再判断

注意:当数值参与逻辑或运算时,结果为true,会返回第一个为真的值;如果结果为false,会返回第二个为假的值;

3. 优先级 && > ||

逻辑的优先级是高于逻辑的;

比如: console.log(3||2&&5||0),会先算 2&&5 的值为 5,然后再 3||5 ---- 3,最后再 3||0 ---- 3,所以最终结果为3。

4. 转换规则

对象为true;
非零数字为true;

零为false;

非空字符串为true;
空字符串为法false;
其他为false;

5. ?? :空值合并操作符

空值合并操作符,可以在使用可选链时设置一个默认值。

image.png

判断这个对象(this.element)下的(businessObject)下的(value)下的(length)是否为null或者undefined,当其中一链为null或者undefined时就返回undefined,这样即使中间缺少一个属性也不会报错,双问号后面接的就是默认值。

var obj ={}
console.log(obj?.a?.b ?? 233 ) //233
var obj={a:{b:1}}  
console.log(obj?.a?.b??233) //1

空值合并操作符?? )是一个逻辑操作符,左侧为 nullundfined 时,才返回右侧的数,否则返回左侧操作数。与逻辑或操作符(||)不同的是,逻辑或操作符会在左侧操作数为假值(例如,''nullundefined 或 0)时返回右侧操作数。

image.png

6. ?. :可选链操作符

可以读取位于连接对象链深处属性的值,不必明确验证链中的每个引用是否有效。

功能类似于“.” 链式操作符,不同之处在于,在引用为空null 或者 undefined 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。

返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。

var a = null;
console.log(a)  // null
console.log(a.b)  // 报错
console.log(a?.b)  // undefined

let nestedProp = obj.first && obj.first.second;
// 等价于
let nestedProp = obj.first?.second;

使用场景

(1)获取一个对象更深层次的属性,即obj中的first属性下的second属性。
为了避免报错,获取之前要判断first属性是否为null或者undefined,再获取second属性。

①使用“与”运算符

const num = obj.first && obj.first.second;

②使用?.可选链操作符

const num = obj.first?.second;

(2)可选链与函数调用
调用一个可能不存在的方法时,如果被调用的方法不存在,使用可选链可以使表达式自动返回undefined而不是抛出一个异常

let result = someInterface.customMethod?.();

注:如果存在一个属性名且不是函数, 使用 ?. 仍然会产生一个 TypeError 异常 (x.y is not a function).

(3)使用空值合并操作符

let customer = {
  name: "Carl",
  details: { age: 82 }
};
let customerCity = customer?.city ?? "暗之城";
console.log(customerCity); // “暗之城”

(4)短路计算

let a = null;
let x = 0;
let prop = a?.[x++];
console.log(x); // x 将不会被递增,依旧输出 0