是否可以在javascript中检查null内联?

时间:2018-01-19 13:08:52

标签: javascript null

我有一个功能可以解析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而不是抛出错误?

7 个答案:

答案 0 :(得分:30)

2020年答案,确实存在!

您现在可以直接使用?.内联测试是否存在。它被称为 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月

?? Browser Support-84%

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 nullundefined 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
}