【发布时间】:2015-11-15 07:48:26
【问题描述】:
在 ES6 (ES2015/JavaScript.next/Harmony) 中是否有 null-safe 属性访问(空传播/存在)运算符,例如 CoffeeScript 中的 ?. > 例如?还是计划在 ES7 上使用?
var aThing = getSomething()
...
aThing = possiblyNull?.thing
大致如下:
if (possiblyNull != null) aThing = possiblyNull.thing
理想情况下,如果possiblyNull 是null,则解决方案不应分配(甚至undefined)给aThing
【问题讨论】:
-
@naomik 这种空值检查对于检查深层嵌套属性的 if 语句非常有用,例如
if( obj?.nested?.property?.value )而不是if( obj && obj.nested && obj.nested.property && obj.nested.property.value ) -
@SeanWalsh 如果您的对象嵌套得那么深,或者您的函数在对象中挖掘得那么深,那么您的应用程序可能还有其他几个问题。
-
比较
var appConfig = loadConfig(config, process.env); connect(appConfig.database);和connect(config)。您可以将一个更简单的对象传递给connect,而不是传递整个config对象,您可以使用conf.username、conf.password而不是尝试像config[process.env]?.database?.username、config[process.env]?.database?.password这样的东西。参考:Law of Demeter. -
此外,如果您执行设置默认值或清理属性等操作(这可以在上面示例中的
loadConfig中完成),您可以假设属性的存在并跳过无数次的 null 检查应用的各个区域。 -
@naomik 只要语言支持嵌套对象,它仍然是一个有用的功能——不管你或我如何看待应用程序本身的架构。顺便说一句,像这样的复杂对象图在对复杂数据模型进行建模的 ORM 中非常常见。
标签: javascript coffeescript ecmascript-6 babeljs