有没有办法将 undefined.undefined 作为函数参数传递

时间:2021-01-12 16:48:43

标签: javascript

我想检查对象是否有一个带值的字段,如果没有则返回默认值..

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

所以我需要在没有任何三元 ?: 运算符的情况下传递任何对象并测试其值。

4 个答案:

答案 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')