文章开始之前 请看一个问题 [] == ![] 结果是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,是的话就会将字符串转换为number1 == '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