[] == ![] 应该是什么?

  1. [] == ![]

JavaScript 运算符

优先级 运算符 说明 结合性
1 [].() 字段访问、数组索引、函数调用和表达式分组 从左向右
2 ++ — -~!delete new typeof void 一元运算符、返回数据类型、对象创建、未定
义的值
从右向左
3 *、/、% 相乘、相除、求余数 从左向右
4 +、- 相加、相减、字符串串联 从左向右
5 <<、>>、>>> 左位移、右位移、无符号右移 从左向右
6 <、<=、>、>=、instanceof 小于、小于或等于、大于、大于或等于、是否
为特定类的实例
从左向右
7 ==、!=、===、!== 相等、不相等、全等,不全等 从左向右
8 & 按位“与” 从左向右
9 ^ 按位“异或” 从左向右
10 | 按位“或” 从左向右
11 && 短路与(逻辑“与”) 从左向右
12 || 短路或(逻辑“或”) 从左向右
13 ?: 条件运算符 从右向左
14 =、+=、-=、*=、/=、%=、&=、|=、^=、<、<=、>、>=、>>= 混合赋值运算符 从右向左
15 , 多个计算 按优先级计算,
然后从右向左

运算优先级

  • 什么是运算优先级? 比如我们使用数学运算的时候 1+2*3 = 7 , 在数学种要先算乘除才算加减。所以等于 7

    在JS种运算符大概分3类

    一元运算符

  • 等级比二元和三元运算符还高

如: typeof new ! 等,只要后面的跟一个操作数都称为一元运算符。
tyoepf 1 ![]

二元运算符

如:常用的 + - * / (加减乘除)等
1+1 2*1 3/1

三元运算符

只有 ? : 三元运算符只有2个
1 ? 2 : 1

当然还有比上面更高的,那就是“()”,括号里面会先算

解题

  • 在js中只有6个值转换成布尔类型的时候是false,分别是:undefined、Null、NAN、””、false、0

js中如果那一个对象和基础类型进行比较是无法比较的,所以它会转换成原始值

  1. 题目 [] == ![] 这里有两个运算符 ,分别是:!(非运算符 ) 和 == (比较运算符),“!”非运算符是一个一元运算符,所以会先计算后面的 ![] ,“[]”一个空的对象取反就是 false,得出 [] == false
  2. 首先是会调用valueOf 方法,看看返回的结果是否是原始类型(false undefined null 0 等),如果不是就往下调用 toString() 方法
  3. 当一个空对象调用toString() 方法会返回空字符串 “” ,结果变为:”” == false
  4. 但还不是相同数据类型,如果一个空的字符串类型 和一个布尔值会转换成数字

“” 转换为 0 , false转换成 0
结果变为 0 == 0

结论

当使用一个对象转换成原始数据类型的时候会先调用valueOf方法,然后在调用toString() 方法,(但是Date只会调用toString方法,不会调用valueOf方法)