深刻理解 JS 中的类型转化

哪些操做能致使类型转换呢javascript

if 条件判断

为 false 的值 -> false undefined null 0 '' NaNjava

运算符操做

常见的运算符 + - * /
+ 比较特殊除了相加以外 还有字符串拼接的含义code

1)数字和非字符串相加对象

1 + null -> 0;

// undefined 比较特殊 表示未定义的,不是一个数字
1 + undefined -> NaN

// 会把空对象转换成数字,若是转换不成数字就变成字符串拼接
1 + {} -> 1[object object]

2)非数字相加ip

// 把两边都转化成数字
true + true -> 2

// 若是有一方是字符串,则进行字符串拼接
true + {} -> true[object object]

valueOf / toString

对象的原型链上有 valueOf 和 toString 两个方法原型链

let obj = {
  symbol[toPrimitive](){
    return 500
  },
  valueOf(){
    return 100
  },
  toString(){
    return 200
  }
}

// 两边都转换成数字 obj 先调用 valueOf valueOf 若是返回不是数字 则继续调用 toString 方法
true + obj -> 101

symbol[toPrimitive] 是对象内置属性,当一个对象要转换成对应的原始类型时,会调用此方法。字符串

总结下,当对象要进行类型转换时,会依次调用 symbol[toPrimitive] valueOf toString 原型

+ 、- 、!

+ - 和 ! 同样,能够放在变量前面,进行快速类型转换it

1 + +'1234' -> 1235

1 + '1234'  -> '11234'

比较元算 > = <

1)数字和数字直接比较console

2)字符串比较

// 字符串和字符串,比较的是 AscII 码
console.log('a'.charCodeAt(0))
console.log('b'.charCodeAt(0))

'a' < 'b' -> true
'a' < 'bdede' -> true // 同样的由于比的是第一位

// 数字和字符串相比,字符串先转化成数字,若是转化不成数字 这比较始终返回 false
1 < '123' -> true
1 < '1df' -> false

// 若是是对象和字符串相比,须要把对象先转化成基本类型(字符串以后再比较)
[] == '' -> true
// [].valueOf 为[],继续调用 [].toString 为 '',比较返回 true

3) == 比较

若是一方是数字,会先把另外一方转换成数字 而后比较

若果其中一方是 boolean 类型 会把 boolean 类型转换为数字

null == undefined // true

null、undefined 和任何类型相比 == 都返回 false

NaN 和任何类型相比返回 false 包括它自己

举例

console.log([] == ![]);
// [] == false  单目运算优先级最高 为 false 的状况 false undefined NaN null 0 ''
// [] == 0      [].valueOf()  -> [] 不是原始类型继续调用 toSting 
// [] == 0      [].toString() -> ''
// '' == 0      Number('')
//  0 == 0      true

(完)

相关文章
相关标签/搜索