js中对应false和true的值
0, “”, NaN, null, undefined 都会被认为是false
[], {}, -1, 1(非零数字),非空字符 会认为是true
// 当value分别等于 0, "", NaN, null, undefined 都会被认为是false
if (value) {
}
// 当value分别等于 [], {}, -1, 1 会认为是true
引申
??
空值合并运算符
当左侧的操作数为
null
或者undefined
时,返回其右侧操作数,否则返回左侧操作数。当左表达式不为
null
或undefined
时,不会对右表达式进行求值。
const foo = null ?? 'default string';
console.log(foo);
// expected output: "default string"
const baz = 0 ?? 42;
console.log(baz);
// expected output: 0
// 当左表达式不为 null 或 undefined 时,不会对右表达式进行求值。
function A() { console.log('函数 A 被调用了'); return undefined; }
function B() { console.log('函数 B 被调用了'); return false; }
function C() { console.log('函数 C 被调用了'); return "foo"; }
console.log( A() ?? C() );
// 依次打印 "函数 A 被调用了"、"函数 C 被调用了"、"foo"
// A() 返回了 undefined,所以操作符两边的表达式都被执行了
console.log( B() ?? C() );
// 依次打印 "函数 B 被调用了"、"false"
// B() 返回了 false(既不是 null 也不是 undefined)
// 右侧表达式没有被执行
对比||
// 由于 "", NaN, null, 0, undefined都会被认为是false
let a = "" || "default";
// a = "default"
let b = "" ?? "default";
// b = ""
?.
可选链操作符
允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效
let nestedProp = obj.first && obj.first.second;
// 验证如下
let nestedProp = obj.first?.second;
为了避免报错,在访问obj.first.second
之前,要保证 obj.first
的值既不是 null
,也不是 undefined
。
如果只是直接访问 obj.first.second
,而不对 obj.first
进行校验,则有可能抛出错误。
通过使用 ?.
操作符取代 .
操作符,JavaScript 会在尝试访问 obj.first.second
之前,先隐式地检查并确定 obj.first
既不是 null
也不是 undefined
。如果obj.first
是 null
或者 undefined
,表达式将会短路计算直接返回 undefined
当尝试调用一个可能不存在的方法时也可以使用可选链
let result = someInterface.customMethod?.();
// 如果存在一个属性名且不是函数,使用 ?. 仍然会产生一个 TypeError 异常 (x.y is not a function).
// 避免someInterface为 null 或 undefined
let result2 = someInterface?.customMethod?.()