Skip to content

[js] 第274天 你知道js的可选链是什么吗?说说你对它的理解,它有什么应用场景? #1778

Open
@haizhilin2013

Description

@haizhilin2013

第274天 你知道js的可选链是什么吗?说说你对它的理解,它有什么应用场景?

我也要出题

Activity

wheatup

wheatup commented on Jan 15, 2020

@wheatup

可选链是ES2020新引入的功能,目前处于ECMAScript Proposal Stage 4阶段,将陆续登陆各大浏览器(目前可通过勾选chrome的Experimental JavaScript功能体验该功能)。

本人在其Stage 2阶段开始关注,算是最期待的一个新功能之一。

语法如下:

window?.console?.log?.("Hello");

该代码可解读为

如果window存在,则其取console属性,如果console存在,则取其log属性,如果log存在,则将其作为方法调用。
如果该链任意一环节不存在,则忽略整个链并返回undefined

在ES2020以前若要实现类似逻辑,可以使用以下方式:

window && window.console && window.console.log && window.console.log("Hello");

该功能在获取一个多层嵌套对象的属性,并且上层对象可能不存在时非常有用,比如 user.data?.extraData?.phone,如果dataextraData有可能不存在,我们不需要判断其是否存在就可以取其phone值,会减少很多逻辑判断和冗余代码。

个人觉得该功能会影响代码的规范性,造成代码的可读性变差,建议只在处理网络传输数据时使用。

forever-z-133

forever-z-133 commented on Jan 15, 2020

@forever-z-133

在各类库里有看到类似的函数,getObjectValue(obj, 'a.b.c') 这样的,
能找到就返回,找不到至少不报错会返回 undefined。
但理论上,这种报错最好还是暴露出来比较好些。

xiaoqiangz

xiaoqiangz commented on Aug 29, 2022

@xiaoqiangz

obj?.role?.age === obj && obj.role && obj.role.age ,极大的简化了代码。
可选链操作符 ( ?. ) 允许读取位于连接对象链深处的属性的值,而不必明确验证链中的每个引用是否有效。?. 操作符的功能类似于 . 链式操作符,不同之处在于,在引用为空 (nullish ) (null 或者 undefined) 的情况下不会引起错误,该表达式短路返回值是 undefined。与函数调用一起使用时,如果给定的函数不存在,则返回 undefined。

azzyx

azzyx commented on Aug 29, 2022

@azzyx
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Labels

    jsJavaScript

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

      Development

      No branches or pull requests

        Participants

        @haizhilin2013@wheatup@xiaoqiangz@azzyx@forever-z-133

        Issue actions

          [js] 第274天 你知道js的可选链是什么吗?说说你对它的理解,它有什么应用场景? · Issue #1778 · haizlin/fe-interview