由于JS属于弱类型语法
,所有的基本数据类型声明都用var,所以当不同类型的数据进行运算的时候就需要进行数据类型转换
;
JS的基本数据类型分为
number,string,null,undefined,boolean,symbol(ES6新增)
不属于基本数据类型的东西都属于对象,例如我们的函数,数组
数据类型转换又分为显示转换和隐式转换;
显示转换主要用到的三个API为:
Number:将数据类型转换为number类型;
String:将数据类型转换为string类型;
Boolean:将数据类型转换为boolean类型;
显示转换:
Number-----转换的对象为基本数据类型时
字符串:
Number(‘1’) //1
Number(‘1a’) //NaN
Number( ‘’ )(空字符串) //0
布尔类型:
Number(true) //1
Number(false) //0
null:
Number(null) //0
undefined:
Number(undefined) //NaN
Number-----转换的对象不为基本数据类型时
数组:
Number([ ]) //0
对象
Number({ }) //NaN
函数
Number(function(){ }) // NaN
原理:
这里需要注意的是valueOf和toString的计算都是分别根据需要转换的值来调用的
1.JavaScript 调用 valueOf() 方法用来把对象转换成原始类型的值(数值、字符串和布尔值) 默认情况下, valueOf() 会被每个对象Object继承。每一个内置对象都会覆盖这个方法为了返回一个合理的值,如果对象没有原始值,valueOf() 就会返回对象自身 2.每个对象都有一个 toString() 方法,当对象被表示为文本值时或者当以期望字符串的方式引用对象时,该方法被自动调用。对对象x,toString() 返回 “[object type]”,其中type是对象类型。如果x不是对象,toString() 返回x应有的文本值(不是单纯的加"")例如:[].toString()// "" [1,2,3].toSting() //'1,2,3'
我们拿出Number([ ]) 按照上面的原理来分析一下:
1.首先判断[ ]是否为基本类型–>不是
2.则进行[ ].valueOf()–>得出来的值还是[ ],不为基本数据类型-
3.再进行[ ].toString–>得出来的值为“”,为字符串,是基本数据类型
4.进行Number(""),得到结果0
String-----转换的对象为基本数据类型时
数字:
String(123) // “123”
布尔类型:
String(true) // “true”
String(false) // “false”
null:
String(null) // “null”
undefined:
String(undefined) //“undefined”
String-----转换的对象不为基本数据类型时
数组:
String([ ]) // " "
对象
String({ }) // “[object Object]”
函数
String(function(){ }) // “function (){}”
原理:
这里需要注意的是valueOf和toString的计算都是分别根据需要转换的值来调用的
我们拿出Number({ }) 按照上面的原理来分析一下:
1.首先判断 { } 是否为基本类型–>不是
2.则进行({ }).toString()–>得出来的值是"[object Object]",为字符串,是基本数据类型,返回此值
Boolean
布尔类型的转换除了下面的情况返回false
外,其余一律返回true
空字符串""
null
undefined
数字0
数字NaN
布尔值false
隐式转换:
一般会用到隐式转换的地方在于条件判断,比较运算和加法运算中
例如:
if(0)
{
console.log(1)
}
和
if(‘0’)
{
console.log(1)
}
结果就不一样
因为这里会在判断条件里面隐式将数据类型都转换为布尔型
,前面也提到过,除了那6种情况返回false
外,其余一律都是true
。
在进行"+"法运算的时候规则有如下规则:
1.一元运算符:
进行Number( )操作
例如:
+1 //Number(1) //1
+[ ] //Number([ ]) //0
+{ } //Number({ }) //NaN
2.二元操作符:
a.在都为基本数据类型的情况下:
若存在字符串则优先进行字符串加法(不为字符串类型的则隐式使用String转换为字符串类型),否则都数字加法(不为数字类型的则隐式使用Number转换为数字类型);
例如:
1+“2” // “12”
true+“2” //“true2”
1+true //2
1+null // 1
1+undefined //NaN
b.在存在非基本数据类型的情况下:
首先需要对数据进行基本类型的转换:先调用valueOf,若返回不是基本类型,再调用toString,当转换后都为基本数据类型后再按照a情况下的方法去进行操作;
例如:
[ ]+[ ] // “”
这里分析一下:[ ].valueOf=[ ]不为基本数据类型 ,然后[ ].toString="",为字符串,属于基本数据类型,进行字符串加法,最后结果为""
[ ]+{ } //"[object Object]"
对于{ }放在左边的情况,不同的浏览器不一样,有的会当做对象,有的则会当做是代码块
{ }+{ } //NaN(这个地方是当做了代码块使得整个变成了+{ }) 或者 “[object Object][object Object]”
.
注意:除了加法运算符(+)有可能把运算子转为字符串,其他运算符都会把运算子自动转成数值。
'2'-'1' //1
'2'*'3' //6
3.数据比较(非恒等)
(两个不同类型数据比较时隐式转换规则)
a.数字和字符串、布尔类型、数组、对象进行比较时:
先转换为数字(Number),再进行比较;
1=='1' //true
0==[] //true
1==true //true
0=={} //false
b.字符串和布尔类型、数组、对象进行比较时:
和布尔类型的比较是转换为数字类型进行比较
'true'==true //false
'1' == true //true
'' ==false //true
'0' ==false //true
和数组、对象的比较是转换为字符串再进行比较
'1' == [1] //true
'' == [] // true
'1,2' ==[1,2] //true
'' == {} //false
'[object Object]' == {} //true
c. undefined 除了和null进行非全等比较返回true,其它均返回false
d.数组和布尔型、数组进行比较时(和对象不相等)
和布尔型进行比较时,转换为数字再比较
[]==false //true
[1]==true //true
和数组比较是比较其地址
[1]==[1] //false
e.对象和布尔型不相等
4.条件运算都转换为布尔型
最后补充一点:
当然对于valueOf和toString方法我们可以自己重新定义:
例如
var a={
valueOf:function(){
return {}
},
toString:function(){
return "1"
}
}
Number(a) //1
String(a) // "1"
对比一下
var a={}
Number(a) //NaN
String(a) // "[object Object]"