js隐式转换与强制转换

109 阅读2分钟

当不同类型的数据进行相等比较(==)或四则运算时,会先将数据转换成相同类型的值在进行运算。

引用类型转换规则:

  • 优先调用valueOf方法,如果对象不存在valueOf方法或者返回的数据不是基本类型,再调用对象的toString方法。
  • 如果对象不存在toString方法或者方法返回的数据不是基本类型,系统抛出异常。

当进行相等( a == b)比较时

  • 比较前,不能将 null 和 undefined 转换成其他任何值。null 和 undefined 相等
  • NaN 不与任何数值相等,包括自身
  • 当a和b都是引用类型时,比较两个是否是相同对象
  • 其他基本类型在比较时会先转换成number类型再进行比较
  • 引用类型与基本类型比较时,会转换成基本类型再用以上规则进行比较。

[] == ![]结果为true

  • a为数组类型,所以先通过a.valueOf()得到结果a本身;
  • 结果不是基本类型,再同过a.toString()方法得到结果'',结果为基本类型转换结束;
  • b为boolean类型,根据boolean类型转换规则,可知b的结果为false;
  • 所以表达式转换为 '' == false,再根据上面的相等转换规则可最后得出0 == 0;
  • 所以结果为[] == ![]结果为true。

与此有关的是一个1==2==3的面试题

const x = { val: 0, valueOf: () => { x.val++ return x.val }, } x == 1 && x == 2 && x == 3 //true

四则运算

  • 做加法(+)运算时,如果其中一个对象是string类型,则将另一个转换为string类型并拼接。
  • 当引用类型参与运算是,会运用上面的引用类型转换规则,得到基本类型数据,再运用上面的规则运算。
  • 其他情况下,非number基本类型数据都会通过Number方法将起转化为number再参与运算。

各类型转换结果对照表:

类型valueOftoString
string本身本身
number本身本身的字符串形式
boolean本身本身的字符串形式
undefiend本身本身的字符串形式
null本身本身的字符串形式
object本身'[object Object]'
function本身本身的字符串形式
array本身本身的字符串形式,数组元素转成字符串格式并以,分隔,相当于array.join(',')
date时间的时间戳,与getTime返回值相同返回日期的文本表示 ("Wed Dec 27 2019 15:09:48 GMT+0800 (中国标准时间)")

强制转换

parseInt()--把值转换成整数

parseFloat()--把值转换成浮点数

Boolean(value)——把给定的值转换成Boolean型;

Number(value)——把给定的值转换成数字(可以是整数或浮点数);

String(value)——把给定的值转换成字符串。