你真的了解JS的隐式类型转换么?

本文详细解析了JavaScript中的数据类型转换规则,包括字符串转换、数字转换、布尔转换以及关系运算符和逻辑运算符的处理方式。特别强调了在连接操作中使用+号的情况,关系运算符下的类型转换策略,以及对象和复杂类型的比较。同时,文章还介绍了如何在不同数据类型之间进行比较,例如对象、数组和空值的转换逻辑。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值