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
),如果aThing
为null
完成该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
由于null
和undefined
都是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增加安全的遍历。 所以,不仅没有好的方法可以做到这一点,而且也不会在可预见的未来增加。