比较运算符

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了比较运算符相关的知识,希望对你有一定的参考价值。

原文地址:https://wangdoc.com/javascript/

概述

javascript一共提供了8个比较运算符。

  • >大于比较运算符
  • <小于比较运算符
  • <=小于等于比较运算符
  • >=大于等于比较运算符
  • ==相等运算符
  • ===严格相等运算符
  • !=不相等运算符
  • >=严格不相等运算符
    这八个比较运算符分为两类:相等比较和非相等比较。两者的规则是不一样的,对于非相等比较,算法是先看两个运算子是否都是字符串,如果是的,就按照字典顺序比较(实际上是比较Unicode码点);否则,将两个运算子都转成数值,再比较数值的大小。

    非相等运算符:字符串的比较

    JavaScript引擎内部首先比较首字符的Unicode码点。如果相等,在比较第二个字符的Unicode码点,以此类推。

    非相等运算符:非字符串的比较

    如果两个运算子都不是字符串,分为以下两种情况
    (1)原始类型值
    如果两个运算子都是原始类型的值,则是先转成数值再比较。
5 > ‘4‘
// 等同于 5 > Number(‘4‘)

任何值(包括NaN本身)与NaN比较,返回的都是false
(2)对象
如果运算子是对象,会转为原始类型的值,再进行比较。对象转换成原始类型的值,算法是先调用valueOf方法;如果返回的还是对象,再接着调用toString方法。

var x = [2];
x > "11" // true
// 等同于 [2].valueOf().toString() > "11"
// 即"2" > "11"

x.valueOf = function() { return "1"; }
x > "11" // false
// 等同于 [2].valueOf() > "11"
// 即"1" > "11"

严格相等运算符

JavaScript提供两种相等运算符:=====
简单的,它们的区别是相等运算符(==)比较两个值是否相等,严格相等运算符(==)比较它们是否为同一个值。如果两个值不是同一类型,严格相等运算符直接返回false,而相等运算符会将它们转换成同一类型,再用严格相等运算符进行比较。
(1)不同类型的值
如果两个值类型不同,直接返回false

1 === "1" // false
true === "true" // false  
true == "true" // false
true == "1" //true

(2)同一类的原始类型
同一类型的原始类型的值(数值、字符串、布尔值)比较时,值相等就返回true,值不同就返回falseNaN与任何值都不相等,包括自身。另外,正0等于负0
(3)复合类型值
两个复合类型(对象、数组、函数)的数据比较时,不是比较它们的值是否相等,而是比较它们是否指向同一个地址。

[] === [] // false
{} === {} // false
(function() {} === function() {}) // false

var v1 = {};
v2 = v1;
v1 === v2; // true
注意:**对于两个对象的比较,严格相等运算符比较的是地址,而大于或小于运算符比较的是值**。 **(4)undefined和null** <font color=red>undefined</font>和<font color=red>null</font>与自身严格相等。js
undefined === undefined // true
null === null // true
由于变量声明后默认值是<font color=red>undefined</font>,因此两个只声明没有赋值的变量是相等的。js
var v1;
var v2;
v1 === v2 // true
**(6)相等运算符** 相等运算符用来比较相同类型的数据是,与严格相等运算符完全一样。js
1 == 1.0
1 === 1.0
比较不同类型的数据是,相等运算符会先将数据进行类型转换,然后再用严格相等运算符比较。 * 原始类型值 原始类型的值会转换成数值再进行比较。js
1 == true // true
// 等同于 1 === Number(true)

* 对象与原始类型值比较
对象(这里指广义的对象,包括数组和函数)与原始类型的值比较时,对象转换成原始类型的值,再进行比较。

// 对象和数值比较时,对象转为数值
[1] == 1 //true
// 等同于 Number([1]) == 1

// 对象和字符串比较时,对象转为字符串
[1] == "1" // true
// 等同于String([1]) == "1"
[1, 2] == "1,2" // true

// 对象和布尔值比较时,两边都转为数值
[1] == true // true
[2] == true // false
* undefined和null <font color=red>undefined</font>和<font color=red>null</font>与其他类型比较时,结构都为<font color=red>false</font>,它们互相比较时,结果为<font color=red>true</font>。js
false == null //false
false == undefined // false
0 == null // false
0 == undefined // false
undefined == null // true
```
由于相等运算符隐藏的类型转换,会带来一些违反直觉的结果。因此建议不要使用相等运算符,最好只使用严格相等运算符。

以上是关于比较运算符的主要内容,如果未能解决你的问题,请参考以下文章

10个JavaScript代码片段,使你更加容易前端开发。

比较有用的php代码片段

20个简洁的 JS 代码片段

20个简洁的 JS 代码片段

比较 C# 中的字符串片段并从集合中删除项目

如何在 python 中并行化以下代码片段?