JavaScript中==和===的区别

前言

JavaScript 中的相等运算符无疑是新手开发者最容易混淆的知识点之一。

=====这两个运算符的细微差别往往会在代码中造成一些令人困惑的行为

在本文中,我们将深入探讨这两个相等运算符的工作原理,比较它们的特点和局限性

让我们开始吧!

区别

  1. 类型转换:

    • == 运算符在比较时会进行隐式类型转换,将操作数转换为相同的类型后再进行比较。
    • === 运算符不会进行隐式类型转换,它会先检查操作数的类型,如果类型不同就直接返回 false
  2. 比较结果:

    • == 运算符在进行比较时,会尽量将操作数转换为相同的类型,然后再比较值。
    • === 运算符严格比较,不仅要求值相同,还要求类型相同。

== 示例

在进行==操作有以下的规则:

  1. 如果两个操作数的类型相同,则直接比较它们的值。
  2. 如果操作数中有布尔值,则先将布尔值转换为数字,再进行比较。
  3. 如果其中一个操作数是字符串,另一个是数字,则将字符串转换为数字,再进行比较。
  4. 如果其中一个操作数是对象,另一个不是,则调用对象的 valueOf() 方法获取原始值,再进行比较。如果无法获取原始值,则调用 toString() 方法获取字符串,再进行比较。

接下来对他们进行比较

  1. Number vs Number:
ini 复制代码
console.log(5 == 5); // true
console.log(0 == -0); // true
console.log(NaN == NaN); // false

数字之间的比较会直接比较它们的值。需要注意的是,NaN 与任何值(包括自己)都不相等。

  1. String vs String:
arduino 复制代码
console.log("hello" == "hello"); // true
console.log("42" == "42"); // true
console.log("" == ""); // true

字符串之间的比较会逐个字符进行比较。

  1. Boolean vs Boolean:
arduino 复制代码
console.log(true == true); // true
console.log(false == false); // true

布尔值之间的比较会直接比较它们的值。

  1. Null vs Undefined:
javascript 复制代码
console.log(null == undefined); // true
console.log(null == null); // true
console.log(undefined == undefined); // true

nullundefined 在比较时被视为相等。

  1. Number vs String:
ini 复制代码
console.log(5 == "5"); // true
console.log(0 == ""); // true
console.log(0 == "0"); // true
console.log(42 == "hello"); // false 当无法转换为数字转换为0

当一个操作数是数字,另一个是字符串时,字符串会被转换为数字进行比较。

  1. Boolean vs Number:
arduino 复制代码
console.log(true == 1); // true
console.log(false == 0); // true
console.log(true == 2); // false

布尔值在比较时会先转换为数字,true 转换为 1false 转换为 0

  1. Object vs Primitive:
arduino 复制代码
console.log([10] == 10); // true
console.log({} == "[object Object]"); // true

当一个操作数是对象,另一个是原始值时,对象会先调用 ToPrimitive 抽象操作进行转换。

=== 示例

如果类型不同,=== 直接返回false

  1. Number vs Number:
ini 复制代码
console.log(5 === 5); // true
console.log(0 === -0); // true
console.log(NaN === NaN); // false

数字之间的严格比较会直接比较它们的值。需要注意的是,NaN 与任何值(包括自己)都不相等。

  1. String vs String:
arduino 复制代码
console.log("hello" === "hello"); // true
console.log("42" === "42"); // true
console.log("" === ""); // true

字符串之间的严格比较会逐个字符进行比较。

  1. Boolean vs Boolean:
arduino 复制代码
console.log(true === true); // true
console.log(false === false); // true

布尔值之间的严格比较会直接比较它们的值。

  1. Null vs Undefined:
javascript 复制代码
console.log(null === undefined); // false
console.log(null === null); // true
console.log(undefined === undefined); // true

nullundefined 在严格比较时是不相等的。

  1. Number vs String:
ini 复制代码
console.log(5 === "5"); // false
console.log(0 === ""); // false
console.log(0 === "0"); // false
console.log(42 === "hello"); // false

当一个操作数是数字,另一个是字符串时,它们不会进行任何类型转换,直接返回 false

  1. Boolean vs Number:
arduino 复制代码
console.log(true === 1); // false
console.log(false === 0); // false
console.log(true === 2); // false

布尔值和数字在严格比较时也不会进行任何类型转换,直接返回 false

  1. Object vs Primitive:
arduino 复制代码
console.log([10] === 10); // false
console.log({} === "[object Object]"); // false

当一个操作数是对象,另一个是原始值时,它们的类型不同,所以直接返回 false

总结

本文讲解了==和===的数据对比之间的区别,通过代码示例深入分析

希望本文能够对你有所帮助!!!!

相关推荐
一 乐11 分钟前
高校后勤报修系统|物业管理|基于SprinBoot+vue的高校后勤报修系统(源码+数据库+文档)
java·前端·javascript·数据库·vue.js·毕设
爱喝水的小周12 分钟前
《UniApp 页面配置文件pages.json》
前端·uni-app·json
mapbar_front18 分钟前
React中useContext的基本使用和原理解析
前端·react.js
倔强青铜三30 分钟前
苦练Python第73天:玩转对象持久化,pickle模块极速入门
人工智能·python·面试
贪婪的君子38 分钟前
【每日一面】实现一个深拷贝函数
前端·js
那年窗外下的雪.1 小时前
鸿蒙ArkUI布局与样式进阶(十五)—— 模块化 · 自定义组件 · 泛型机制深度解析
javascript·华为·typescript·harmonyos·鸿蒙·arkui
一点七加一1 小时前
Harmony鸿蒙开发0基础入门到精通Day09--JavaScript篇
开发语言·javascript·ecmascript
_安晓2 小时前
Rust 中精确大小迭代器(ExactSizeIterator)的深度解析与实践
java·前端·python
烛阴2 小时前
从create到yield:Lua协程完全上手指南
前端·lua
薛一半2 小时前
Vue3的Pinia详解
前端·javascript·vue.js