理解 JavaScript 中的相等性

相等是 JavaScript 中最基本的概念之一,但如果你不熟悉它的细微差别,它也可能有点棘手。在本博客中,我们将重点介绍两种类型的相等运算符:`==` 和 `===`。让我们分解它们以了解它们的区别以及何时使用它们。

1️⃣ ==(允许强制)

`==` 运算符检查相等性,但允许类型强制转换。这意味着 JavaScript 会在比较值之前尝试将值转换为相同类型。

📌示例:

console.log(5 == '5'); // true
console.log(false == 0); // true
console.log(null == undefined); // true

⁉️解释

在这些情况下,JavaScript 会强制将一种类型转换(或强制转换)为另一种类型,以进行比较。例如:

  • 比较之前,字符串“5”被强制转换为数字 5。
  • false 被强制转换为 0。
  • 在松散相等性中,null 和 undefined 被视为相等。
  • 🚨警告:

    虽然 `==` 看起来很方便,但它可能会导致意外结果,尤其是在比较不同类型的值时。使用此运算符时,请务必仔细检查您的逻辑。

    2️⃣ ===(不允许强制)

    `===` 运算符,也称为**严格相等运算符**,不执行类型强制转换。它比较操作数的值和类型。

    📌示例:

    console.log(5 === '5'); // false
    console.log(false === 0); // false
    console.log(null === undefined); // false

    ⁉️解释

    这里没有发生类型转换。操作数的值和类型必须匹配,比较才能返回“true”。这使得“===”成为更安全、更可预测的选项。

    🤔 什么是强制?

    简单来说,强制转换是 JavaScript 为了进行比较而“强制说服”一种值类型转换为另一种值类型的方式。

    **现实生活中的例子:比较苹果和橘子**

    想象一下你正在比较一个苹果和一个橘子:

    **1️⃣ ==(松散平等)**

    这就像说:“如果苹果和橙子都是水果,那么苹果和橙子就是一样的。”在这里,你只关注它们的类别(类型强制)。

    🍎 == 🍊 → True (Both are fruit)

    **2️⃣ ===(严格平等)**

    这就像说:“只有当苹果和橙子是完全相同的水果时,它们才相等。”这里不存在强制或转换。

    🍎 === 🍊 → False (One is an apple, the other is an orange)

    💡 最佳实践

    1️⃣ 默认使用 `===`。

  • 严格平等可以避免由于强制而导致的意外结果。
  • 2️⃣仅在必要时使用`==`。

  • 如果您有意利用类型强制(例如,比较 null 和 undefined 时),请清楚地记录您的理由。
  • 💻尝试一下:

    console.log("== Case 1 ==")
    const var1 = '10'
    const var2 = '10'
    console.log(var1 == var2) // Output: true
    console.log(var1 === var2) // Output: true
    
    console.log("== Case 2 ==")
    const var3 = '10'
    const var4 = 10
    console.log(var3 == var4) // Output: true // JavaScript automatically coercion variable var4 to var3 string type
    console.log(var3 === var4) // Output: false // Must ensure both value have same datatype
    
    console.log("== Case 3 ==")
    const var5 = ''
    const var6 = 10
    console.log(var5 == var6) // Output: false
    console.log(var5 === var6) // Output: false
    
    console.log("== Case 4 ==")
    const var7 = ''
    const var8 = 10
    console.log(var7 == var8) // Output: false
    console.log(var7 === var8) // Output: false
    
    console.log("== Case 5 ==")
    const var9 = 0
    const var10 = ''
    console.log(var9 == var10) // Output: true
    console.log(var9 === var10) // Output: false
    
    console.log("== Case 6 ==")
    const var11 = false
    const var12 = ''
    console.log(var11 == var12) // Output: true
    console.log(var11 === var12) // Output: false
    
    console.log("== Case 7 ==")
    const var13 = null
    const var14 = undefined
    console.log(var13 == var14) // Output: true
    console.log(var13 === var14) // Output: false

    结论

    `==` 允许类型强制转换,可能会导致意外的比较。`===` 更严格,可确保值和类型匹配。了解强制转换可以帮助您编写更可预测且无错误的代码。

    祝你编码愉快!✨