为什么这个块不起作用? 我使用了isNaN(),这有效,但不是这个,为什么?Javascript的行为很奇怪。
if( (typeof parseInt(returnedArr[count]) == 'number')
{
totalWorth= parseInt(totalWorth)+ parseInt(returnedArr[count]);
//document.write(returnedArr[count]);
}
法典:
function addWorth()
{
var table1= document.getElementById("tableNetWorths");
var rowCount1= table1.rows.length;
//var row1= table1.insertRow(rowCount1);
var arr= [];
for(var count = 0; count < rowCount1; count++)
{
arr.push(table1.rows[count].cells[1].innerHTML);
}
arr.shift();
return arr;
}
function showWorthSum()
{
var returnedArr= addWorth();
//returnedArr.push(addWorth());
totalWorth= 0;
var arrCount= returnedArr.length;
for(var count = 0; count < arrCount; count++)
{
if( (typeof parseInt(returnedArr[count]) == 'number')
{
totalWorth= parseInt(totalWorth)+ parseInt(returnedArr[count]);
//document.write(returnedArr[count]);
}
}
return parseInt(totalWorth);
}
如果我使用 isNaN,那么这有效,但不是这个,为什么?我的数组如下所示:
{"100", "200", "Asdasdadsa", "1"}
因为typeof NaN
"number"
:
console.log(typeof NaN);
NaN
是数字类型的特殊值*,而不是其自己的类型。
您尚未显示使用isNaN
的代码,但请注意,如果您将字符串传递到isNaN
中,它将在测试之前隐式转换为 number,以查看这样做的结果是否NaN
(就好像您已经调用了Number(x)
,或应用了一元+
或任何非加法数学运算 [-
,*
、/
等))。
分别:
- 请注意,
parseInt
会很乐意解析仅以数字开头的字符串,忽略其后面不是数字的部分。例如,parseInt("123abc")
是123
。 - 请注意,当在没有第二个参数的情况下使用时,
parseInt
将从字符串推断出数基数(基数),因此parseInt("0x10")
16
。
在处理用户输入时,通常最好有意处理这两种情况:
function parseIntStrict(str) {
str = str.trim();
if (!/^d+$/.test(str)) {
return NaN;
}
return parseInt(str, 10);
}
(请注意,这并不试图支持科学记数法输入;用户通常不会输入它。
对于浮点数:
function parseFloatStrict(str) {
str = str.trim();
if (!str) {
return NaN;
}
return +str;
}
(这确实支持科学记数法,但只是作为在移交给内置数字转换之前仅检查空白字符串的副产品。
将其应用于您的代码:
// I assume totalWorth is already a number
var entry = parseIntStrict(returnedArr[count]);
if (!isNaN(entry)) {
totalWorth = totalWorth + entry;
}
* 从技术上讲,根据 IEEE-754 JavaScript 使用的标准,NaN
是一系列值中的任何一个,都意味着"不是一个数字"。
这是因为数组中您认为是数字的值实际上是字符串。例如,100 是一个数字,但"100"是一个字符串。typeof 123 将返回"number",但 typeof '123' 将返回 'string'。 这意味着数组中的所有值都是字符串类型,如果使用该方法,代码将不会输入 if 语句。 但是,由于 isNaN 检查元素是否不是数字,因此您的代码将使用该元素。