[] == ![] 应该是什么?
[] == ![]
JavaScript 运算符
| 优先级 | 运算符 | 说明 | 结合性 |
|---|---|---|---|
| 1 | []、.、() |
字段访问、数组索引、函数调用和表达式分组 | 从左向右 |
| 2 | ++ — -~!delete new typeof void | 一元运算符、返回数据类型、对象创建、未定 义的值 |
从右向左 |
| 3 | *、/、% | 相乘、相除、求余数 | 从左向右 |
| 4 | +、- | 相加、相减、字符串串联 | 从左向右 |
| 5 | <<、>>、>>> | 左位移、右位移、无符号右移 | 从左向右 |
| 6 | <、<=、>、>=、instanceof | 小于、小于或等于、大于、大于或等于、是否 为特定类的实例 |
从左向右 |
| 7 | ==、!=、===、!== | 相等、不相等、全等,不全等 | 从左向右 |
| 8 | & | 按位“与” | 从左向右 |
| 9 | ^ | 按位“异或” | 从左向右 |
| 10 | | | 按位“或” | 从左向右 |
| 11 | && | 短路与(逻辑“与”) | 从左向右 |
| 12 | || | 短路或(逻辑“或”) | 从左向右 |
| 13 | ?: | 条件运算符 | 从右向左 |
| 14 | =、+=、-=、*=、/=、%=、&=、|=、^=、<、<=、>、>=、>>= | 混合赋值运算符 | 从右向左 |
| 15 | , | 多个计算 | 按优先级计算, 然后从右向左 |
运算优先级
如: typeof new ! 等,只要后面的跟一个操作数都称为一元运算符。
tyoepf 1 ![]
二元运算符
如:常用的 + - * / (加减乘除)等
1+1 2*1 3/1
三元运算符
只有 ? : 三元运算符只有2个
1 ? 2 : 1
当然还有比上面更高的,那就是“()”,括号里面会先算
解题
- 在js中只有6个值转换成布尔类型的时候是false,分别是:undefined、Null、NAN、””、false、0
js中如果那一个对象和基础类型进行比较是无法比较的,所以它会转换成原始值
- 题目 [] == ![] 这里有两个运算符 ,分别是:!(非运算符 ) 和 == (比较运算符),“!”非运算符是一个一元运算符,所以会先计算后面的 ![] ,“[]”一个空的对象取反就是 false,得出 [] == false
- 首先是会调用valueOf 方法,看看返回的结果是否是原始类型(false undefined null 0 等),如果不是就往下调用 toString() 方法
- 当一个空对象调用toString() 方法会返回空字符串 “” ,结果变为:”” == false
- 但还不是相同数据类型,如果一个空的字符串类型 和一个布尔值会转换成数字
“” 转换为 0 , false转换成 0
结果变为 0 == 0
结论
当使用一个对象转换成原始数据类型的时候会先调用valueOf方法,然后在调用toString() 方法,(但是Date只会调用toString方法,不会调用valueOf方法)
