类型和类型强制转换
前言
靓仔,你知道JavaScript的内置类型有几种吗?
你晓得如何正确安全地使用类型间强制转换吗?
对于JavaScript语法/句法中的微妙细节,你的熟悉程度又如何呢?
类型
首先要了解JavaScript的内置类型有如下几种:
- null
- undefined
- boolean
- number
- string
- symbol
- object
除了对象以外,其他都是基本类型
原生函数
常用原生函数有:
- String()
- Number()
- Boolean()
- Array()
- Object()
- Function()
- RegExp()
- Date()
- Error()
- Symbel()
强制类型转换
将值从一种类型转换为另一种类型通常陈伟类型转换,这时显示的情况;影视的情况称为强制类型转换,并且强制类型转换只返回标量基本类型,不会返回对象或函数;
(类型转换发生在静态类型语言的编译阶段,而强制类型转换则发生在动态类型语言的运行时)
抽象操作和转换规则
ToString
抽象操作ToString,它负责处理非字符串到字符串的强制类型转换
基本类型值的字符串化规则为:null转换为"null",undefined转换为"undefined",true转换为"true"。数字的字符串化则遵循通用规则。
对普通对象来说,除非自行定义,否则toString()(Object.prototype.toString())返回内部属性[[class]]的值,如"[object Object]"
ToNumber
抽象操作ToNumber,true转换为1,false转换为0.undefined转换为NaN,null转换为0.
ToNumber对字符串的处理基本遵循数字常量的相关规则。处理失败返回NaN。
对于对象会首先被转换为相应的基本类型值,如果返回的是非数字的基本类型值,则再遵循以上规则将其强制转换为数字
ToBoolean
假值:
undefined
null
false
+0、-0、NaN
""
其他的都转换为true
==和=====的坑
==允许再相等比较重进行强制类型转换,而===不允许。
并且对于==相等比较,有如下规则:
- 字符串和数字之间的比较
如果Type(x)是数字,Type(y)是字符串,则返回x == ToNumber(y)的结果
如果Type(x)是字符串,Type(y)是数字,则返回ToNumber(x) == y的结果 - 其他类型和布尔类型之间的比较
如果Type(x)是布尔类型,则返回ToNumber(x) == y的结果
如果Type(y)是布尔类型,则返回x == ToNumber(y)的结果 - null和undefined之间的相等比较
在==中null和undefined相等(也与自身相等),除此之外与其他值都不相等 - 对象与非对象之间的相等比较
如果Type(x)是字符串或数字,Type(y)是对象,则返回x == ToPrimitive(y)的结果
如果Type(x)是对象,Type(y)是字符串或数字,则返回ToPrimitive(x) == y的结果
最后还有一点少见的情况就不给予阐述了,怕太多了看着烦。
就给出两个很原则有效地避免出错。
如果两边的值中有true或者false,千万不要用==。
如果两边的值中有[]、""或者0,尽量不要使用==。
行百里者半九十