--记录,为了以后更方便的回顾
--
原文链接
最新的标准定义了8种数据类型:
-
undefined
-
boolean
-
number
-
string
-
bigint
-
Symbol
-
null
-
object
其中能用
typeof
检查出来类型的是前六个,typeof null => 'object'
,除了Object以外的所有类型的值是不可变的,
装箱与拆箱:就是基本数据类型在引用数据类型中的对应,两者的相互转换叫做装箱与拆箱
Boolean:
let x = Boolean(expression); // 推荐
let x = !!(expression); // 推荐
let x = new Boolean(expression); // 不太好
除了0、-0、null、undefined、false、NaN、''
之外都是true
隐式转换:
-
减、乘、除
对各种非
number
类型运用数学运算符(- * /),会先讲非number
类型转换为number
类型1 - true // 0, 首先把 true 转换为数字 1, 然后执行 1 - 1 1 - null // 1, 首先把 null 转换为数字 0, 然后执行 1 - 0 1 * undefined // NaN, undefined 转换为数字是 NaN 2 * ['5'] // 10, ['5']首先会变成 '5', 然后再变成数字 5
- 加法
通俗的讲就是,会先将左右的值调用js引擎提供的`toprimitve`方法转换为原生数据类型,然后进行下面的运算。
- 当一侧为
string
类型,会优先将另一侧转换为字符串 - 当一侧为
number
类型,另一侧为原始类型,则将原始类型转换为number
类型 - 当一侧为
number
类型,另一侧为引用类型,将引用类型和number
类型转换为字符串后拼接
其中
ToPrimitve
的操作流程为:123 + '123' // 123123 (规则1) 123 + null // 123 (规则2) 123 + true // 124 (规则2) 123 + {} // 123[object Object] (规则3)
---总结就是:有字符串就全转为字符串,没有字符串有数字就全转数字
-
逻辑语句中的类型转换
-
单个变量:将变量转换为Boolean值,除了
0、-0、null、undefined、false、NaN、''
之外都是true
-
使用了
==
进行比较-
NaN
和其他任何类型比较永远返回false
(包括自身) -
Boolean
和其他任何类型比较,Boolean
先被转化为Number
类型 -
String
和Number
比较,先将String
转为Number
-
null == undefined
结果为true(查到的一种说法是:在js中两者都是不存在的,所以==的情况下是相等的,都代表没有),除此之外,null、undefined
和其他任何结果的比较值都是false
-
原始类型和引用类型做比较是,引用类型会依照
ToPrimitive
规则转换为原始类型可以参考下表进行快速查找:👇👇👇
类型 值 to Boolean to Number to String Boolean true true 1 'true' Boolean false false 0 'false' Number 123 true 123 '123' Number Infinity true Infinity 'Infinity' Number 0 false 0 '0' Number NaN false NaN 'NaN' String '' false 0 '' String '123' true 123 '123' String '123abc' true NaN '123abc' String 'abc' true NaN 'abc' Null null false 0 'null' Undefined undefined false NaN 'undefined' Function Function() {} true NaN 'function() {}' Object {} true NaN '[object Object]' Array [] true 0 '' Array ['abc'] true NaN 'abc' Array ['123'] true 123 '123' Array ['123','abc'] true NaN '123,abc'
-