javascript类型转换
javascript类型转换
1 类型
javascript中类型可以划分为两类,原始类型和复合类型。
1.1 原始类型
原始类型有number,string,boolean,undefined,null这五种类型
1.2 复合类型
原始类型之外的类型都是复合类型,如Object,Array,Date,RegExp等
2 类型转换
2.1 原始类型强制类型转换
原始类型之间的转换,可以通过构造函数进行强制转换,如:
- 转换成number:如Number('11')
- 转换成string:如String(11)
- 转换成Boolean:如Boolean(11)
2.2 原始类型之间相互转换规则
2.2.1 转换成number类型
- string转换成number类型时,空字符串转成0,其他值直接去掉引号,如"11"转成11,如果不能转成number,如11a,则返回NaN
- boolean转换成number类型,true转成1,false转为0
- null转换成number类型,转为0
- undefined转换成NaN
2.2.2 转换成string类型
所有其他原始类型转换成string类型时,直接在原值上加引号,如 11转为'11',null转为'null'
2.2.3 转换成boolean类型
- +0, 0, -0, NaN, null, undefined, ''转换成false
- 其他转换为true
2.3 原始类型与复合类型之间的转换
2.3.1 复合类型转化为原始类型
复合类型转化为原始类型,遵循以下两个规则:
- 转换为string时,先调用toString()方法,如果toString()方法返回的是原始类型,则结束,否则,继续调用valueOf()方法,如果valueOf()方法返回原始类型,则正常返回valueOf()的返回值,否则则返回[object 构造函数名]
String([]); // 调用toString方法,返回'' var ob = { toString: function () { console.log('call toString'); return []; }, valueOf: function () { console.log('call valueOf'); return 'valueOf'; } } String(ob) // call toString call valueOf "valueOf"
-
转化为boolean或number时,先调用valueOf()方法,如果valueOf()方法返回的是原始类型,则结束,否则,继续调用toString()方法,如果toString()方法返回原始类型,则正常返回toString()的返回值,否则则返回NaN
-
所有复合类型转化为boolean时,均为true
var a = new Boolean(false);
a && 2; //2
Number([]); // 调用toString方法,返回0
var ob = {
toString: function () {
console.log('call toString');
return [];
},
valueOf: function () {
console.log('call valueOf');
return 'valueOf';
}
}
Number(ob) // call valueOf NaN
2.3.2 原始类型转换为复合类型
直接调用new constructor转换,如new Number(22),new String('22')
3 隐式类型转换
javascript中隐式类型转换无处不在,==和!=比较时,if语句,函数参数中,都存在隐式类型转换,如果不熟悉类型转换规则,极容易出错
3.1 ==和!=比较引发的隐式类型转换
- ==和!=比较时,优化转换为number类型,其次是string类型,不会主动转化为boolean类型
var a = '1'; var b = 1; a==b; // true var c = 'true'; var d = true; c==d; // false,d优化转化成number,即1 b==d; // true,d优化转化成number,即1
- +号运算符操作时,优化转换为string类型,其次是number类型,不会主动转化为boolean类型
var a = '1'; var b = 2; var c = false; a + b; // '12' a + c; // '1false' b + c; // 2
- if语句中,转化为boolean值
除了+0, 0, -0, NaN, null, undefined, ''转换成false,其他所有类型(包括复合类型)的值都是true
var a = [0]; if (a) { console.log(a == true); } else { console.log("wut"); } /** 返回结果是false * if 语句中a是复合类型,所以是true * a == true使用==时存在隐式类型转换,true转换成1,a调用toString转换成"0","0"进一步转换成0,最终比较0==1,结果是false * /
- 函数参数中,根据函数参数类型要求转换
/**
* 6,parseInt要求传入两个参数(String, Number),
* 0.0000006超过6位小数,在js中表示为科学计算法6e-7,
* 转换为sting则为'6e-7',执行parseInt('6e-7'),结果为6.
*/
var a = parseInt(0.0000006); console.log(a);
javascript的类型和类型转换内容基本就这些,最后放一些简单测试,大家可以测试一下自己是否掌握了。
[] == ![] ['0'] == 0 'true' == true [] + ''
由于个人能力问题,可能存在一些纰露,如有问题,麻烦留言指出,欢迎讨论。

浙公网安备 33010602011771号