js|js 中的不同的数据类型之间作比较时的“隐式转换规则”(详细!!!)
一、js 隐式转换规则
1. javascript 隐式转换规则
隐式类型转换是在一定场景下,js 运行环境自动调用这几个方法,尝试转换成期望的数据类型
- ToString
- ToNumber
- ToBoolean
- ToPrimitive
2.两个数据比较的情况
两个数据比较时,如果两边数据不是同种类型的话,按以下规则进行相应的隐式类型类型转换
- 对象 --> 字符串 --> 数值
- 布尔值 --> 数值
??有关隐式转换规则的坑点详细分析,可参考 js面试题大坑——隐式类型转换
二、具体分析(六种基本情况 + 三种特殊情况) 1. 对象和字符串比较
① 说明 隐式转换规则:调用
ToPrimitive()
内部函数,将对象转换为字符串,然后两者进行比较。注:在 js 中,想要将对象转换成原始值,必然会调用
toPrimitive()
内部函数。??① 有关
ToPrimitive()
方法,可参考 JS原始值转换算法—toPrimitive()??① 有关
valueOf()
方法,可参考 JS 中 valueOf() 方法的详解??① 有关
toString()
方法,可参考 有关 toString() 方法的初步认识② 示例
// 数组(Array)对象和字符串比较
[1,2,3] == '1,2,3' // true
隐式转换过程:
- 对左边的数组对象进行隐式转换
ToPrimitive([1,2,3])
->'1,2,3'
; - 然后和右边的
'1,2,3'
比较,易得结果为true
// Object 对象和字符串比较
let obj = {
a:1}
obj == '[object Object]' // true
隐式转换过程:
- 对左边的数组对象进行隐式转换
ToPrimitive([1,2,3])
->'[object Object]'
; - 然后和右边的
'[object Object]'
比较,易得结果为true
① 说明 隐式转换规则:调用
ToPrimitive()
内部函数,将对象转换为字符串,再调用 ToNumber()
将字符串转换为数字,然后两者进行比较。ToNumber(argument) 转换方式:
argument类型 | 返回值 |
---|---|
Undefined | return NaN |
Null | return 0 |
Boolean | true return 1; false return 0; |
Number | return value |
String | 若字符串为纯数字,返回转换后的数字;空字符则返回 0;非纯数字则返回 NaN |
Symbol | 抛出 TypeError 异常 |
Object | 进行如右步骤:1.先进行 ToPrimitive(argument, hint Number) 得到 rs ;?2.然后返回 ToNumber(rs) 的结果。 |
// 数组(Array)对象和数值比较
[11] == 11 // true
隐式转换过程:
- 对象转换为字符串
ToPrimitive([11])
->'11'
; - 字符串转换为数字
ToNumber('11')
->11
- 然后和右边的
11
比较,易得结果为true
① 说明 隐式转换规则:
??调用
ToPrimitive()
内部函数,将对象转换为字符串,再调用 ToNumber()
将字符串转换为数字;??调用
ToNumber()
将布尔值转换为数字;??然后两者进行比较。
ToNumber(argument) 转换方式:
argument类型 | 返回值 |
---|---|
String | 若字符串为纯数字,返回转换后的数字;空字符则返回 0;非纯数字则返回 NaN |
Boolean | true return 1; false return 0; |
// 数组(Array)对象和布尔值比较
[] == false // true
左边数据的隐式转换过程:
- 对象转换为字符串
ToPrimitive([])
->''
; - 字符串转换为数字
ToNumber('')
->0
- 布尔值转换为数字
ToNumber(false)
->0
- 两边比较,易得结果
true
① 说明 隐式转换规则:
??调用
ToNumber()
将字符串转换为数字,然后两者进行比较。【js|js 中的不同的数据类型之间作比较时的“隐式转换规则”(详细!!!)】ToNumber(argument) 转换方式:
argument类型 | 返回值 |
---|---|
String | 若字符串为纯数字,返回转换后的数字;空字符则返回 0;非纯数字则返回 NaN |
// 数组(Array)对象和布尔值比较
'11' == 11 // true
隐式转换过程:
- 字符串转换为数字
ToNumber('11')
->11
- 两边比较,易得结果
true
① 说明 隐式转换规则:
??调用
ToNumber()
将字符串转换为数字;??调用
ToNumber()
将布尔值转换为数字;??然后两者进行比较。
ToNumber(argument) 转换方式:
argument类型 | 返回值 |
---|---|
String | 若字符串为纯数字,返回转换后的数字;空字符则返回 0;非纯数字则返回 NaN |
Boolean | true return 1; false return 0; |
// 数组(Array)对象和布尔值比较
'1' == true // true
左边数据的隐式转换过程:
- 字符串转换为数字
ToNumber('1')
->1
- 布尔值转换为数字
ToNumber(true)
->1
- 两边比较,易得结果
true
① 说明 隐式转换规则:
??调用
ToNumber()
将布尔值转换为数字,然后两者进行比较。ToNumber(argument) 转换方式:
argument类型 | 返回值 |
---|---|
Boolean | true return 1; false return 0; |
// 数组(Array)对象和布尔值比较
1 == true // true
隐式转换过程:
- 布尔值转换为数字
ToNumber(true)
->1
- 两边比较,易得结果
true
① 说明 隐式转换规则:
??若某数据前面存在 !运算符,则先将该数据转换为布尔值,其余的按照上述规则进行。
注:除
0
、NaN
、''
、null
、undefined
转换为布尔值为 false
外,其余数据转换为布尔值均为 true
。此外,还应关注一下一些特殊数。 console.log( ! 0 );
// true
console.log( ! NaN );
// true
console.log( ! '' );
// true
console.log( ! null );
// true
console.log( ! undefined );
// true
console.log( ! [] );
// false
console.log( ! {
} );
// false
console.log( ! Infinity );
// false
console.log( ! ( - Infinity ));
// false
② 示例
[] == false;
// true
见第 3 点 “对象和布尔值比较” 的分析
![] == false;
// true
隐式转换过程:
- 由于存在
!
运算符,故直接将[]
转换为布尔值true
,则![]
,为false
- 两边比较,易得结果为
true
① 说明
- 实际上,undefined 值是派生自 null 值的,ECMAScript 标准规定对二者进行相等性测试要返回 true,可以理解为 null 和 undefined 都代表着无效的值,所以二者相等,但由于是两种不同的原始数据类型,所以不全等。
- 除此之外其他的类型的值与它们都不相等。
② 示例
undefined == null // true
undefined === null // false
9. 存在 NaN(特殊情况三)
① 说明
- NaN(Not a Number)表示一个非数字,但数据类型确是 Number 类型
- NaN 是 JavaScript 之中唯一不等于自身的值,不等于任何值,包括它本身
NaN == NaN // false
推荐阅读
- 热闹中的孤独
- JAVA(抽象类与接口的区别&重载与重写&内存泄漏)
- 放屁有这三个特征的,请注意啦!这说明你的身体毒素太多
- 一个人的旅行,三亚
- 布丽吉特,人生绝对的赢家
- 慢慢的美丽
- 尽力
- 一个小故事,我的思考。
- 家乡的那条小河
- 《真与假的困惑》???|《真与假的困惑》??? ——致良知是一种伟大的力量