JavaScript 具有一个(全新的)称为 可选链 的特性。 假设我有以下代码
const name = Data.person.name;
如果 Data
上的 person
不存在,我将获得一个硬性的、无法停止的错误。 使用可选链,我可以编写
const name = Data.person?.name;
现在,如果 person
不存在,则 name
将变为 undefined
,而不是抛出错误。 我认为这非常有用。 在某种程度上,它可以使代码更具弹性,因为脚本完全崩溃的可能性较小。 但是,有些人认为它实际上会导致代码弹性变差,因为您没有从根本上解决问题(错误数据),而是在问题上贴了个创可贴。
Jim Nielsen 将可选链与 CSS 中的 !important
相联系。 “未定义属性”错误可能是所有 JavaScript 错误中最常见的错误,可选链是一种快速的解决方法。 样式无法按您期望的方式级联可能是(也许?)所有 CSS 问题中最常见的错误,而 !important
是一种快速的解决方法。
任何熟悉 CSS 的人都知道,使用
!important
并不总是能解决您的问题。 事实上,它可能会导致更多问题。 JavaScript 中的可选链也是如此,它可能会导致更多问题,而不是解决问题(我们还不知道,因为它还没有存在足够长的时间)。
我喜欢这种观点。
关于新特性的全面负面热烈讨论只是点击诱饵的无稽之谈,但有时其中会埋藏一些值得思考的好东西。 我敢打赌,可选链将在 JavaScript 中形成一些不错的模式,就像 !important
在某种程度上 在 CSS 中已经做到的那样。 我最近听到的关于 CSS 中 !important
的大多数讨论都是关于当你真的需要使用它时你应该使用它(而不是为了摆脱困境)。
我不确定这有多大不了。 在示例中,当我们以后需要使用
name
常量时,我们需要确保我们拥有一个有效的值。 即使Data.person
很好,Data.person.name
也可能不是我们期望的。因此,将来当我们需要使用
name
时,而我们不再关心Data.person
,我们只需要检查name
是否已设置以及是否是我们期望的值。在这种情况下,可选链使我们能够快速处理不存在的人员,并让我们继续我们的工作。 也就是说,我不使用它。
我一直期待着它能让三元运算符更清晰易懂。 在某些情况下,我需要动态填充对象,并且我不知道属性是否已存在。
例如,而不是
let a = b && b.c && b.c.d || 1;
我可以写
let a = b?.c?.d || 1;
我认为这不会对我自己或我工作的团队产生任何改变。
我认为通常的做法是,在必要时在函数开始时进行错误检查,并相应地做出反应。 这不会改变该逻辑或我们需要寻找的内容,只是让代码更少,而且可能更容易阅读。
也就是说,由于浏览器支持问题,我还没有使用此功能。