2.JS中的类型及类型转换、typeof、==和===、Object.is
类型种类
JS共有7种原始类型,分别是:
- String
- Number
- Boolean
- Undefined
- Null
- Symbol
- Bigint
JS有一种引用类型
- Object
typeof
typeof会返回以下类型(null显示为Object,bigint显示为Number):
- String
- Number
- Boolean
- Undefined
- Symbol
- Object
==
和===
JS中 == 是相同的意思, === 代码严格相同
==
比较过程
- 如果两个值类型相同,就进行三个等号的比较
- 如果两个值类型不同
- 如果一个为null、一个为undefined,相等
- 如果一个是字符串,一个是数值,则把字符串转换为数值后再比较。
===
比较过程
- 如果类型不同,一定不相同
- 如果两个都是数值,并且值相等,则相等
- 如果一个是
NaN
,一定不相等
- 如果一个是
- 如果两个都是字符串,每个位置字符都一样,那么相等,否则不等
- 如果两个值都是true,或是false就相等
- 如果两个值都是引用同一个对象或是函数,那么相等,否则不相等
- 如果两个值都是null,或是undefined,那么相等
Object.is
和 ==
、===
相比,NaN相等,+0
和-0
相等,'1'
和1
不相等
类型转换
显式转换
转为Boolean
- 使用Boolean()方法
类型 | 值 | 转换结果 |
---|---|---|
string | 空字符串('') | false |
string | 非空字符串('abc') | true |
Number | 除了0和NaN(10) | true |
Number | 0、NaN | false |
undefined、Null | undefined、null | false |
Object | 非空对象 | true |
Object | Object.create(null) | false |
转为String
使用String()
可以转换所有值(非null和undefined会直接调用toString)
使用toString(num)
可以将除了null和undefined以外的所有数据转为字符串 num可以指定进制数的转换(2、8、10、16)
转为Number
使用Number() 可以转换任何类型
类型 值 结果 Boolean true 1 Boolean false 0 Number 所有数字 直接返回 Null null 0 undefined undefined NaN String 数值,转换为10进制 String 浮点数 转换相应浮点值 String 十六进制数 转换十进制 String 空字符串('') 0 String 其他字符串('abc') NaN 使用parseInt() 从第一个非空格字符开始转换,如果非数字,则返回NaN。如果是数字则继续解析直到遇到非数字字符。
使用parseFloat() 与parseInt类似,但是遇到第一个小数点不会暂停。
隐式转换
隐式转换由JS自动完成。
引用类型转换
JS内部会调用——toPrimitive(input, preferredType)方法
如果PreferredType为Number
- 如果输入的是原始值,直接返回
- 如果输入的值是一个对象,调用该对象的valueOf()方法,如果ValueOf()返回的是一个原始值,则返回。
- 否则,调用toString()方法,如果toString()返回的是一个原始值,则返回。
- 否则,抛出TypeError异常。
如果PreferredType为String
- 如果输入的是原始值,直接返回
- 如果输入的值是一个对象,调用该对象的toString()方法,如果toString()返回的是一个原始值,则返回。
- 否则,调用valueOf()方法,如果valueOf()返回的是一个原始值,则返回。
- 否则,抛出TypeError异常。
如果未指定preferred,有以下两种情况
- input为Date类型,preferred为String
- 其余的为Number
== 运算符隐式转换
- Number和String转为Number进行比较
- Boolean转换为Number进行比较
- Object和String或Number比较时,将其转为原始类型后再比较。