还记得那些年我们面试被问过的 ![] == [],[] == false吗?
有了这篇文章,宝宝们再也不用怕了
=== 与 ==
=== 为严格等,数据类型不同即为false
a == b为测试等,可以转换a,b数据类型
=== 判断规则
- === 左右两侧类型不同,则返回false
- a === b,ab类型为同一个基本数据类型(string,number,boolean,undifined,null),且值相等,则返回true.如果为number类型,如果其中至少一个是NaN,那么[不相等]。(判断一个值是否是NaN,只能用isNaN()来判断)
8 === NaN
false
NaN === NaN
false
- a === b,ab类型为引用类型({},[],()),引用类型判断值是否相等,比较的是内存中存的是否是同一个对象,虽然都是两个空数组,但是引用地址不一样,结果当然为false。
== 判断规则
- 左右两侧数据类型相同,则进行 ===比较
- 左右两侧数据类型不同,则进行隐式转换
- 如果任一值是 true,把它转换成 1 再比较;如果任一值是 false,把它转换成 0 再比较。
- 对象与字符串比较 ,对象转换成字符串,再跟字符串比较.例如

上图中 [1] == '1' //true,[1]先转换为'1',再跟'1'比较,数据类型相同,值相同,所以返回值为true
上图中 [1] == true//true,[1]先转换为‘1',转换 为1;true转换为1;1 == 1,所以返回值为true
所有的转换路线为下图,简单来说。隐式转换最后都是数值的比较

特例
- [] == false//true, []-> ' '->0, false ->0
- ![] == false//true
过程:
!优先级大于==,!先执行。
!直接将其后面的转为布尔类型,再取反.(转换为布尔值为false 的几种情况null,undefined,NaN,' ',0),(为true的几种情况:[],{})
Boolean([])为true,![]为false
false == false //true
- ![] == [];//true
左边类型为Boolean,右边为引用
![]为false,false == [],类型不同进行隐式转换, false转换为数值为0,[]转换为数值为0,所以返回true
考题
console.log([] == false)//true
console.log([] === false)//false
console.log(null === undefined)//false
console.log(null == undefined)//true
console.log({} === {})//false
console.log({} == {})//false
console.log(!{} == {})//true
console.log([1,2,3] == true)//false
console.log([1] == true)//true
参考
1.基础类型值赋值与引用类型值赋值
var m = 2;
var n = m;
m = 3
n? n的值还为2
var a = {b:'k'}
var c = a;
a.b = 'carry';
c.b? 答案是'carry'
考点:基本类型赋值是给实际的值,栈里面存放着值
引用类型赋值:是将变量的地址付给新对象,变量栈里存放着堆地址,对应堆里面的存储空间放着值
注意:
当我们想数组拷贝后,互相不影响,可以用以下办法
1. var a = [1,2];
var b = a.slice(0);
b[0] = 3;
alert(a) //1,2
2. var a = [1,2];
var b = a.concat(0);
3.判断数据类型的几种方式
待更新
网友评论