分类
基础类型
存储在栈内存,被引用或拷贝时,会创建一个完全相等的变量
- Undefined
- Null
- Boolean
- String
- Number
- Symbol
- BigInt
引用类型(共享)
存储在堆内存,存储的是地址,多个引用指向同一个地址
-
Object
- Array
- RegExp
- Date
- Math
- Function
类型检测
typeof
-
基础类型
- 除了null返回’object’,其他返回相应类型
-
引用类型
- 除了function会返回"function",其他都是’object’
instanceof
-
基础类型
- 无法判断
-
引用类型
- 可以准确判断
Object.prototype.toString.call()
- 返回格式为"[Object Xxx]"
类型转换
强制转换
-
Number()
-
布尔值
- true=>1
- false=>0
-
数值
- 自身
-
null
- 0
-
undefined
- NaN
-
字符串
-
数字
数字或者是 0X / 0x 开头的十六进制数字字符串,允许包含正负号
- 十进制
-
有效的浮点格式
- 浮点数值
-
空字符串
- 0
-
其他
- NaN
-
-
Symbol
- 抛出错误
-
Object
- 下面细讲
-
-
parseInt()
-
parseFloat()
-
toString()
-
String()
-
Boolean()
-
undefined、 null、 false、 ‘’、 0(包括 +0,-0)、 NaN
- false
-
其他
- true
-
隐式转换
-
==
-
类型相同
- 不用转换
-
null == undefined为true,其他都是false
-
?== Symbol
- false
-
string和number相比
- 字符串转number
-
与boolean相比
- 转成number
-
object与(string、number 或者 symbol)
- object转基本类型
-
-
-
与字符串相加,另一数值调用toString() ; 与数字相加,另-是调用Number();与对象相加,则要将对象转基本类型
-
数字+数字
- 加法
-
字符串+字符串
- 字符串拼接
-
字符串+(undefined/null/布尔型/数字)
‘1’ + 3 => ‘13’
- 调用toString()拼接
-
(字符串/数字)+(纯对象/数组/正则等)
- 对象转基本类型再拼接
-
数字+(undefined/null/布尔型/数字)
- 转成数字(Number())再加法
-
-
对象转换
-
语法
- Symbol.toPrimitive
- valueOf(),为基础类型才返回
- toString(),为基础类型才返回
- 都不是基础类型,报错
-
示例
-
[] + []
- “”
- [].valueOf()非基础类型,toString()是空字符串,相当于""+""
-
[] + {}
- ‘[object Object]’
- {}.valueOf()非基础类型, toString()是’[object Object]’
-
{} + {}
- NaN
- 第一个{}被js引擎解释成空的代码块并忽略,所以相当于+{}=>Number({})=>Number({}.toString())=>Number([‘object Object’])=>NaN
-
({}+{})
- ‘[object Object][object Object]’
- 加上括号就变成表达式,而非代码块
-
{} + []
- 0
- 第一个{}被js引擎解释成空的代码块并忽略,所以相当于+[]=>Number([])=>Number({}.toString())=>Number(’’)=>0
-
10+{}
- 10[‘object Object’]
-
{}+10
- 10
- {}被当作空代码块忽略
-