如何更好地处理这件事。
this.state.updateItem?this.state.updateItem.unit:'Unit';
我试过过this.state.updateItem.unit || ' Unit',但是它发现它会产生错误,因为this.state.updateItem为NULL然后它找不到任何单位属性。
如何以更好的方式做到这一点?
答案 0 :(得分:14)
现在你必须这样做:
(this.state.updateItem || {}).unit || 'Unit'
对optional chaining的ES(JavaScript)提出第一阶段建议,我们(最终希望)能够做到这样的事情:
this.state.updateItem?.unit || 'Unit'
如果你正在做babel,你现在可以使用它!: https://www.npmjs.com/package/babel-plugin-transform-optional-chaining
答案 1 :(得分:5)
您可以尝试将空对象设置为默认值:
(this.state.updateItem || {}).unit || 'Unit'
unit 将始终具有值或未定义。
答案 2 :(得分:1)
这是使用es6解构和默认值的方法:
const {
updateItem: {
unit = 'Unit'
} = {}
} = this.state;
然后您可以使用unit
答案 3 :(得分:0)
你可以这样做。
const path = (pathString, obj) =>
pathString.split(".")
.reduce((obj = {}, key) => obj[key], obj);
const defaultTo = (x, y) => y == null ? x : y;
// in your own code
const unit = defaultTo(
"Unit",
path("state.updateItem.unit", this)
);
这些函数已经以类似的方式存在于ramda或lodash / fp等库中。
它也减少了对obj?.state?.updateItem?.unit
无处不在的需求,尽管它显然并不完美。
答案 4 :(得分:0)
之前对这个问题的回答不再相关。
截至 2020 年年中,一个 Nullish Coalescing Operator 已添加到官方 ECMAScripts 中。它是一个真正的空合并运算符,因为它的行为与您期望的空合并运算符的行为一样。运算符的 JavaScript 语法实现源自其他几种编程语言使用的语法,因此经验丰富的资深开发人员可能会熟悉它,即使他们在编写 JavaScript 时从未使用过它。
const varAlpha = varBeta ?? varGamma;
<块引用>
“如果 varAlpha not null 并且 not 未定义,则 Nullish-Coalescing 运算符返回 varBeta 的值,否则返回 varGamma。”
let varAlpha = varBeta ?? varGamma;
// Equates to:
let varAlpha = (varBeta !== null && varBeta !== undefined)
? varBeta
: varGamma;