javascript中==的数据类型转换规则
-
如果只有一个值,判断这个值是真还是假,遵循只有0, NaN, "", null, undefined这五个是假, 其余都是真
-
如果是两个值比较是否相等, 遵循这个规则: val1 == val2 两个值可能不是同一个数据类型的, 如果是==比较的话,会进行默认的数据类型转换
-
对象==对象, 永远不相等: 如 '[] == [] // false' '({} == {}) // false'
(function fn(){} == function() {}) // false
-
对象== 字符串, 先将对象转换成字符串(调用toString()方法),然后再进行比较. )例如:
[] == "" //true, 执行了[].toString()
({}) == "" // false
({}.toString()) // "[object Object]"
[].toString(); // "" -
对象== 布尔类型, 对象先转换为字符串(toString()),然后把字符串转换为数字(Number() "" --> 0), 布尔类型也转换为数字(true是1, false是0); 最后让两个数字比较
Number('') // 0
[] == false // true -
对象 == 数字 对象先转换为字符串(toString()),然后把字符串转换为数字(Number()), // []--->""--->0
-
数字 == 布尔 布尔转换为数字(Number()), true是1, false是0
-
数字 == 字符串 字符串转换为数字
-
字符串 == 布尔 都转换为数字
-
null == undefined 结果是true
-
null或undefined和其它任何数据类型都不相等
-
NaN和任何东西都不相等
除了==
是比较, ===
也是比较(绝对比较), val1和val2 如果数据类型不一样,肯定不相等.
总之==
的数据类型转换的大体思路就是: 能转字符串就转字符串, 还不够就转数字啦...所以[]==![]
返回true, 就是因为这其实是一个对象类型和布尔类型比较; 两边转数字以后都是0.
实践中这些数据转换的规律并没有什么大用, 判等的时候应当尽量都用===
以避免数据类型转换, 仅在判断null和undefined的时候可以用==
.
顺便还有javascript中的运算符优先级...从高到低大体上是:
- 一元运算符(求反, 逻辑非(!), 转数字(+),++, --),typeof, delete优先级最高;
- 乘除/求模;
- 加减;
-
=, <=, >, <, instance of;
- 判等运算符(==, =, !=, !);
- &&;
- 带有赋值的,优先级最低(=, +=, -=...)