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
我们从文档中可以知道当我们想进行强制类型转换时,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));
结果为:
对象转字符串,数字
通过调用特殊的对象转换方法来完成,在js中有两个方法来执行转换,这两个方法所有的对象都具备,就是用来把对象转换为原始值的。这两个方法分别为toString(),valueOf()
,这两个方法对象的构造函数原型上就有,其目的就是要有办法把对象转换为原始类型。
对象转字符串
toString()方法除了Null和Undefined其他的数据类型都具有此方法。通常情况下toString()和String()效果一样。
我们在文档中重点关注对象转字符串,上图中对象转字符串有两个步骤,先是执行自带的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