JavaScript - 在运行时仅更改SPECIFIC对象字段值

时间:2016-09-26 13:31:12

标签: javascript javascript-objects

我有这个JS代码:

<script type="text/javascript">

  var triangle = new Object();

  triangle.sideA = 3;
  triangle.sideB = 4;
  triangle.sideC = 5;

  triangle. getArea = function () {
  // Return the area of a triangle using Heron's formula
  var sp = (this.sideA + this.sideB + this.sideC) / 2;
  var calc = sp * (sp - this.sideA) * (sp - this.sideB) * (sp - this.sideC);
  return Math.sqrt( calc );
  };

  alert ("area is: " + triangle.getArea());

  //triangle.sideA = 30;
  //triangle.sideB = 40;
  triangle.sideC = 50;

  alert ("now area is: " + triangle.getArea());

</script>

首次alert调用会显示正确的值。 第二个alert调用显示 NaN

如果我取消注释两条注释行(将新值设置为sideAsideB,则第二个alert调用也会显示正确的值。

我在做什么/我明白错了?

谢谢。

3 个答案:

答案 0 :(得分:1)

如果将C面设置为50,则calc的公式将返回负数。

请参阅https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sqrt

Math.sqrt返回NaN作为否定参数。

答案 1 :(得分:0)

您所拥有的公式是尝试计算负数的平方根。我添加了一个额外的警报来显示你在做什么。

&#13;
&#13;
  var triangle = new Object();

  triangle.sideA = 3;
  triangle.sideB = 4;
  triangle.sideC = 5;

  triangle. getArea = function () {
  // Return the area of a triangle using Heron's formula
  var sp = (this.sideA + this.sideB + this.sideC) / 2;
  var calc = sp * (sp - this.sideA) * (sp - this.sideB) * (sp - this.sideC);
     alert( calc);
  return Math.sqrt( calc );
  };

  alert ("area is: " + triangle.getArea());

  //triangle.sideA = 30;
  //triangle.sideB = 40;
  triangle.sideC = 50;

  alert ("now area is: " + triangle.getArea());
&#13;
&#13;
&#13;

答案 2 :(得分:0)

calc会产生一个负数&#34; -382815.5625 &#34;。

所以Math.sqrt( calc ) = NaN。

您提供了对象triangle属性( sideA = 3 sideB = 4 sideC = 5 ),之后你将sideC更改为 50 ,但sideA和sideB仍为3&amp;分别为4。然后我们有

var sp = (3 + 4 + 50) / 2; = 28.5 var calc = 28.5 * (28.5 - 3) * (28.5 - 4) * (28.5 - 50); = -382815.5625

当你取消注释2行时,你的代码会起作用,因为那时数字不是负数。

我建议您在测试代码时使用console.log()和控制台而不是alert(),这样会更容易使用。