我有一个功能可以解析Google Maps API JSON
的地址组件,然后返回城市/地区/路线名称。
getAddressComponent()
如果无法找到密钥,则会返回null
。
let route = getAddressComponent(addressComponents, 'route').value.long_name;
所以,让我们说它没有找到密钥,然后我得到一个Error: TypeError: Cannot read property 'long_name' of undefined
,因为它没有定义。
如何在条件方法null
以外的javascript中检查(a === null)
?
如何使用?
编辑:安全导航操作员
let route = getAddressComponent(addressComponents, 'route')?.value.long_name;
如果它不存在,它可能会将route
设置为null
而不是抛出错误?
答案 0 :(得分:30)
您现在可以直接使用?.
内联测试是否存在。它被称为 Optional Chaining Operator
,受所有现代浏览器的支持。
如果存在一个属性,它将继续进行下一个检查,或返回该值。任何故障都会立即短路并返回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
要确保使用默认的定义值,可以使用??
。如果您需要第一个真实值,则可以使用||
。
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
?.
Browser Support-84%,2020年12月
Node Support-v14 +
答案 1 :(得分:8)
Javascript (EcmaScript 5或6)中没有“空安全导航操作符”,如C#中的?.
,Angular模板等(有时也称为不幸的是,Elvis运营商,至少在编写?:
)时。
您可以测试null
并使用三元运算符 ?:
在单行中返回一些相关表达式,如其他答案中所示:
(使用=== null
仅检查null
的值,== null
检查null
和 undefined
)
console.log(myVar == null ? myVar.myProp : 'fallBackValue');
在某些情况下,与您的一样,当您的变量应该包含object
时,您可以简单地使用任何对象 truthy 而null
和undefined
是 falsy 值:
if (myVar)
console.log(myVar.myProp)
else
console.log('fallbackValue')
您可以通过使用!!
合并到布尔值来测试虚假值,并使其内联:
console.log(!!myVar ? myVar.myProp : 'fallbackValue');
使用此“假性测试”时要非常小心,如果您的变量是0
,''
或NaN
,那么 falsy 就像好吧,即使它不是null / undefined。
答案 2 :(得分:3)
你想要的是一个空的合并运算符。
Javascript没有。大多数时候人们为此目的使用逻辑OR ||
,但它不适用于属性访问。
有人建议在语言中添加空合并,但它远远不够:
https://github.com/tc39/proposal-nullish-coalescing
https://tc39.github.io/proposal-nullish-coalescing/
如果你真的,真的,绝对想要使用它,你可以使用这个Babel插件:
https://www.npmjs.com/package/babel-plugin-transform-optional-chaining
但是我强烈建议你不要这样做:这可能永远不会出现在语言中,你的代码库中会有无效的代码。
答案 3 :(得分:2)
下面的代码为我简化了return num ? num : 0
:
return num || 0;
答案 4 :(得分:1)
let component = getAddressComponent(addressComponents, 'route');
let route = component ? component : null
您可以使用?
运算符检查值是true
还是false
,然后在javascript null
中设置值false
答案 5 :(得分:1)
对于空字符串,您可以使用var foo = 'yo';
console.log(!foo);
var foo = null;
console.log(!foo);
:
?
对于您询问的condition ? if true : if false
,它是Conditional (ternary) Operator,语法为var foo = 'yo';
console.log('1 : ' + (!foo ? 'Null' : 'Not Null'));
console.log('2 : ' + (foo === null ? 'Null' : 'Not Null'));
console.log('3 : ' + (foo == null ? 'Null' : 'Not Null'));
var foo = null;
console.log('1 : ' + (!foo ? 'Null' : 'Not Null'));
console.log('2 : ' + (foo === null ? 'Null' : 'Not Null'));
console.log('3 : ' + (foo == null ? 'Null' : 'Not Null'));
,您可以按如下方式使用它:
export class AppModule {
constructor() {
registerLocaleData(localeDeCH);
}
}
答案 6 :(得分:0)
.?
无法在javascript中使用,因此,您可能会查看打字稿。
例如,您可以使用try...catch
构造:
let route
try {
route = getAddressComponent(addressComponents, 'route').value.long_name
} catch (error) {
route = null
}