可以在javascript中检查空内联吗?

可以在javascript中检查空内联吗?,javascript,null,Javascript,Null,我有一个函数,它解析GoogleMapsAPI的地址组件JSON,然后返回城市/地区/路线名称 如果找不到键,则getAddressComponent()返回一个null let route=getAddressComponent(addressComponents,'route').value.long\u name 假设它没有找到键,那么我得到一个错误:TypeError:无法读取未定义的属性'long_name',显然是因为它没有定义 除了条件方法(a==null),如何在javascri

我有一个函数,它解析GoogleMapsAPI的地址组件
JSON
,然后返回城市/地区/路线名称

如果找不到键,则
getAddressComponent()
返回一个
null

let route=getAddressComponent(addressComponents,'route').value.long\u name

假设它没有找到键,那么我得到一个
错误:TypeError:无法读取未定义的属性'long_name',显然是因为它没有定义

除了条件方法
(a==null)
,如何在javascript中检查
null

我怎样才能像这样用
检查?

编辑:安全导航操作员

let route=getAddressComponent(addressComponents,'route')?.value.long\u name

如果它不存在,它可能会将
route
设置为
null
,而不是抛出错误

let component = getAddressComponent(addressComponents, 'route');
let route = component ? component : null

您可以使用
运算符检查值是否为
true
false
,然后在javascript中设置值
null
将为
false

您需要的是null合并运算符。 Javascript没有。大多数情况下,人们使用逻辑OR
|
来实现此目的,但它不适用于属性访问

有人建议在语言中添加null合并,但这离此还很远:

如果你真的,真的,绝对想使用它,你可以使用这个巴别塔插件:

但我强烈建议您不要这样做:这可能永远不会应用到该语言中,并且您的代码库中会有未经验证的代码。

不能在javascript中使用,因此,您可以查看typescript

例如,您可以使用
try…catch
构造:

let route

try {
  route = getAddressComponent(addressComponents, 'route').value.long_name
} catch (error) {
  route = null
}

对于空字符串,可以使用

var foo='yo';
console.log(!foo);
var foo=null;
console.log(!foo)更新2020
这个期待已久的特性现在可以在JavaScript中使用了

我将重定向到,这很好地涵盖了它

2018年原始答案
  • Javascript(EcmaScript 5或6)中没有“空安全导航操作符”,比如C#中的
    ?。
    、角度模板等(有时也称为Elvis操作符,在编写
    ?:
    )时,至少不幸的是现在还没有

  • 您可以测试
    null
    ,并使用三元运算符
    ?:
    ,在单行中返回一些依赖表达式,如其他答案中所示:

(使用
==null
仅检查
null
s值,使用
==null
检查
null
未定义的值)

  • 在某些情况下,如您的情况,当您的变量应该包含一个
    对象
    ,您可以简单地使用一个事实,即任何对象都是真实的,而
    null
    未定义
    都是虚假的值:

    您可以通过使用
    合并到布尔值来测试伪值并使其内联:

      console.log(!!myVar ? myVar.myProp : 'fallbackValue');
    
    但是,使用此“falsy测试”时要非常小心,因为如果变量是
    0
    '
    NaN
    ,那么它也是falsy,即使它不是空的/未定义的


    • 下面的代码简化返回数值?num:0
对于我:

returnnum | | 0

2020答案,它存在!!! 您现在可以直接使用
?。
内联测试是否存在。它被称为
可选链接操作符
,受到所有现代浏览器的支持

如果属性存在,则进行下一次检查,或返回值。任何故障都将立即短路并返回未定义的

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
要确保默认定义的值,可以使用
??
。如果需要第一个truthy值,可以使用
|

example?.c ?? "c"  // "c"
example?.c || "c"  // "c"

example?.a?.[2] ?? 2  // false
example?.a?.[2] || 2  // 2
如果不检查案例,则左侧属性必须存在。否则,它将抛出一个异常

example?.First         // undefined
example?.First.Second  // Uncaught TypeError: Cannot read property 'Second' of undefined
-89%,2021年3月

-89%


-v14+

getAddressComponent是否异步?您的意思是
(element!=null?element.value.long\u name:null)
?@mplungjan否not@GalAbra不,我的意思是如果我能做一些类似的事情,注意“空字符串”和“空值”不一样,但是当强制为布尔值时,它们都是错误的(比如当你应用
,或者在
中如果应用
)。
var foobar='';console.log((!foobar?'falsy like null':'not falsy');console.log((foobar==null?'==null':'!==null');console.log((foobar==null?==null':');
example?.c ?? "c"  // "c"
example?.c || "c"  // "c"

example?.a?.[2] ?? 2  // false
example?.a?.[2] || 2  // 2
example?.First         // undefined
example?.First.Second  // Uncaught TypeError: Cannot read property 'Second' of undefined