Javascript/js的相等和不等运算符(= 、== 、===)

本文详细解释了JavaScript中“==”与“===”运算符的区别及应用规则,包括类型转换、对象比较等方面,帮助读者深入理解并正确使用这两种相等运算符。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    "=="和"==="运算符用于比较两个值是否相等,当然它们对相等的定义不尽相同。两个运算符允许任意类型的操作数,如果操作数相等则返回true,否则返回false。“===”也称为严格相等运算符或恒等运算符(sctrict equality or identity operator),用它来检测两个操作数是否严格相等。“==”运算符称作相等运算符(equality operator),用它来检测两个操作数是否相等,这里“相等”的定义就非常宽松,可以允许进行类型转换。

    JavaScript支持“=”、“==”、“===”运算符。你应当理解这些(赋值、相等、恒等或绝对相等)运算符直接的区别,并在编码过程中小心使用。尽管它们都可以称作“相等”,但为了减少概念混淆,应该把 “=” 称作 “得到或赋值” ,把 “==” 称作 “相等” ,把 “===” 称作 “严格相等或绝对相等”。

    “!=”和“!==”运算符的检测规则是“==”和“===”运算符的求反。如果两个值通过“==”的比较结果为true,那么通过“!=”的比较结果则为false。如果两值通过“===”的比较结果为true,那么通过“!==”的比较结果则为false。“!=”称作”不相等“、“!==
”被称作“不严格相等”。

    JavaScript对象的比较是引用的比较,而不是值的比较。对象和其本身是相等的,但和其他任何对象都不相等。如果两个不同的对象具有相同数量的属性,相同的属性名和值,它们依然是不相等的。相应位置的数组元素是相等的两个数组也是不相等的。

    严格相等运算符“===”首先计算其操作数的值,然后比较这两个值,比较过程中没有任何类型转换:

  • 如果两个值类型不相同,则它们不相等。
  • 如果两个值都是null或者都是undefined,则它们不相等。
  • 如果两个值都是布尔值true或都是布尔值false,则它们不相等。
  • 如果其中一个值是NaN,或者两个值都是NaN,则他们不相等。NaN和其他任何值都是不相等的,包括它本身!通过X!=X来判断X是否为NaN,只有在X为NaN的时候,这个表达式的值才为true。
  • 如果两个值为数字且数值相等,则它们相等。如果一个值为0,另一个值为-0,则它们同样相等。
  • 如果两个值为字符串,且所含的对应位上的16位数 完全相等,则它们相等。如果它们的长度或内容不同,则它们不等。两个字符串可能含义完全一样且所显示出的字符也一样,但具有不同编码的16位值。javaScript并不对Unicode进行标准化的转换,因此像这样的字符串通过“===”和“==”运算符的比较结果也不相等。
  • 如果两个引用值指向同一个对象、数组或函数,则它们是相等的。如果指向不同的对象,则它们是不相等的,尽管两个对象具有完全一样的属性。

    相等运算符“==”和恒等运算符相似,但相等运算符的比较并不严格。如果两个操作数不是同一类型,那么相等运算符会尝试进行一些类型转换,然后进行比较:

  • 如果两个操作数的类型相同,则和上文所述的严格相等的比较规则一样。如果严格相等,那么比较结果为相等。如果它们不严格相等,则比较结果为不相等。
  • 如果两个操作数类型不同,“==”相等操作符也可能会认为它们相等。检测相等将会遵守如下规则和类型转换:
    • 如果一个值是null,另一个是undefined,则它们相等。
    • 如果一个值是数字,另一个是字符串,先将字符串转换为数字然后使用转换后的值进行比较。
    • 如果其中一个值是true,则将其转换为1再进行比较。如果其中一个值是false,则将其转换为0再进行比较。
    • 如果一个值是对象,另一个值是数字或字符串,先将对象转换为原始值,然后再进行比较。对象通过toString()方法或者valueOf()方法转换为原始值。JavaScript语言核心的内置类首先尝试使用valueOf(),再尝试使用toString(),除了日期类,日期类只能使用toSring()方法转换。那些不是JavaScript语言核心中的对象则通过各自的实现种定义的方法转换为原始值。
    • 其他不同类型之间的比较均不相等。

转载于:https://www.cnblogs.com/wushangzhizun/p/6345019.html

<think>我们正在讨论'=='是否属于关系运算符。根据引用[3],运算符分为算术运算符、逻辑运算符、关系运算符等。关系运算符通常用于比较两个值,并返回布尔值(true或false)。引用[2]明确指出,在多种编程语言(如C、Java、Python等)中,基本比较运算符包括"==",它用于判断相等。同时,引用[4]给出了一个Java示例,其中使用"=="比较两个整数,并将结果赋值给布尔变量,这进一步证明了"=="是关系运算符。因此,我们可以得出结论:在大多数编程语言中,'=='是关系运算符。</think>是的,在绝大多数编程语言中,**'==' 属于关系运算符**。以下是详细说明: ### 1. 关系运算符的定义 关系运算符用于**比较两个操作数之间的关系**,并返回布尔值(`true`/`false`)。根据引用[3]: > "运算符是一种告诉编译器执行特定的算数或逻辑操作的符号... 关系运算符作比较"[^3]。 ### 2. '==' 的明确分类 - **核心功能**:判断两个操作数是否相等 - **返回值**:布尔值(`true` 或 `false`) - **典型用法**: ```java int A = 2; int B = 2; boolean flag = (A == B); // 返回true[^4] ``` - **与其他关系运算符并列**: - `==`(相等) - `!=`(不等) - `>`(大于) - `<`(小于) - `>=`(大于等于) - `<=`(小于等于) ### 3. 语言支持证据 - **C/Java/Python等主流语言**:均将 `==` 作为标准关系运算符[^2]。 - **特殊语言中的定位**: - JavaScript:`==` 是关系运算符(宽松相等),`===` 是严格相等运算符[^2]。 - SQL/VB:虽然用 `=` 表示相等,但本质仍属于关系比较[^2]。 ### 4. 关系运算符的关键特 1. **操作数类型**:可比较数值、字符、对象引用等(类型需兼容)。 2. **优先级与结合**: - 优先级通常低于算术运算符(如 `+`, `*`) - 左结合(从左向右计算)[^3]。 3. **表达式构成**: `(操作数1) == (操作数2)` 构成布尔表达式。 ### 示例:不同语言中的使用 ```java // Java System.out.println(5 == 5); // 输出 true[^4] ``` ```python # Python print(3.0 == 3) # 输出 True(类型不同但值相等) ``` ```javascript // JavaScript console.log(1 == "1"); // true(宽松比较) console.log(1 === "1"); // false(严格比较)[^2] ``` ### 注意事项 - **与赋值运算符区别**:`=` 用于赋值(如 `int x = 5;`),而 `==` 用于比较。 - **类型敏感行为**: 某些语言(如 JavaScript)存在宽松比较(`==`)与严格比较(`===`)的区别[^2]。 --- ### 相关问题 1. 为什么有些编程语言用 `=` 做判等运算符(如 Pascal),而大多数用 `==`? 2. 关系运算符 `>=` `<=` 在底层是如何实现的? 3. 在面向对象语言中,`==` 比较对象时是比较值还是内存地址? 4. JavaScript 中 `==` `===` 的具体类型转换规则是什么? [^2]: 引用[2]说明了不同语言中判等运算符的设计差异。 [^3]: 引用[3]定义了运算符的基本特(操作数、表达式、优先级)。 [^4]: 引用[4]展示了关系运算符在代码中的实际应用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值