为什么没有工作类型但是NaN的工作原理?

时间:2017-06-11 12:52:53

标签: javascript arrays web frontend

为什么这个块不起作用?我使用了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那么有效但不是这个,为什么?我的数组看起来像这样:

{&#34; 100&#34;,&#34; 200&#34;,&#34; asdasdadsa&#34;,&#34; 1&#34;}

2 个答案:

答案 0 :(得分:1)

因为typeof NaN"number"

&#13;
&#13;
console.log(typeof NaN);
&#13;
&#13;
&#13;

NaN是数字类型的特殊值*,而不是它自己的类型。

您还没有显示使用isNaN的代码,但请注意,如果您将字符串传递给isNaN,则会在测试之前将其隐式转换为数字,以查看结果这样做是NaN(就像你在其上调用了Number(x),或者应用了一元+或任何非加法数学运算[-,{{1 }},*等等。)。

单独:

  • 请注意,/会愉快地解析只有启动的字符串,并忽略其后面不是数字的部分。例如,parseIntparseInt("123abc")
  • 请注意,如果在没有第二个参数的情况下使用,123将从字符串中推断数字基数(基数),因此parseIntparseInt("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;
}

*从技术上讲,根据IEEE使用的IEEE-754标准,// I assume totalWorth is already a number var entry = parseIntStrict(returnedArr[count]); if (!isNaN(entry)) { totalWorth = totalWorth + entry; } 是一系列值中的任意一个,而不是数字。&#34;

答案 1 :(得分:-2)

这是因为您认为数字的数组中的值实际上是字符串。例如,100是一个数字,但是&#39; 100&#39;是一个字符串。 typeof 123将返回&#39; number&#39;,但typeof&#39; 123&#39;将返回&#39;字符串&#39;。 这意味着如果使用该方法,则数组中的所有值都是字符串类型,并且您的代码不会输入if语句。 但是,由于isNaN检查某个元素是否不是数字,因此您的代码将使用该代码。