有关在给定负数的情况下以“未定义”的形式返回函数的问题?

时间:2019-02-17 22:04:34

标签: javascript function ecmascript-6

我正在尝试编写代码,如果给出负数将返回undefined

我被要求使用Javascript中的函数计算矩形,三角形和圆形的面积。我说得对,但问题还显示“ 如果任何参数为负,则该函数应返回未定义的值。

function calculateRectangleArea (length, width) {
  return length * width;
}
function calculateTriangleArea (base, height) {
  return (base * height)/2;
}
function calculateCircleArea (radius) {
  return radius * radius * Math.PI;
}

我可以计算出正确的面积,但是如果要得到undefined的值为负数,我就无法弄清楚该写些什么。是这样的:

if (calculateRectangleArea <0) 
   return "undefined";

5 个答案:

答案 0 :(得分:4)

您需要在if语句中测试每个参数,以确保它不是负数,如果有任何负数,则返回undefined-否则,就像您已经在做的那样返回普通计算:

function calculateRectangleArea(length, width) {
  if (length < 0 || width < 0) {
    return undefined;
  } else {
    return length * width;
  }
}
function calculateTriangleArea(base, height) {
  if (base < 0 || height < 0) {
    return undefined;
  } else {
    return (base * height) / 2;
  }
}
function calculateCircleArea(radius) {
  if (radius < 0) {
    return undefined;
  } else {
    return radius * radius * Math.PI;
  }
}

或者,由于不返回任何值时,默认情况下返回undefined,因此,如果所有参数均为非负值,则也只能返回计算,例如:

function calculateRectangleArea(length, width) {
  if (length >= 0 && width >= 0) {
    return length * width;
  }
}

答案 1 :(得分:3)

因为您希望在未定义任何任何个参数时发生,请在some上使用[...arguments]

function calculateRectangleArea (length, width) {
  if ([...arguments].some(e => e < 0)) return undefined;
  return length * width;
}

对您的所有功能执行此操作。

答案 2 :(得分:1)

最简单,最易读的解决方案是在计算面积之前检查所有自变量是否为正,否则将返回undefined

例如(使用conditional operator):

function calculateRectangleArea (length, width) {
  return length < 0 || width < 0 ? undefined: length * width;
}

function calculateTriangleArea (base, height) {
  return base < 0 || height < 0 ? undefined : (base * height)/2;
}

function calculateCircleArea (radius) {
  return radius < 0 ? undefined: radius * radius * Math.PI;
}

(注意:对于圈子,您可以使用exponential operator(如果支持)

由于您已为所有计算定义了通用模式,因此可以一概而论。

基本上,您可以定义“保护”,仅在参数为正数的情况下执行给定函数,否则将返回undefined。尽管涉及参数和数学运算,但这种检查可以应用于所有计算。这是可能的,因为JS具有First-class functions

下面的示例使用spread syntaxarrow function,但也可以使用常规函数来完成它们:

// Takes a function as argument and returns a function 
// that will execute the function given only if all the arguments
// provided are positive, `undefined` otherwise:
const guard = fn => (...args) => args.some(arg => arg < 0) ? undefined : fn(...args);

const calculateRectangleArea = guard((length, width) => length * width);
const calculateTriangleArea = guard((base, height) => base * height /2);
const calculateCircleArea = guard(radius => radius ** 2 * Math.PI);

答案 3 :(得分:0)

您使用Math.abs()检查整数或十进制是否为负。 该代码将函数定义为对象的属性,并将函数定义为 如果传递给函数的参数之一为负,则使用.find()创建一个变量,该变量设置为undefined

const calculations = {
  calculateRectangleArea (length, width) {
    const n = this[Object.getOwnPropertySymbols(this)[0]](length, width) 
    return !n ? n : length * width
  },
  calculateTriangleArea (base, height) {
    const n = this[Object.getOwnPropertySymbols(this)[0]](base, height) 
    return !n ? n : (base * height)/2
  },
  calculateCircleArea (radius) { 
    const n = this[Object.getOwnPropertySymbols(this)[0]](radius) 
    return !n ? n : radius * radius * Math.PI
  },
  [Symbol('filter')](...props) {
    const n = props.find(n => Math.abs(n) !== n)
    // if `n` is not `undefined` `return` `void 0` else return `true`
    console.log(!n)
    return n !== undefined ? void 0 : !n
  }
}

console.log(
  calculations.calculateRectangleArea(0, 0) // `0`
, calculations.calculateTriangleArea(1, 2) // `1` 
, calculations.calculateCircleArea(-2, 1) // `undefined`
)

答案 4 :(得分:0)

我只是想感谢您提供的所有帮助!我设法解决了这个问题,但是让这个社区愿意介入并提供帮助确实很有帮助!我希望有一天我会好起来以回馈青睐。

谢谢!