{}=={}//false {}==!{}//false []==[] //false []==![]//ture 这是为什么呢?
先写这么一段话吧,如果是跟 boolean相比较 比如 ture=='ture'//false
这又是为什么呢 ?这又该怎么理解呢 ?先说 ture=='ture'为什么结果是false 这就牵扯到隐式转化,我也看到了很多文章,跟视频,说说我的理解,如果等号一方是boolean的话,那么两边都需要转化成Number类型,在做比较 那么 这是怎么操作的呢?
左侧的ture---> Number(ture)//---->1,而右侧则是 Number('ture')---->//NaN 因为 NaN跟任何相比都是 false 在提一笔 NaN==NaN //false 而自身都跟自身不相等 那他跟任何相比都是false 那么 ture =='ture' 这个我已经解释了
那么来解释 {} =={}//false 这里又会有执行顺序及优先级 可以看我上一篇 文章 写的就是 优先级 在优先级相等情况下都是从右向左执行 这里我就要再提一个东西 因为 object 是引用类型 值存在堆内存中,比较的地址 所以 是 false
除了 undefiend null ''(空字符串) 0 NaN 其余的都是ture
那么解释{}==!{} 从右向左开始 {}--->ture -->!ture--->Number(false)--->0 而左边 {}执行却是 --->({})[Symbol.toPrimitive]//(如果存在是一个函数)则---> ({})[Symbol.toPrimitive](hint)//hint有二个参数 ‘number’,‘string’, 传入什么最后返回什么类型的值,如果[Symbol.toPrimitive]返回undefiend 则 继续调用 valueOf()//返回原始值,返回则是''({}).toString()//"[Object Object]"--->Number('[Object Object]')//NaN 则下来对比 NaN==0很显然 是false
[]==[] 因为是引用类型 存放在堆内存中比较的是地址 所以是 false
[]==![] 同上解释{}==!{} 从右执行 最右边 []--->ture--->!ture--->false---->Number(false)--->0
接下来是左边 []--->([])[Symbol.toPrimitive]//undefiend--->([]).valueOf()//[](空数组)--->([]).toString()//''(空字符串)--->Number('')// --->0 则0==0 返回ture
题外 在解释 一下 为什么 if([]) 会执行通过呢 这里也有个隐式转化 Boolen([])//ture