我想检查对象是否有一个带值的字段,如果没有则返回默认值..
function testFun(value, defaultvalue) {
if (!value) {
console.log(defaultvalue)
} else {
console.log(value)
}
}
let testVar
testFun(testVar, 'this is default vaue')
但是这个函数应该不关心传递值... 如果我想通过怎么办:
testVar.field1.value
当然会失败:
TypeError: Cannot read property 'field1' of undefined
所以我需要在没有任何三元 ?:
运算符的情况下传递任何对象并测试其值。
答案 0 :(得分:2)
最简单的方法是使用 Optional Chaining
function testFun(value, defaultvalue) {
if (!value) {
console.log(defaultvalue)
} else {
console.log(value)
}
}
let testVar
testFun(testVar, testVar?.field1?.value || 'Other default value')
答案 1 :(得分:1)
您无法对函数做任何事情来纠正错误,因为它发生在函数被调用之前。
如果您使用的 JS 引擎支持 optional chaining testFun(testVar?.foo.value, 'this is default vaue')
如果您没有该选项,则需要重新考虑此代码。
function testFun(value, defaultvalue) {
if (!value) {
console.log(defaultvalue)
} else {
console.log(value)
}
}
let testVar
testFun(testVar?.foo.value, 'this is default value')
如果你不这样做,你将不得不做某种真实的检查
function testFun(value, defaultvalue) {
if (!value) {
console.log(defaultvalue)
} else {
console.log(value)
}
}
let testVar
testFun(testVar && testVar.foo && testVar.foo.value, 'this is default value')
或者您必须更改代码以传递您要阅读的字段并让它在那里进行检查
function testFun(obj, key, defaultvalue) {
const value = obj && obj.key && obj.key.value;
if (!value) {
console.log(defaultvalue)
} else {
console.log(value)
}
}
let testVar
testFun(testVar, 'foo', 'this is default value')
答案 2 :(得分:0)
您可以使用 optional chaning。
const testVar = {
field1: null
};
const value = testVar.field1?.value;
console.log('Value:', value);
如果您不使用可选更改,则可以 destructure 对象,但请记住,嵌套值的父级必须默认为空对象。
const testVar = {
field1: {} // Needs to default to an object to extract value field
};
const { field1: { value } } = testVar;
console.log('Value:', value);
您也可以为该属性spread 默认值。但是您必须在对象的每个级别传播这些值。
const defaultProps = {
field1: {
value: null
}
}
const testVar = {
field1: {
value: 'foo'
}
};
const { field1 } = testVar;
const combined = { ...defaultProps, field1: field1 };
const { field1: { value } } = combined;
console.log('Value:', value);
答案 3 :(得分:0)
这对我有用:
function testFun(f, defaultvalue) {
try {
if (fn() === undefined) {
return defaultvalue
} else {
return f()
}
} catch (e) {
return defaultvalue
}
}
let testVar
testFun(() => testVar.field1.value, 'this is default vaue')