可选链接?.
和空位合并??
现在,您可以直接使用?.
内联安全地测试存在性。所有现代的浏览器都支持它。
??
如果未定义或为null,则可用于设置默认值。
aThing = possiblyNull ?? aThing
aThing = a?.b?.c ?? possiblyNullFallback ?? aThing
如果存在属性,则?.
进行下一个检查,或返回有效值。任何故障都会立即短路并返回undefined
。
const example = {a: ["first", {b:3}, false]}
example?.a // ["first", {b:3}, false]
example?.b // undefined
example?.a?.[0] // "first"
example?.a?.[1]?.a // undefined
example?.a?.[1]?.b // 3
domElement?.parentElement?.children?.[3]?.nextElementSibling
null?.() // undefined
validFunction?.() // result
(() => {return 1})?.() // 1
要确保默认定义的值,可以使用??
。如果您需要第一个真实值,则可以使用||
。
example?.c ?? "c" // "c"
example?.c || "c" // "c"
example?.a?.[2] ?? 2 // false
example?.a?.[2] || 2 // 2
如果不检查情况,则必须存在left-side属性。如果没有,它将抛出异常。
example?.First // undefined
example?.First.Second // Uncaught TypeError: Cannot read property 'Second' of undefined
?.
浏览器支持 -2020年7月占78%
??
浏览器支持 -78%
Mozilla文档
-
逻辑无效分配,2020 +解决方案
新的运营商目前正在被添加到浏览器??=
,||=
和&&=
。它们不能完全满足您的要求,但根据您的代码目标,可能会导致相同的结果。
注意:这些在公共浏览器版本中尚不常见,但是Babel应该可以很好地进行移植。将随着可用性的变化而更新。
??=
检查左侧是否未定义或为null,如果已定义则短路。如果不是,则为左侧分配右侧值。||=
和&&=
相似,但基于||
和&&
运算符。
基本范例
let a // undefined
let b = null
let c = false
a ??= true // true
b ??= true // true
c ??= true // false
对象/数组示例
let x = ["foo"]
let y = { foo: "fizz" }
x[0] ??= "bar" // "foo"
x[1] ??= "bar" // "bar"
y.foo ??= "buzz" // "fizz"
y.bar ??= "buzz" // "buzz"
x // Array [ "foo", "bar" ]
y // Object { foo: "fizz", bar: "buzz" }
浏览器支持 2020年7月-.03%
Mozilla文档
if( obj?.nested?.property?.value )
而不是if( obj && obj.nested && obj.nested.property && obj.nested.property.value )