[] == ![];
// true
一个简单的运算,一共涉及了:运算符优先级,boolean类型的转换,相等运算符的比较逻辑,数值的转换逻辑所以还是蛮经典的
- 圆括号()
- 成员访问.
- 后置递增|后置递减++|--
- 逻辑非,一元加,一元减,前置递增,前置递减
- 乘法,除法,取模
- 加法,减法
- 大于,大于等于,小于,小于等于
- 等号,非等号,全等
- 逻辑与... && ...
- 逻辑或... || ...
- 条件运算法... ? ... : ...
- 赋值=
首先,是根据运算符优先级来确定运算顺序。根据上面列出的常用运算符的优先级,可得出会先运算等号左边的。
- 只有null, undefined,""(空字符串),0和NaN转化为false(这些类型叫假值)。所以[]转化为true
- !逻辑非操作符首先会将它的操作数转换为一个布尔值,然后再对其取反
- !!两个逻辑非,作用域Boolean()转型函数行为相同
- &&如果左侧为真值,则返回右侧值.如果左侧为假值,则返回左侧的值
- ||如果左侧为真值,则返回左侧值.否则返回右侧值
逻辑非会先把变量转化为boolean值,再对他做非运算。所以这里考查,boolean类型的转换,根据上面所以最终会把![]转化为false
- 如果两个操作数类型相同,用严格比较,
- 如果一个是null,另一个是undefined。则相等
- 如果一个是数字,另一个是字符串。则把字符串转化为数字,然后比较
- 如果一个是boolean值。则先将其转为数字。true为1,false为0
- 如果一个是Object,另一个是数字或字符串。则让把Object转化为原始值,再比较。JS先尝试用valueOf()转化。再尝试用toString()转化。再比较([].toString为''(空字符串),空字符再变为0。所以[]==''==0; ![] == !true == false == 0(有boolean值先转为数字))
所以会先把false转换为数字类型的0。然后再把[]使用toString()把[]转为''
- Booean值,true为1,false为0
- null,返回0
- undefined,返回NaN
- 对象,先调用ValueOf(),如果是NaN,再调用toString()
- 字符串
- 只包含数字(浮点字符)(包括以正负号开头),则转化为10进制数值(浮点数值)。数字后有其他字符都不行!
- 只包含有效的十六进制格式,被转化为16进制
- 空字符串,返回0
- 其他,都返回NaN
最终会把[]转化为0,所以0 == 0