js是一门弱类型的语言,类型转换不可避免
一、显式类型转换
1.toString()方法
js的内置对象都重写了这个方法,用来返回字符串(Object.prototype.toString.call(obj)判断数据类型)
var num=10; num.toString();//'10' //toString函数接受参数表示返回字符串按什么进制 var num=10; num.toString(2);//'1010'
2.parseInt()方法转换而数字,第一个参数是待转换的原字符串,第二个参数表示原字符串的进制
var str=parseInt('10',8);//8
3.强制转换,利用构造函数
Boolean(0);//false Boolean(new Object());//true Boolean([]);//true Number([]);//0 Number(undefined);//NaN Number(null);//0 String(null);//'null' String([]);//''
二、隐式转换
1.基本类型的转换
1.四则运算,加减乘除
1.对于加法+,只要两个操作数中有一个String类型,数字转成字符串,只有一个操作数时则返回数字
var str='12'; var num=+str; console.log(typeof num);//number
2.其余的如-,*,/都是将操作符转为数字,不能转则返回NaN
3.>,<在两个操作数都是字符串情况下进行字符串比较,否则转为数字
12-'2';//10 12-'a';//NaN 12*'2';//24 12*'a';//NaN 12/'2';//6 12/'a';//NaN 12>'2';//true 12>'a';//false,字符串不能转成数字返回NaN,NaN与数字进行比较时都返回false 12<'a';//false
2.==
1.undefined等于null
2.字符串和数字比较时,字符串转为数字
3.数字和布尔值比较时,布尔转数字
4.字符串和布尔比较时,两者都转数字
'0' == 0;//true '0' == false;//true !!'0';//true null == undefined;//true undefined == false;//false,undefined!=false null == false;//false,null!=false
2.引用类型的转换
1.引用类型==比较的是引用的地址,只有指向同一个引用类型才会返回true
var arr=[]; console.log(arr==[]);//false var obj={}; console.log(obj=={});//false
2.引用类型转布尔值全为true
3.引用类型和基本类型的比较,先把引用类型转换成基本类型。
对象到字符串的转换经过了如下步骤:
1.如果对象具有toString()方法,则调用这个方法。如果它返回一个原始值,js将这个值转换成字符串,并返还这个字符串结果。
2.如果对象没有toString()方法,或者这个方法并不返回一个原始值,那么js将调用valueOf()方法。
3.否则,js无法从toString()或者valueOf()获得一个原始值,因此这时它将抛出一个类型错误异常。
对象到数字的转换过程首先尝试使用valueOf()方法:
1.如果对象具有valueOf()方法,后者返回一个原始值,则js将这个原始值转换成数字,并返回这个数字。
2.否则,如果对象具有toString()方法,后者返回一个原始值,则js将转换并返回。
(首先js转换成相应的字符串原始值,再继续将这个原始值转换成相应的数字类型,再返回数字)
3.否则,js抛出一个类型错误异常。
[] == false;//true,[].toString()==='' [0] == false;//true {} == true;//false,{}->NaN {} == false;//false {x:0} == true;//false {x:0} == false;//false
数组的toString方法返回由数组中每个元素的字符串形式拼接而成的一个以逗号分隔的字符串
数组的valueOf方法返回的还是数组
[].valueOf() === []
[].toString() === ''
{}.valueOf() === {}
{}.toString() === '[object Object]'