将值从一种类型转换为另一种类型,叫做类型转换,这是显式的情况;隐式的情况称为,强制类型准换
注意:js中,强制类型转换(隐式类型强制转换)总是返回标量基本类型(字符串,数字,布尔),不会返回对象和函数
1. ToPrimitive(…)
将值转化为基本类型的转化规则
- 检查改值是否具有valueof方法,如果有并且返回基本类型,就使用该值进行强制的类型转换
- 如果没有就使用toString方法的返回值(如果存在)来进行强制转换
- 如果valueof和toString均不返回基本类型值,就报TypeError错误
2. ToString(…)
转化规则:
- null 转换为 ‘null’,undefined 转化为’undefined’,true 转化为’true’
- 对于普通对象来说,除非自定义,否则返回内部[[class]]属性,如[object,object]
JSON,stringfy(…,arg2,agr3);
- 第二个参数是数组,可以是一个字符串数组,用来指定,那些属性可以被序列化
- 第二个参数是函数,会对对象本身调用一次,然后对对象中每一个属性调用一次,每次两个参数,键和值.如果要忽略某个键就返回undefined,否则返回指定值
- 第三个参数,用来指定输出的缩进格式
注意:
1. JSON.stringfy(..):在对象中遇到,undefined,function,symbol时,会自动将其忽略,
- 在数组中则会返回null(保证单元位置不变),
- 如果对象包含循环引用,则会直接报错
- 如果对象中定义了,toJson方法,JSON字符串化对象的时候,会首先调用该方法,用它返回值来做序列化
- []+{} 结果为 “[object object]” 而 {}+[] 结果为0
3. ToNumber(…)
转化规则
true,转化为1,false转化为0,undefined转化为NaN,null转化为0
- 假值 可以被强制转换为false的值
- 其它 可以被强制转换为true的值
转化规则
- undefined,null,false,+0,-0,0,NaN,’’ 这些都是假值
- 出去上面列举的以外,都是真值
5. 逻辑运算符 || &&
&& 和 || 返回到的不一定是布尔类型,而是两个操作数中的其中一个
- 首先对第一个操作数进行条件判断,符合ToBoolean的转化规则
- || 如果条件判断为true,就返回第一个操作数的值,如果是false就返回第二个操作数的值
- && 如果判断条件是true就返回第二个操作数,如果为false就返回第一个操作数的值
demo
var a=42,b=’abc’,c=null
- a || b //42
- a && b //‘abc’
- c || b // ‘abc’
- c && b //null
6. ===和==的区别
- ==允许在比较中进行强制类型转换,而===不允许
x==y
- 字符串和数字进行比较 ,试着将字符串转化为数字比较
- 如果Type(x)是数字,Type(y)是字符串,则返回x==ToNumber(y)的结果
- 如果Type(x)是字符串,Type(y)是数字,则返回ToNumber(x)==y的结果
- 其它基本类型和布尔类型之间的相等比较,试着将布尔类型转换为数字进行比价
- 如果Type(x)是布尔类型,则返回ToNumbr(x)==y的结果
- 如果Type(y)是布尔类型,咋返回x==ToNumber(y)的结果
- 对象和和非对象之间的相等比较,对象尝试使用ToPrimitive(…)之后,进行比较
x==y
- 如果Type(x)是字符串或者数字,Type(y)是对象,则返回x==ToPrimitive(x)的结果
- 如Type(x)是对象,T(y)是字符串或数字,则返回ToPimitive(x)==y的结果
7. undefined和null
x==y
==涉及到了隐式类型转换
- 如果x为null,y为undefined,则结果为true
如果x为undefined,y为null,则结果为true
null==null,
- undefined==undefined
- null==undefined
- null !== undefind
8. 其中不常见的转换类型
‘0’==false true
false==0 true
- false==’’ true
fase==[] true
‘’==0 true
‘’==[] true
0==[] true
9. 极端情况
- [] == ![] true
- 2==[2] true
- ‘’==[null]