js中的数据类型隐式转换的三种情况
js的数据类型隐式转换主要分为三种情况:
1. 转换为boolean类型
2. 转换为number类型
3. 转换为string类型
转换为boolean类型
数据在逻辑判断和逻辑运算之中会隐式转换为boolean类型
转换规则表:
数据类型转换之后的值
数字 0false
NaN false
空字符 ”false
null false
undefined false
⾮0数字true
⾮空字符串true
⾮null对象类型true
注意:如果使⽤new操作符创建的对象隐式转换为boolean类型都是true,哪怕是new String(”);
提⽰:连续使⽤两个⾮操作符(!!)可以将⼀个数强制转换为boolean类型,这在开发之中⽐较实⽤。
转换为string类型和转换为number类型
我将这两个放在⼀起总结是因为⼀个数到底转换为string还是number受到运⾏环境和操作符的影响,⽽不像上⾯转换为boolean类型这么固定。
先说运⾏环境对数据类型隐式转换的影响
很多内置函数期望传⼊的参数的数据类型是固定的,如:alert(value)⽅法,它期望传⼊的value值是⼀个string类型,但是如果我们传⼊的是number类型或者object类型等⾮string类型的数据的时候,就会发⽣数据类型的隐式转换。这就是环境运⾏环境对数据类型转换的影响。
操作符也会影响数据的类型转换
1.    当+号作为⼀元操作符操作单操作数的时候,他就会将这个数转换为数字类型
2.    当+号作为⼆元操作符时,如果两个操作数中存在⼀个字符类型的话,那么另外⼀个操作数也会⽆条件地转换为字符串
3.    当+号作为⼆元操作符时,如果两个操作数⼀个都不是字符串的话,两个操作数会隐式转换成数字类型(如果⽆法成功转换成数字,则变成NaN,再往下操作),再进⾏加法算数操作
4.    当算数运算的操作符是+号以外的其他操作数时,两个操作数都会转成数字类型进⾏数字运算。
所以我们应该这样来判断:
1. ⾸先看该数据是否被操作符操作,如果被操作符操作了,遵循上⾯操作符对数据转换影响的原则来进⾏数据的转换
2. 如果该数据没有被操作符操作,那么就观察它所在具体程序环境之中,如果是alert()这样的参数环境中,如果改数据不是字符串,那就肯定要转换了
数据类型如何转换成string类型或者number类型
数据类型转换成字符串或者数字都会遵循⼀个原则:如果该数据是简单数据类型,则直接转换成字符串或者数字类型。如果该数据是复杂数据类型,那么先通过固定的⽅法将复杂值转换为简单数据,再转成字符串或者数字。
简单数据转换字符串对照表:
原始数据类型转换之后的值
数字类型数字类型的字符表⽰
字符串不做任何改变
null‘null’
undefined‘undefined’
布尔类型true变’true’,false变’false’
这样的转换调⽤了js引擎内部的TOString()操作,这个⽅法我们通过ES语⾔是⽆法访问调⽤的。
简单数据转换数字对照表:
原始数据类型转换之后的值
数字类型不做任何改变
空字符 ”0
⾮空字符串将字符内的数据内容变为数据,如果还有其他符号中⽂等转为NaN
true1
false0
null0
undefined NaN
NaN NaN
复杂对象如何转换为简单值
⼀个复杂对象在转为基础类型的时候会调⽤ToPrimitive(hint)⽅法来指定其⽬标类型。如果传⼊的hint值为number,那么就先调⽤对象的valueOf()⽅法,调⽤完valueOf()⽅法后,如果返回的是原始值,则结束ToPrimitive操作,如果返回的不是原始值,则继续调⽤对象的toString()⽅法,调⽤完toString()⽅法之后如果返回的是⼀个原始值,则结束ToPrimitive操作,如果返回的还是复杂值,则抛出异常。如果传⼊的hint值为string,则先调⽤toString()⽅法,再调⽤valueOf()⽅法,其余的过程⼀样。
那么复杂对象是以什么标准来判断ToPrimitive(hint)操作传⼊的hint值到底是number还是string呢?
1.    如果运⾏环境⾮常明确的需要将⼀个复杂对象转换为数字则传⼊number如 Number(value) 和 +value 则传⼊number
js的基本数据类型
2.    如果运⾏环境⾮常明确的需要将⼀个复杂对象转换为字符串则传⼊string如String(value) 和 alert(value) 则传⼊string
3.    如果是⽤+号连接两个操作数,操作数在确定确定其中只要有⼀个为字符串的时候另外⼀个操作数会转为字符串,ToPrimitive()会传⼊string,但是如果两个操作数都不能确定是字符串的时候则默认传⼊
number(Date对象是⼀个例外,它会默认传⼊string)进⾏数据类型转换。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。