ES6 / 2015中的无担保财产访问(和有条件分配)

在ES6(ES2015 / JavaScript.next / Harmony)中是否存在一个null -safe属性访问(空传播/存在)运算符?.CoffeeScript例如? 还是计划在ES7?

 var aThing = getSomething() ... aThing = possiblyNull?.thing 

这将大致如下:

 if (possiblyNull != null) aThing = possiblyNull.thing 

理想情况下,解决scheme不应该为aThing分配(甚至是undefined ),如果aThingnull

完成该function的function目前处于阶段1:空传播。

https://github.com/tc39/proposals

你可以看看这里:

https://github.com/claudepache/es-optional-chaining https://docs.google.com/presentation/d/11O_wIBBbZgE1bMVRJI8kGnmC6dWCBOwutbN9SWOK0fU/view

如果你今天想使用它,有一个Babel插件可以实现这一点。

https://github.com/davidyaha/ecmascript-optionals-proposal

更新 (2017-08-01):如果你想使用正式的插件,你可以尝试新的变换巴别塔7的alpha版本。 你的旅费可能会改变

https://www.npmjs.com/package/babel-plugin-transform-optional-chaining

不,你可以使用lodash#get或类似的东西在JavaScript中。

这不如那个好。 运营商,但要达到类似的结果,你可以这样做:

 user && user.address && user.address.postcode 

由于nullundefined都是falsy值( 请参阅此引用 ),因此&&运算符后面的属性只有在先例不为null或未定义时才被访问。

另外,你可以写一个这样的函数:

 function safeAccess(func, fallbackValue) { try { return func(); } catch (e) { return fallbackValue; } } 

用法:

 safeAccess(() => myCompany.people[0].age) // returns age or undefined 

或者,有一个回退值:

 safeAccess(() => myCompany.people[0].age, 0) // returns age or 0 

不,ES6中没有空传播算子。 你将不得不去与已知的模式之一 。

不过,您也许可以使用解构:

 ({thing: aThing} = possiblyNull); 

有很多讨论(例如这个 )在ES7中添加这样的操作符,但是没有一个真正起飞。

香草替代安全的财产访问

 (((ab || {}).c || {}).d || {}).e 

最简洁的条件分配可能是这样的

 try { b = abcde } catch(e) {} 

按照这里的列表,目前还没有build议为Ecmascript增加安全的遍历。 所以,不仅没有好的方法可以做到这一点,而且也不会在可预见的未来增加。