一、数据类型
最新的ECMAScript标准定义了7种数据类型
基本数据类型:Boolean、Null、Undefined、Number、String、Symbol
引用数据类型:Object
二、显式类型转换
显示调用:Number函数、String函数、Boolean函数。
1、Number函数
数值:转换后还是原来的值。
字符串:如果可以被解析,则转换为相应的数值,否则得到NaN。空字符串转换为0。
布尔值:true转换为1,false转换为0。
undefined:转换为NaN。
null:转换成0。
console.log(Number(324)) //324
console.log(Number('324')) //324
console.log(Number('324abc')) //NaN
console.log(Number('')) //0
console.log(Number(undefined)) //NaN
console.log(Number(false)) //0
console.log(Number(true)) //1
console.log(Number(null)) //0
对象:先调用对象自身的valueOf方法,如果带方法返回原始类型的值(数值、字符串、布尔值),则直接对该值使用Number方法,不再进行后续步骤。如果valueOf方法返回符合类型的值,再调用对象自身的toString方法,如果toString方法返回原始类型的值,则对该值使用Number方法,不再进行后续步骤。如果toString方法返回的符合类型的值,则报错。
var a = {a:1}
console.log(Number(a))
//转换为NaN的过程,首先调用a.value(),结果是{a:1},不是基本数据类型,然后接着调用a.toString(),结果是"[Object Object]",然后字符串转换为NaN
2、String类型
数值:转为相应的字符串。
字符串:转换后还是原来的值。
布尔值:true转换为“true”,false转换为“false”。
undefined:转换为"undefined"。
bull:转换为"null"。
console.log(String(123)) //"123"
console.log(String('abc')) //"abc"
console.log(String(true)) //"true"
console.log(String(undefined)) //"undefined"
console.log(String(null)) //"null"
对象:先调用toString方法,如果该方法返回的是原始类型的值,则对该值使用String方法,不再进行以下步骤。如果toString方法返回的是符合类型的值,再调用valueOf方法,如果vlaueOf方法返回的是原始类型的值,则对该值使用String方法,不再进行一下步骤。如果valueOf方法返回的是复合类型的值,则报错。
var b = {
a:1
}
console.log(String(b)) //
//先调用b.toString()方法,然后得到"[Object Object]",返回的是String类型,然后它就不再向后继续调用。
var c = {
a:1,
toString:function(){
return {
b: 2
}
},
valueOf:function(){
return 'b'
}
}
console.log(String(c)) //'b'
//先调用c.toString()方法,返回的不是原始数据类型,接着调用valueOf()方法,返回的是原始数据类型,然后就输出'b',如果去掉valueOf()方法,则会报错
3、Boolean函数
undefined、null、-0、+0、NaN、""(空字符串) 转换后的结果都为false。除了前面的几个,其他都为true。
三、隐式类型转换
1、四则运算
2、判断语句
3、Native调用
4、常见的题目
{} + {} firforx的结果是NaN,他把{}当作代码块处理的。{} + []这里的结果是0,不论是chrom还是firforx都把{}当作了代码块。
5、typeof