前言JavaScript是一种动态语言。所谓动态语言,可以暂时理解为语言中的一切都是不确定的。例如,一个变量,此时是一个整数,下一刻可能会变成一个字符串。虽然变量的数据类型是不确定的,但是各种运算符对数据类型都有要求。如果运算符发现运算符的类型不符合预期,会自动进行类型转换。本文主要介绍数据类型强制转换和自动转换,自动转换是建立在强制转换的基础上的。强制转换主要是指使用Number、String和Boolean三个函数,将各种类型的值和分布手动转换为数字、字符串或布尔值。一、强制转换1、将其他数据类型转换为String方法一:toString()方法调用转换后的数据类型的toString()方法。该方法不会影响原变量,返回转换后的结果,但注意:null和undefined这两个值没有toString,调用它们的方法会报错。vara=123a.toString()//"123"varb=null;b.toString()//"报错"varc=undefinedc.toString()//"报错"使用了toString()方法NumbertypeBase模式,可以使用不同的base来输出数字,比如二进制base是2,八进制base是8,十六进制base是16variNum=10;alert(iNum.toString(2));//输出"1010"alert(iNum.toString(8));//输出“12”alert(iNum.toString(16));//输出“A”方法二:String()函数使用String()函数进行强制类型转换,toString()方法实际上是针对Number和Boolean调用的,但是对于null和undefined,toString()方法会不被调用,会直接将null转为"null",undefined转为"undefined"vara=nullString(a)//"null"varb=undefinedString(b)//如果是"undefined"String方法的参数是一个对象,它返回一个字符串类型;如果是数组,则返回数组的字符串形式。String({a:1})//"[objectObject]"String([1,2,3])//"1,2,3"2.将其他数据类型转换为Number方法一:使用Number()下面分两种情况讨论函数,一种是参数是原始类型的值,另一种是参数是对象(1)原始类型值①字符串转数字Ⅰ如果是纯数字字符串,直接转为数字Ⅱ如果字符串中有非数字,转为NaNⅢ如果字符串为空字符串或全是空格,转为0Number('324')//324Number('324abc')//NaNNumber('')//0②Booleantonumber:trueto1,falseto0Number(true)//1Number(false)//0③undefinedtonumber:NaNNumber(undefined)//转换NaN④nulltonumber:convertto0Number(null)//0⑤Number()接受一个值作为参数。此时,它既可以识别负十六进制,也可以识别以0开头的八进制,返回值始终是十进制值Number(3.15);//3.15号(023);//19号(0x12);//18号(-0x12);//-18(2)object简单的规则是,当Number方法的参数是一个对象时,它将返回NaN,除非它是一个包含单个数值的数组。Number({a:1})//NaNNumber([1,2,3])//NaNNumber([5])//5方法二:parseInt()&parseFloat()这个方法专门用来处理字符串,parseInt()将字符串转为整数,可以取出字符串中有效的整数内容,然后转为Number。parseFloat()将字符串转换为浮点数。parseFloat()的功能与parseInt()类似,只是它可以获得有效的小数。console.log(parseInt('.21'));//NaNconsole.log(parseInt("10.3"));//10console.log(parseFloat('.21'));//0.21console.log(parseFloat('.d1'));//NaNconsole.log(parseFloat("10.11.33"));//10.11console.log(parseFloat("4.3years"));//4.3console.log(parseFloat("He40.3"));//NaNparseInt()在没有第二个参数的情况下默认将值转换成十进制,有第二个参数时根据第二个参数转换值,如果基数错误则返回NaNconsole.log(parseInt("13"));//13console.log(parseInt("11",2));//3console.log(parseInt("17",8));//15console.log(parseInt("1f",16));//31两者的区别:Number函数将字符串转换为值,比parseInt函数严格很多。基本上只要有一个字符不能转成数字,整个字符串都会转成NaN。parseInt('42cats')//42Number('42cats')//NaN上面代码中,parseInt对字符一个一个进行解析,Number函数将字符串作为一个整体进行类型转换。另外,空字符串的处理也不同。数字(””);//0parseInt("");//NaN3,其他数据类型转为Boolean,其转换规则比较简单:只有空字符串("")、null、undefined、+0、-0和NaN转为Boolean类型为false,其他为true,空数组,空对象转boolean类型也是true,连boolean对象newBoolean(false对应false)也是trueBoolean(undefined)//falseBoolean(null)//falseBoolean(0)//falseBoolean(NaN))//falseBoolean('')//falseBoolean({})//trueBoolean([])//trueBoolean(newBoolean(false))//true2.自动转换当遇到以下三种情况时,JavaScript会自动转换数据类型,即转换是自动完成的,对用户不可见。1、自动转换为布尔值当JavaScript遇到需要布尔值的地方(比如if语句的条件部分),它会自动将非布尔参数转换为布尔值。系统内部自动调用布尔函数。逻辑运算符!如果对非布尔值进行操作,则将其转换为布尔值,然后取反。所以我们可以利用这个特性将另一种数据类型转换成布尔值。我们可以将任意数据类型反转两次以将其转换为布尔值。原理和Boolean()函数一样。if('abc'){console.log('hello')}//"hello"2.自动转换为数值算术运算符(+-*/)当对非Number类型的值进行运算时,这些values会被转换为Number,然后进行操作,除了字符串相加true+1//22+null//2undefined+1//NaN2+NaN//NaN任何值和NaN都会得到NaN'5'-'2'//3'5'*'2'//10true-1//0'1'-1//0'5'*[]//0false/'5'//0'abc'-1//NaN一元运算符也将运算符转换为值。+'abc'//NaN-'abc'//NaN+true//1-false//03.自动转换为字符串字符串的自动转换主要发生在添加字符串的过程中。当一个值是字符串而另一个是非字符串时,后者被转换为字符串。'5'+1//'51''5'+true//"5true"'5'+false//"5false"'5'+{}//"5[objectObject]"'5'+[]//"5"'5'+function(){}//"5function(){}"'5'+undefined//"5undefined"'5'+null//"5null"三。总结1.强制各种情况转换2.自动转换各种情况只有空串(""),null,undefined,+0,-0和NaN转换为Boolean为false,除加法外其他均为true运算符(+)有可能将运算符转换为字符串,其他运算符会自动将运算符转换为值。一元运算符还将运算符转换为数字。字符串的自动转换主要发生在添加字符串的过程中。参考文章深入研究Javascript类型转换javasript标准参考教程
