问题的描述在代码顶部的注释中给出。 我得到的输出是NaN而不是perimeter的整数
/*
* Implement a Polygon class with the following properties:
* 1. A constructor that takes an array of integer side lengths.
* 2. A 'perimeter' method that returns the sum of the Polygon's side lengths.
*/
class Polygon
{
constructor(sides)
{
this.sides = sides;
}
perimeter()
{
var per = 0;
for (var i = 0; i <= this.sides.length; i++)
{
per += this.sides[i];
}
return per;
}
}
这段代码运行上面的代码:
const rectangle = new Polygon([10, 20, 10, 20]);
const square = new Polygon([10, 10, 10, 10]);
const pentagon = new Polygon([10, 20, 30, 40, 43]);
console.log(rectangle.perimeter());
console.log(square.perimeter());
console.log(pentagon.perimeter());
答案 0 :(得分:0)
for
循环的限制在数组末尾超过1。
for (var i = 0; i <= this.sides.length; i++)
大小为length
的数组将以length - 1
作为最后一个索引。要解决此问题,请使用:
for (var i = 0; i < this.sides.length; i++)
答案 1 :(得分:0)
将<=
更改为<
,这样就不会越过sides
数组的范围:
for (var i = 0; i <= this.sides.length; i++)
针对:
for (var i = 0; i < this.sides.length; i++)
您可以使用reduce来总结自己的观点:
class Polygon {
constructor(sides) {
this.sides = sides;
}
perimeter() {
return this.sides.reduce((sum, side) => sum + side, 0);
}
}
const rectangle = new Polygon([10, 20, 10, 20]);
const square = new Polygon([10, 10, 10, 10]);
const pentagon = new Polygon([10, 20, 30, 40, 43]);
console.log(rectangle.perimeter());
console.log(square.perimeter());
console.log(pentagon.perimeter());
答案 2 :(得分:0)
其他答案是正确的,问题是i
会从数组末尾移出一个,这会给您带来麻烦。这是由于使用for循环迭代数组而引起的问题的说明。 i
仅与您要迭代的数组相关,并且很容易在我们{em>认为在i
和该数组与我们在代码中创建的数组不太相同。
因此,我建议使用类似reduce
的名称。您可能还使用forEach
并跟踪总和,但是reduce
迄今为止是总和的最佳选择,因为它被设计为可迭代并产生单个值。
这是它的外观:
class Polygon
{
constructor(sides)
{
this.sides = sides;
}
perimeter()
{
return this.sides.reduce((prev, curr) => prev + curr, 0);
}
}
const rectangle = new Polygon([10, 20, 10, 20]);
const square = new Polygon([10, 10, 10, 10]);
const pentagon = new Polygon([10, 20, 30, 40, 43]);
console.log(rectangle.perimeter());
console.log(square.perimeter());
console.log(pentagon.perimeter());