javascript的非数值转换为数值和NaN

javascript有3个函数可以把非数值转换为数值:Number()、parseInt()、parseFloat()。

=================================================================

Number()可以用于任何数据类型(此函数平时很少使用)。

parseInt()、parseFloat()专门用于把字符串转换成数值(比较常用的哦)。

=================================================================

虽然Number()不常用,但是我们还是要说下它的转换规则:

【1】如果是Boolean值,true和false将分别被转换为1和0。

【2】如果是数字值,只是简单的传入和返回。

【3】如果是null值,返回0。

【4】如果是undefined,返回NaN。

【5】如果是字符串,遵循下列规则:

      1)、如果字符串中只包含数字(包括前面带正号或负号的情况),则将其转化为十进制数值,既"1"变成1,"123"变成123,但是"012"会变成11(注意:前导的零被忽略了);

      2)、如果字符串中包含有效的浮点格式,如"1.1",将其转换为对应的浮点数值(同样也会忽略前导零);

      3)、如果字符串中包含有效的十六进制格式,如"0xf"则将其转换为相同大小的十进制整数值;

      4)、如果字符串是空的(不包含任何字符),则将其转换为0;

      5)、如果字符串中包含除上述格式之外的字符,则将其转换为NaN;

【6】如果是对象,则调用对象的valueOf方法,然后依照前面的规则转换返回的值。如果转换的结果是NaN,则调用对象的toString()方法,然后再次依照前面的规则转换返回的字符串值。

说了这么多,大家看下例子吧:

var num1 = Number("Hello world");      //NaN
var num2 = Number("");                 //0
var num3 = Number("000011");           //11
var num4 = Number(true);               //1

 由于Number()函数在转换字符串时比较复杂而且不够合理,因此在处理函数的时候更常用parseInt()函数。

===================================================================================

【1】parseInt():从字符串中提取整数,遇到非数字,就停止,不在看后面的。

【2】parseInt()函数能够识别出各种整数格式(2、8、10、16进制度),默认是10进制。

如果要转换其他进制,要带上第二个参数:转换时使用的基数(即多少进制),默认10进制可以不带第二个参数。

【3】parseInt()函数在下面情况会提示NaN:

              1)、第一个字符不是数字字符或者负号;

              2)、转换空字符串

下面来看点示例:

var num1 = parseInt("22.5");               //22
var num2 = parseInt("1234blue");           //1234
var num3 = parseInt("blue1234");           //NaN
var num4 = parseInt("");                   //NaN


var num5 = parseInt("AF", 16);             //175(指定了16作为第二参数,字符串可以不带前面的"0x")


var num6 = parseInt("10", 2);              //2(按二进制解析)
var num7 = parseInt("10", 8);              //8(按八进制解析)
var num8 = parseInt("10", 10);             //10(按十进制解析)
var num9 = parseInt("10", 16);             //16(按十六进制解析)

由于parseInt()函数可以解析很多进制,为了避免错误解析,我们建议无论在什么情况下都要指定基数。

===============================================================================

【1】parseFloat():提取第一个浮点数,即小数。也可以理解为,字符串中的第一个小数点有效,第二个小数点无效,因此它后面的字符串将被忽略。

举个例子:"22.34.5"会被转换为22.34。

【2】parseFloat()转换规则:

                      1)、只解析十进制值,没有第二参数指定基数的用法。

                      2)、与parseInt()有区别,parseFloat()会始终忽略前导的零。

                      3)、可以十八前面讨论的所有浮点数值格式,也包括十进制整数格式,但十六进制格式的字符串则始终会被转换成0。

                      4)、如果字符串包含的是一个可解析为整数的数(没有小数点,或是小数点后面都是零),则返回整数。

下面看下示例:

var num1 = parseFloat("22.5");               //22.5
var num2 = parseFloat("22.34.5.6");          //22.34
var num3 = parseFloat("1234blue");           //1234
var num4 = parseFloat("0xA");                //0(十六进制)
var num5 = parseFloat("0908.5");             //908.5(忽略前导零)
var num6 = parseFloat("3.125e7");            //31250000(没有小数点,或者小数点后面都是零)

==============================================================================

【1】上面提到了NaN,那什么的NaN?

答:不是数值(非数值),字面全拼为:Not a Number

【2】NaN的作用是什么???

答:用于表示一个本来要返回数值的操作数未返回数值的情况(这样就不会抛出错误了)。

【3】NaN的特性是什么???

答:1)、任何涉及NaN的操作(例如NaN/10)都会返回NaN,这个特点在多步计算中有可能导致问题。

     2)、NaN与任何值都不相等,包括NaN本身

     3)、在ECMAScript中,任何数值除以0都会返回NaN,因此不会影响其他代码的执行。(这里有一点要指出,任何数值除以0都会返回NaN,这是原书的说法,但实际上只有0除以0才回返回NaN,正数除以0返回Infinity,负数除以0返回-Infinity)

下面看一个例子:

alert(NaN == NaN);      //false

【4】什么是isNaN()函数???

答:这个函数接受一个参数,该参数可以是任何类型,而函数会帮我们确定这个参数是否“不是数值(NaN)”。

【4】isNaN()函数的特点是什么???

答:1)、在接收到一个值后,会尝试将这个值转换为数值。

     2)、某些不是数值的值会直接转换为数值,例如字符串"10"或是Boolean值

     3)、任何不能被转换为数值的值都会导致这个函数返回true。

     4)、也适用于对象,在使用时会首先调用对象的valueOf()方法,然后在确定该方法返回的值是否可以转换为数值,如果不能,则基于这个返回值在调用toString()方法,再测试返回值。

下面看下示例:

alert(isNaN(NaN));             //true
alert(isNaN(10));              //false(10是一个数值)
alert(isNaN("10"));            //false(可以被转换成数值10)
alert(isNaN("blue"));          //true(不能转换成数值)
alert(isNaN(true));            //false(可以被转换成数值1)
原文地址:https://www.cnblogs.com/huige728/p/3085226.html