在JavaScript中确实存在一些著名的"怪异"案例,这些都是由JavaScript的类型转换和比较规则导致的。以下是一些典型例子:
相等性比较:
[] == ![] // true
[] == false // true
'' == false // true
null == undefined // true
[1,2] == '1,2' // true
针对第一个 [] == ![]
返回true是因为类型转换问题,其详细过程如下:
首先,
![]
会被计算:[]
是一个对象,转换为布尔值时为true!true
得到false
- 此时表达式变成了
[] == false
当对象与布尔值比较时,两边都会被转换为数字:
[]
会先被转换为原始值,调用toString()得到空字符串""- 空字符串转换为数字得到0
- false转换为数字也是0
- 最终变成了
0 == 0
,所以返回true
类型转换:
[] + [] // ""(空字符串)
[] + {} // "[object Object]"
{} + [] // 0
true + true // 2
数值运算:
typeof NaN // "number"
0.1 + 0.2 !== 0.3 // true
9999999999999999 // 10000000000000000
变量提升:
console.log(a); // undefined
var a = 1;
this指向:
const obj = {
foo: function() { return this; },
bar: () => this
};
这些"怪异"案例提醒我们在开发中要注意:
1\使用严格相等运算符(===)代替相等运算符(==)
2\小心处理数值计算,特别是浮点数
3\理解变量提升和this绑定机制
4\使用TypeScript等工具来避免类型相关的问题
具体问题可以问问对应的ai 做详细的解释。