0
点赞
收藏
分享

微信扫一扫

聊一聊JS的隐式类型转换

一葉_code 2022-02-08 阅读 81

转换规则

  • 转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类型后再转化类型。

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.两个都是对象直接比较地址值 
*/

在这里插入图片描述

举报

相关推荐

0 条评论