将值从一种类型转换为另一种类型,叫做类型转换,这是显式的情况;隐式的情况称为,强制类型准换
注意:js中,强制类型转换(隐式类型强制转换)总是返回标量基本类型(字符串,数字,布尔),不会返回对象和函数

1. ToPrimitive(…)

将值转化为基本类型的转化规则

  1. 检查改值是否具有valueof方法,如果有并且返回基本类型,就使用该值进行强制的类型转换
  2. 如果没有就使用toString方法的返回值(如果存在)来进行强制转换
  3. 如果valueof和toString均不返回基本类型值,就报TypeError错误

2. ToString(…)

转化规则:

  1. null 转换为 ‘null’,undefined 转化为’undefined’,true 转化为’true’
  2. 对于普通对象来说,除非自定义,否则返回内部[[class]]属性,如[object,object]

JSON,stringfy(…,arg2,agr3);

  1. 第二个参数是数组,可以是一个字符串数组,用来指定,那些属性可以被序列化
  2. 第二个参数是函数,会对对象本身调用一次,然后对对象中每一个属性调用一次,每次两个参数,键和值.如果要忽略某个键就返回undefined,否则返回指定值
  3. 第三个参数,用来指定输出的缩进格式

注意:
1. JSON.stringfy(..):在对象中遇到,undefined,function,symbol时,会自动将其忽略,

  1. 在数组中则会返回null(保证单元位置不变),
  2. 如果对象包含循环引用,则会直接报错
  3. 如果对象中定义了,toJson方法,JSON字符串化对象的时候,会首先调用该方法,用它返回值来做序列化
  4. []+{} 结果为 “[object object]” 而 {}+[] 结果为0

3. ToNumber(…)

转化规则

  1. true,转化为1,false转化为0,undefined转化为NaN,null转化为0

    1. 对象(包括数组)都会相应的被转换为相应的基本类型,如果返回的是非数字的基本类型值,在遵循以上的转换规则

      4. ToBoolean(…)

  • 假值 可以被强制转换为false的值
  • 其它 可以被强制转换为true的值

转化规则

  1. undefined,null,false,+0,-0,0,NaN,’’ 这些都是假值
  2. 出去上面列举的以外,都是真值

5. 逻辑运算符 || &&

&& 和 || 返回到的不一定是布尔类型,而是两个操作数中的其中一个

  • 首先对第一个操作数进行条件判断,符合ToBoolean的转化规则
  • || 如果条件判断为true,就返回第一个操作数的值,如果是false就返回第二个操作数的值
  • && 如果判断条件是true就返回第二个操作数,如果为false就返回第一个操作数的值

demo
var a=42,b=’abc’,c=null

  1. a || b //42
  2. a && b //‘abc’
  3. c || b // ‘abc’
  4. c && b //null

6. ===和==的区别

  • ==允许在比较中进行强制类型转换,而===不允许

x==y

  1. 字符串和数字进行比较 ,试着将字符串转化为数字比较
  • 如果Type(x)是数字,Type(y)是字符串,则返回x==ToNumber(y)的结果
  • 如果Type(x)是字符串,Type(y)是数字,则返回ToNumber(x)==y的结果
  1. 其它基本类型和布尔类型之间的相等比较,试着将布尔类型转换为数字进行比价
  • 如果Type(x)是布尔类型,则返回ToNumbr(x)==y的结果
  • 如果Type(y)是布尔类型,咋返回x==ToNumber(y)的结果
  1. 对象和和非对象之间的相等比较,对象尝试使用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]