注册
web

JS令人头疼的类型转换

前言


JS中的类型转换常常被人诟病,因为javascript属于弱类型语言,它对于类型的语言没有强制的限定,这对于我们来说是头疼的。不同的类型之间的运算需要先对数据的类型进行转换,在日常开发中我们经常会用到。


数据类型


基本数据类型



  • Number(数字)
  • String(字符串)
  • Boolean(布尔)
  • Null
  • Undefined
  • Symbol(ES6)

引用数据类型



  • object{}
  • array[]
  • function(){}
  • date()

由于JS中拥有动态类型,在定义的时候不用指定数据类型,赋值的时候可以将任意类型赋给同一个变量,例如:let a = 1; a = '1'


类型转换


什么是类型转换?


简单来说就是将值从一种数据类型转换为另一种数据类型的过程。


分为哪几种?


根据转换的特点分为:显式类型转换(强制转换)和隐式类型转换(自动转换)。


显示类型转换(强制转换)


通过Boolean()——原始值转布尔,Number()——原始值转数字,String()——原始值转字符来进行强制类型转换。这里的转换规则可以直接查看Js官方文档:Annotated ES5


1.png


2.png


我们从文档中可以知道当我们想进行强制类型转换时,js会自动会帮我们使用ToString(value),ToNumber(value)进行转换。


//原始值转布尔
console.log(Boolean('123'));
console.log(Boolean(123));
console.log(Boolean(null));
console.log(Boolean(undefined));
console.log(Boolean(true));

//原始值转数字
console.log(Number('123'));
console.log(Number(123));
console.log(Number(null));
console.log(Number(undefined));
console.log(Number(true));

//原始值转字符串
console.log(String('123'));
console.log(String(123));
console.log(String(null));
console.log(String(undefined));
console.log(String(true));

结果为:


3.png


对象转字符串,数字


通过调用特殊的对象转换方法来完成,在js中有两个方法来执行转换,这两个方法所有的对象都具备,就是用来把对象转换为原始值的。这两个方法分别为toString(),valueOf(),这两个方法对象的构造函数原型上就有,其目的就是要有办法把对象转换为原始类型。


对象转字符串


toString()方法除了Null和Undefined其他的数据类型都具有此方法。通常情况下toString()和String()效果一样。



4.png


我们在文档中重点关注对象转字符串,上图中对象转字符串有两个步骤,先是执行自带的ToPrimitive(obj,String),再返回执行结果,分以下几步:


1.判断obj是否为基本类型,是则返回


2.调用对象自带的toString方法,如果能得到一个原始类型,则返回


3.调用对象自带的valueOf方法,如果能得到一个原始类型,则返回


4.报错


对象转数字

对象转数字的话也同样是有两个步骤:先是执行自带的ToPrimitive(obj,Number),再返回执行结果,分以下几步:


1.判断obj是否为基本类型,是则返回


2.调用对象自带的valueOf方法,如果能得到一个原始类型,则返回


3.调用对象自带的toString方法,如果能得到一个原始类型,则返回


4.报错


隐式类型转换



  • 当 + 运算作为一元操作符时,会自动调用ToNumber()处理该值。(相当于Number())

例如:console.log(+'123');结果为数字123。
console.log(+[]);结果为0,因为对象[]转换为了0。



  • 当 + 运算作为二元操作符,例(a + b)

1.lprim = ToPrimitive(v1)


2.rprim = ToPrimitive(v2)


3.如果lprim是字符串或者rprim是字符串,则返回ToString(lprim)和ToStringrprim()的拼接结果


4.返回ToNumber(lprim) + ToNumber(rprim)


结语


js类型转换规则,相当于历史事件,是已经规定好的,弄清楚它,能更好地和面试官侃侃而谈。最后感谢各位的观看。


作者:一拾九
来源:juejin.cn/post/7224518612161593402

0 个评论

要回复文章请先登录注册