JS中的数据类型转换

由于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]"

参考资料

  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值