结果我在最后一个函数中的一个数字旁边得到了 NaN
Posted
技术标签:
【中文标题】结果我在最后一个函数中的一个数字旁边得到了 NaN【英文标题】:i'm getting NaN as a result beside a number in the last function 【发布时间】:2020-06-13 13:35:24 【问题描述】:var john =
name: 'John Smith',
bills: [124,48,268,180,42],
tips : [],
final: [],
calcTips: function()
for(i = 0; i < this.bills.length;i++)
if(this.bills[i] < 50)
this.tips[i] = this.bills[i] * 0.2;
this.final[i] = this.bills[i] + this.tips[i];
else if(this.bills[i] >= 50 && this.bills[i] <= 200)
this.tips[i] = this.bills[i] * 0.15;
this.final[i] = this.bills[i] + this.tips[i];
else
this.tips[i] = this.bills[i] * 0.1;
this.final[i] = this.bills[i] + this.tips[i];
;
var mark =
name: 'Mark Smith',
bills: [77,375,110,45],
tips : [],
final: [],
calcTips: function()
for(i = 0; i < this.bills.length;i++)
if(this.bills[i] < 100)
this.tips[i] = this.bills[i] * 0.2;
this.final[i] = this.bills[i] + this.tips[i];
else if(this.bills[i] >= 100 && this.bills[i] <= 300)
this.tips[i] = this.bills[i] * 0.1;
this.final[i] = this.bills[i] + this.tips[i];
else
this.tips[i] = this.bills[i] * 0.25;
this.final[i] = this.bills[i] + this.tips[i];
;
function calcAverage(tips)
var sum = 0;
for(i = 0; i < tips.length ; i++)
sum = tips[i] + sum;
return sum / tips.length;
mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
mark.calcTips();
john.calcTips();
console.log(john);
console.log(mark);
函数 calcAverage 在平均值之外返回 NaN。 我对其进行了编码,因此它将循环提示数组并将提示加上总和添加到 sum 变量中。 有人能解释一下这个问题吗?
【问题讨论】:
当tips.length == 0
,你会得到0 / 0
,这确实是NaN
。
【参考方案1】:
据我所知,平均小费是在小费实际存在之前计算的。如果你移动上面提示的计算,它应该可以正常工作:
mark.calcTips();
john.calcTips();
mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
console.log(john);
console.log(mark);
【讨论】:
【参考方案2】:尝试调用这些函数
mark.calcTips(); john.calcTips();
之前
mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
因为调用 calcAverage() 函数时提示是空数组
代码应该是
mark.calcTips();
john.calcTips();
mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
【讨论】:
【参考方案3】:当您调用该函数时,问题围绕着“this”绑定。你可以看到calcTips
是使用apply() 调用的,但是我只是出于演示目的提取了该函数;这段代码仍然可以改进,但没有太大改变,所以你可以看看会发生什么;
查看代码sn-p:
var john =
name: "John Smith",
bills: [124, 48, 268, 180, 42],
tips: [],
final: []
;
var mark =
name: "Mark Smith",
bills: [77, 375, 110, 45],
tips: [],
final: []
;
function calcTips()
for (let i = 0; i < this.bills.length; i++)
if (this.bills[i] < 100)
this.tips[i] = this.bills[i] * 0.2;
this.final[i] = this.bills[i] + this.tips[i];
else if (this.bills[i] >= 100 && this.bills[i] <= 300)
this.tips[i] = this.bills[i] * 0.1;
this.final[i] = this.bills[i] + this.tips[i];
else
this.tips[i] = this.bills[i] * 0.25;
this.final[i] = this.bills[i] + this.tips[i];
function calcAverage(tips)
var sum = 0;
for (i = 0; i < tips.length; i++)
sum = tips[i] + sum;
return sum / tips.length;
//calling calcTips with "this" refers to mark
calcTips.apply(mark);
//calling calcTips with "this" refers to john
calcTips.apply(john);
mark.Average = calcAverage(mark.tips);
john.Average = calcAverage(john.tips);
console.log(john);
console.log(mark);
【讨论】:
【参考方案4】:你在调用calcAverage
之前调用calcTips
,所以数组是空的。 calcAverage
以 return sum / tips.length
结尾。因为sum
是0
和tips.length
是0
,那就是NaN
(在javascript 中,0/0
是NaN
,因为JavaScript 使用IEEE 754 双精度浮点数,它指定了这种行为)。
修复它:
-
当
tips.length
是0
时不要划分sum
,并且
在计算平均值之前先计算小费。
【讨论】:
你最后的说法是错误的。试试console.log(1.0 / 0);
。在 C/C++ BTW 中也是错误的,并且可能在浮点格式支持 +inf
和 -inf
的其他语言中也是错误的。
非常感谢。不敢相信我犯了这种错误:P
即使1 / 0
也不会返回NaN
(尽管在类型化语言中不会出现这种情况)。
console.log(typeof (50 / 0)); // -> number
无穷大是一个数字
@goodvibration - 谢谢!修复。这就是我快速发帖并去吃晚饭的结果。是0 /
0`(OP 正在做的)导致NaN
。 x / 0
其中x
不是NaN
或0
导致Infinity
或-Infinity
。请注意,这与 JavaScript 的松散类型没有任何关系。 NaN
、Infinity
等都是number
类型(IEEE-754双精度浮点)。这完全符合 IEEE 754-2019 规范。以上是关于结果我在最后一个函数中的一个数字旁边得到了 NaN的主要内容,如果未能解决你的问题,请参考以下文章
js中的三大特殊数据:undefined,null,NaN及逻辑分支(选择结构,分支结构)