转换规则
- 转string
+连接字符串 - 转number
++, —自增运算符
算术运算符±*/等
关系运算符>< == - 转boolean
!
!{},![]都为false - 空数组的toString为空字符串, 对象的为’[object, Object]’(先小后大)
数据类型转换——+连接
- 对于+连接字符串则直接调用toString方法
console.log( 1 + "true" );//'ltrue'
- +连接数字作为运算符时, 会调用Number()转成数字再运算, 需要注意的是Number(undefined)为NaN, 布尔是false 0或者true 1, null为0
console.log( 1 + undefined );// NaN
console.log( 1 + true );//2
console.log( 1 + null );//1
关系运算符与类型转换
- 如果存在> < ≤ ≥等关系运算符的, 都需要转化为Number类型后比较
- 如果存在==关系运算符就转化为同种类型后比较即可。
- 对于基本数据类型, 就直接Number(val)去转换后运算
有三个特殊规则, undefined和undefined以及null关系运算是true, NaN不与任何值相等
//特殊情况(无视规则):如果数据类型是undefined与null,,得出固定的结果
console .log ( undefined == undefined )//true
console.log ( undefined == null );//true
console.log ( null == null );//true
//特殊情况(无视规则) : NaN与任何数据比较都是false
console.log ( NaN == NaN )://false
-
对复杂类型, 先调用valueOf找原始值, 如果原始值类型不对的话, 再调用toString得到string类型后再转化类型。
Number、Boolean、String这三种构造函数生成的基础值的对象形式,通过valueOf转换后会变成相应的原始值。Date将日期转换为日期的毫秒的形式的数值。除此之外返回的都为this,即对象本身:
console.log([1,2]== '1,2' )//true
console.log([ 1,2 ].valueOf() )//[1,2]
console.log([ 1,2 ].toString() )//'1,2'
/*
左边valueOf得到的是[1,2], 是个数组
类型不对就toSting, 发现右边也是string类型
*/
var a= {};
console.log ( a == "[object Object]" )//true
console.log ( a.valueOf().toString() )//[object Object]
逻辑运算符(!、&、|)优先级大于关系运算符(<、>、=)
任意两种类型比较时,如果不是同一个类型比较的话,则按如图方式进行相应类型转换,如对象和布尔比较的话,都转换为数值后再进行比较:
对象 => 字符串 => 数值
布尔值 => 数值
数据类型转布尔,以下均返回true:
① 非空字符串
② 非零数值
③ 数组
④ 对象
⑤ 函数
console.log ([] == 0 );//true
console.log( ![] === 0 )//true
/*
1.[].valueOf().toString()为'',Number('')为0,0==0,返回true
2.逻辑运算符的优先级高, 数组是个对象, 取反就是false, false==0没毛病
*/
console.log([] == ![] )//true
console.log ([] == [] )//false
/*
1.左边toString后是空字符串,右边是个布尔值,且值false, 那么空字符串和false没毛病
2.两边都是对象,类型相同, 就直接比较地址值了
*/
console.log({} == !{});//false
console.log({} == {});//false
/*
1.空对象toSring得到的是'[object Object]', {}为true, 取反就是false, 前后不等
2.两个都是对象直接比较地址值
*/