一、ToString、ToNumber、ToBoolean、ToPrimitive
1.1 ToString
-
null 转化为 ‘null’
-
undefined 转化为 ‘undefined’
-
布尔类型:true和false 分别转化为 ’true‘ 和 ’false‘
-
数组:相当于调用,json()方法,
[1,2,3] 转换为 '1,2,3' [] 转化为 空字符串 数组中 null和undefined 按空字符传处理
-
对象:相当于直接调用Object.prototype.toString(),返回 ’[object,object]‘
以上为默认情况下,如果修改ToSting方法会有不同的结果
1.2 ToNumber
- null:转为0
- undefined:转为NaN
- 字符串:若为纯数字,就转为相应的数字;否则转为NaN;空字符串转换为0
- 数组:首先会被转为原始类型,也就是ToPrimitive,然后再根据转换后的原始类型按照上面的规则处理
- 对象:同数组处理
Number(null) // 0
Number(undefined) // NaN
Number('10') // 10
Number('10a') // NaN
Number('') // 0
Number(true) // 1
Number(false) // 0
Number([]) // 0
Number(['1']) // 1
Number({}) // NaN
1.3 ToBoolean
除了null、undefined、0、false、NaN、空字符串,其他值都转换为true
1.4 ToPrimitive
指的是对对象类型转换为原始类型的操作。
- 当对象类型需要转换为原始类型时,它会先查找对象的ValueOf方法,若ValueOf返回的为基本类型的值,则ToPrimitive的结果就是这个值
- 如果ValueOf不存在,或着返回的不是原始类型的值,就会调用ToSting方法,作为ToPrimitive的结果
Pay attition: 对于不同类型的对象来说,ToPrimitive的规则会有不同,比如 Data对象会先调用toString
如果valueOf和toString 都没有返回原始类型的值,会报错
二、宽松相等(==)比较时的隐式转换规则
2.1 布尔值类型与其他类型的相等比较
- 只要又 布尔类型 参与比较,该布尔类型的值首先会被转换为 数字类型
- 根据 布尔类型 的 ToNumber规则,true转为1,false转为0
2.2 数字类型和字符串类型的相等比较
- 当 数字类型 和字符串类型做相等比较时,字符串会被转为 数字类型
- 根据字符串的ToNumber规则,如果为 纯数字形式的字符串,则转为 该数字;若为非数字,则转换为NaN
2.3 对象类型 和 原始类型 的相等比较
- 当对象类型 和 原始类型 做相等比较时,对象类型 会依照 ToPrimitive规则转换为 原始类型
2.4 null、undefined和其他类型的比较时
-
null和undefined宽松相等
-
null、undefined与其他的不相等
null == false // false undefined == false // false
2.5 null 和 undefined
null 表示”没有对象“,即该处不应该有值。用法:
1.作为函数的参数,表示该函数的参数不是对象
2.作为对象原型的终点
Object.getPrototypeOf(Object.prototype)
// null
undefined 表示 “缺少值”,就是此处应该有一个值,但是还没有定义:
1.变量被声明了,但是没有赋值,就等于undefined
2.调用函数时,应该提供的参数没有提供,该参数等于undefined
3.对象没有赋值的属性,该属性的值为undefined
4.函数没有返回值时,默认返回undefined
var i;
i // undefined
function f(x){console.log(x)}
f() // undefined
var o = new Object();
o.p // undefined
var x = f();
x // undefined