一、JavaScript隐式转换
1. JS中两类数据类型
原始类型(基础类型):
Undefined、Null、String、Number、Boolean、Symbol
对象类型:
object
2. 转换规则
-
将值转换为原始值,ToPrimitive()
- ToPrimitive(input, PreferredType?)
- imput是要转换的值,PreferredType是可选参数,仅可以是Number或String类型
- 只是一个转换标志,转换后的结果不一定是这个参数的值的类型,但是转换结果一定是一个原始值
-
将值转换为数字,ToNumber()
-
将值转为字符串,ToString()
3. 基本类型的转换
加减乘除
- 字符串加数字,数字就会转换成字符串。在加法过程中,先将加号两边的数字进行求原值ToPrimitive()操作,只要有一个是String类型。就把两个或多个原始值转换为字符串ToString(),进行字符串拼接;否则把两个或多个原始值转换为数字ToNumber(),进行数字相加
- 数字减字符串,字符串转成数字。如果字符串不是纯数字就会转成NaN,两个字符串相减也先转换成数字。
- 乘、除、大于、小于和减的转换也是一样的
有关==的隐式转换
双等号两边比较,都会转换乘数字
- undefined == null //true
- ‘0’ == 0 //true 字符串转数字
- 0 == false //true 布尔转数字
- ‘0’ == false //true 两边都转数字
4. 引用类型的隐式转换
4.1 PreferredType值的设置规则:
- 该对象为Date类型,则PreferredType被设置为String
- 其他Object对象,PreferredType被设置为Number
4.2 PreferredType转换策略
-
如果PreferredType被标记为Number,则会进行下面的流程转换值
- 如果输入的值是一个原始值,直接返回它
- 否则,如果输入的是一个对象,调用该对象valueOf()方法,如果返回值是一个原始值,则返回这个原始值
- 否则,调用toString()方法,如果toString()方法返回的是一个原始值,返回这个原始值
- 否则,抛出异常
-
如果PreferredType被标记为String,则会进行下面的流程转换值
- 如果输入的值是一个原始值,直接返回它
- 否则,如果输入的是一个对象,调用toString()方法,如果toString()方法返回的是一个原始值,返回这个原始值
- 否则,调用该对象valueOf()方法,如果返回值是一个原始值,则返回这个原始值
- 否则,抛出异常
5. 案例
5.1 [] + [] // “”
进行ToPrimitive,两个都是Array对象,不是Date对象,所以以Number为转换标准,所以先调⽤valueOf(),结果还是[ ],不是原始值,所以继续调toString(),结果是“”(空字符串)原始值,将“”返回。第⼆个[ ]过程是相同的,返回“”。加号两边结果都是String类型,所以进⾏字符串拼接,结果是“”
5.2 [] + {} // “[object Object]”
进行ToPrimitive,依然是以Number为转换标准。[ ]的结果是“”。{ }先调⽤valueOf(),结果是{ },不是原始值,所以继续调⽤toString(),结果是“[object Object]”,是原始值,将“[object Object]”返回。加号两边结果都是String类型,所以进行字符串拼接,结果是“[object Object]”。
二、Object显示类型转换
1. ECMAScript中三种可用的强制类型转换
- Boolean(value) 把给定值转换成Boolean型
- String(value) 把给定的值转换成字符串
- Number(value) 把给定的值转换为数字(整数或浮点数)
2. Object类型转Boolean类型
- var obj = null; 空对象,没有引用地址也没有内存空间,转Boolean为false
- var obj = {}; 已经开辟内存地址,只是在堆内存中没有放内容,转Boolean为true
// 除了空引⽤(null)会转换为false,其他都被转换为true
var obj = {
name:"briup",
age:12
};
// 使⽤Boolean包装器进⾏转换
console.log(Boolean(obj));
3. Object类型转String类型
- 先调⽤对象的toString⽅法
- 判断该⽅法的返回值是否为基础数据类型,若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
- 若返回值不为基础数据类型,则在该返回值的基础上继续调⽤valueOf方法。判断valueOf的返回值是否为基础数据类型。若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
- 若仍旧不为基础数据类型则报错
var obj = {
name: 'zhangsan',
age: 12,
// 可以重写toString⽅法,进⾏我们想要的转换
toString:function(){
return this.name+"--"+this.age;
}
};
console.log(obj.toString(), typeof obj.toString());
console.log(String(obj), typeof String(obj));
4. Object类型转Number类型
- 先调⽤对象的valueOf⽅法
- 判断该⽅法的返回值是否为基础数据类型,若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
- 若返回值不为基础数据类型,则在该返回值的基础上继续调⽤toString方法。判断toString的返回值是否为基础数据类型。若返回值为基础数据类型,则转换规则按照相应数据类型的转换规则对其进行转换
- 若仍旧不为基础数据类型则报错
var obj = {
name:"briup",
age:12,
/*
1.如果只重写了valueOf()或者toString()⽅法,则调⽤该⽅法,并将返回
值⽤Number()转换。
2.如果两个⽅法都重写了,则调⽤valueOf(),并将返回值⽤Number()转
换。
3.如果两个⽅法都没有重写,则返回NaN
*/
toString:function(){
return "100";
},
valueOf:function(){
return 10;
}
};
console.log(Number(obj));