在ES6 (ES2015/JavaScript.next/Harmony)中是否有一个空安全的属性访问(空传播/存在)操作符?比如CoffeeScript ?还是计划在ES7中?

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

大致如下:

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

理想情况下,解决方案不应该分配(甚至未定义)一个东西,如果posblynull是空的


当前回答

它不像?那样好。运算符,但要实现类似的结果,你可以这样做:

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

因为null和undefined都是假值(参见参考),所以只有当前面的属性不是null或undefined时,才会访问&&运算符后面的属性。

或者,你可以这样写一个函数:

function _try(func, fallbackValue) {
    try {
        var value = func();
        return (value === null || value === undefined) ? fallbackValue : value;
    } catch (e) {
        return fallbackValue;
    }
}

用法:

_try(() => user.address.postcode) // return postcode or undefined 

或者,使用回退值:

_try(() => user.address.postcode, "none") // return postcode or a custom string

其他回答

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

// Typescript
static nullsafe<T, R>(instance: T, func: (T) => R): R {
    return func(instance)
}

// Javascript
function nullsafe(instance, func) {
    return func(instance);
};

// use like this
const instance = getSomething();
let thing = nullsafe(instance, t => t.thing0.thing1.thingx);

更新(2022-01-13):似乎人们仍在发现这一点,以下是目前的情况:

可选链接现在在规范(ES2020)中,并且被所有现代浏览器支持,更多的在存档建议中:https://github.com/tc39/proposal-optional-chaining babel-preset-env:如果你需要支持没有它的旧环境,这可能是你想要的https://babeljs.io/docs/en/babel-preset-env Babel v7插件:https://babeljs.io/docs/en/babel-plugin-proposal-optional-chaining

更新(2017-08-01):如果你想使用官方插件,你可以尝试带有新转换的Babel 7 alpha版本。你的里程可能会有所不同

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

原:

实现这一功能的功能目前处于阶段1:可选链接。

https://github.com/tc39/proposal-optional-chaining

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

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

不,在ES6中没有空传播运算符。你必须选择一个已知的模式。

不过,你可以使用析构:

({thing: aThing} = possiblyNull);

有很多关于在ES7中添加这样一个操作符的讨论(例如这个),但直到几年后可选的链接语法在ES2020中标准化,才真正开始流行起来。

根据这里的列表,目前还没有建议将安全遍历添加到Ecmascript中。所以不仅没有很好的方法,而且在可预见的将来也不会加入。

编辑:由于这篇文章最初是我写的,所以它实际上是被添加到语言中的。