问题 ES6速记对象密钥检查


很想知道ES6中是否有任何部分可以使这些检查更简洁:

componentWillReceiveProps(nextProps) {
    if(nextProps && nextProps.filterObj && nextProps.filterObj.area){
        // go ahead
    }
}

12363
2018-05-22 11:05


起源

你想阅读还是修改?对于阅读,你可以解构它。 - zerkms
简短的回答是否定的。我不明白解构会如何帮助。 var { filterObj: { area } } = nextProps; 将返回相同的错误 nextProps.filterObj.area 将。


答案:


不,没有存在主义的运营商进入ES6;它是 还在讨论中 然而。

你可以使用任何一个 现有方法当然,喜欢

if ( ((nextProps||{}).filterObj||{}).area ) {
    // go ahead
}

您也可以尝试解构和默认值:

function componentWillReceiveProps({filterObj: {area} = {}} = {}) {
    if (area) {
        // go ahead
    }
}

11
2018-05-22 12:32



这种方法的问题是它会吞下零,空字符串和数组。正确的方法是比较 undefined 但它使代码太笨重了。 - lolmaus - Andrey Mikhaylov
@ lolmaus-AndreyMikhaylov:我不明白为什么它会吞下零和空字符串,当你想要访问价值的另一个属性时,你肯定不会指望这些吗?如果你的意思是 .area你肯定能追加一个 !== undefined 比较。不,它肯定不会吞下数组。 - Bergi
例如,你想要的 3 是一个默认值,但是 0 也是一个合法的价值观。如果你这样做 value||3,传递零是不可能的。 - lolmaus - Andrey Mikhaylov
@ lolmaus-AndreyMikhaylov:你在这里使用的唯一默认值是 {}  - 访问属性时,我们只将对象视为合法值。 - Bergi