文章开始之前 请看一个问题 [] == ![] 结果是true还是false?
js的基本数据类型
基本数据类型一共6种,分别是number,undefined,sybmol,null,string,boolean。
- 基本类型值是指简单的数据段,基本类型是按值访问的,因为可以操作保存在变量中的实际值
基本类型的值在内存中占据固定大小的空间,被保存在栈内存中。从一个变量向另一个变量复制基本类型的值,会创建这个值的一个副本。
不能给基本类型的值添加属性
js的引用数据类型:object
- 引用类型是由多个值构成的对象,js不允许直接访问内存中的位置,也就是不能直接访问操作对象的内存空间。对object的操作时 实际上是在操作对象的引用而不是实际的对象。
引用类型的值是对象,保存在堆内存中,包含引用类型值的变量实际上包含的并不是对象本身,而是一个指向该对象的指针。从一个变量向另一个变量复制引用类型的值,复制的其实是指针,因此两个变量最终都指向同一个对象。
对于引用类型的值,可以为其添加属性和方法,也可以改变和删除其属性和方法
类型转换
首先我们要知道,在 JS 中类型转换只有三种情况,分别是:
- 转换为布尔值
- 转换为数字
- 转换为字符串
转换关系图
转Boolean
在条件判断时,除了 undefined
, null
, false
, NaN
, ''
, 0
, -0
,其他所有值都转为 true
,包括所有对象。
==判断流程
对于 ==
来说,如果对比双方的类型不一样的话,就会进行类型转换
假如我们需要对比 x
和 y
是否相同,就会进行如下判断流程:
- 首先会判断两者类型是否相同。相同的话就是比大小了
- 类型不相同的话,那么就会进行类型转换
- 会先判断是否在对比
null
和undefined
,是的话就会返回true
- 判断两者类型是否为
string
和number
,是的话就会将字符串转换为number
1 == '1' ↓ 1 == 1 复制代码
- 判断其中一方是否为
boolean
,是的话就会把boolean
转为number
再进行判断'1' == true ↓ '1' == 1 ↓ 1 == 1 复制代码
- 判断其中一方是否为
object
且另一方为string
、number
或者symbol
,是的话就会把object
转为原始类型再进行判断'1' == { name: 'din' } ↓ '1' == '[object Object]'复制代码
思考结果
看完你知道 文章开始之前的问题 [] == ![] 结果是true还是false?
结果 是 true。右边![] 是布尔值 false,转成0, 左边[] 因为空数组 转为数字0;所以结果是
[] == ![]
↓
0 == 0 //true复制代码