JS语言设计中出现的一些类型转换和比较规则导致的“怪异”问题

技术 · 02-15

在JavaScript中确实存在一些著名的"怪异"案例,这些都是由JavaScript的类型转换和比较规则导致的。以下是一些典型例子:
相等性比较:

[] == ![]  // true
[] == false  // true
'' == false  // true
null == undefined  // true
[1,2] == '1,2'  // true

针对第一个 [] == ![] 返回true是因为类型转换问题,其详细过程如下:

  1. 首先,![] 会被计算:

    • [] 是一个对象,转换为布尔值时为true
    • !true 得到false
  2. 此时表达式变成了[] == false
  3. 当对象与布尔值比较时,两边都会被转换为数字:

    • [] 会先被转换为原始值,调用toString()得到空字符串""
    • 空字符串转换为数字得到0
    • false转换为数字也是0
  4. 最终变成了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 做详细的解释。

本文作者:首乌

本文链接:https://www.wesee.club/archives/924/

版权声明:自由转载-非商用-非衍生-保持署名(cc 创意共享 3.0 许可证

Theme Jasmine by Kent Liao

粤ICP备2023052298号-1