比较运算符

比较运算符用于判断左右两侧的值是否满足一定条件,这些条件有等于、不等于、大于、小于、大于或等于、小于或等于这几种。当满足条件时,表达式会返回 true;否则,返回 false。表4-4列出了 TypeScript 中的比较运算符。

image 2024 02 17 15 58 45 980
Figure 1. 表4-4 比较运算符

以下为关于比较运算符的示例代码。

let a: number = 10;
console.log(a == 10);  //true
console.log(a == 20);  //false
console.log(a === 10); //true
console.log(a === 20); //false
console.log(a != 30);  //true
console.log(a != 10);  //false
console.log(a !== 30); //true
console.log(a !== 10); //false
console.log(a > 9);    //true
console.log(a > 10);   //false
console.log(a < 12);   //true
console.log(a < 10);   //false
console.log(a >= 9);   //true
console.log(a >= 11);  //false
console.log(a <= 11);  //true
console.log(a <= 9);   //false

该运算符可以用于所有类型,以下是用字符串类型和布尔类型相比较的示例代码。

let a: boolean = true;
console.log(a == true);  //true
console.log(a === true); //true
console.log(a != true);  //false
console.log(a !== true); //false
console.log(a > false);  //true,true默认大于false
console.log(a < false);  //false
console.log(a >= false); //true
console.log(a <= false); //false

let b: string = "a"
console.log(b == "a");   //true
console.log(b === "a");  //true
console.log(b != "a");   //false
console.log(b !== "a");  //false
console.log(b > "b");    //false
//参考字符串在Unicode编码表中的先后顺序,排序靠后的字符串大于排序靠前的字符串
console.log(b < "b");    //true
console.log(b >= "b");   //false
console.log(b <= "b");   //true

注意,在 TypeScript 中,比较运算符只能用于同类型比较,无法用于异类型比较。异类型比较会引起编译错误。在 JavaScript 中,比较不同类型的数据会触发隐式转换,也许会出现不可预料的结果,因此在 TypeScript 中进行了限制,只能进行同类型比较。

//编译错误:此条件将始终返回 "false",因为类型 "string" 和 "number" 没有重叠。ts(2367)
console.log("1" == 1);
//编译错误:此条件将始终返回 "true",因为类型 "number" 和 "boolean" 没有重叠。ts(2367)
console.log(1 != true);
//编译错误:运算符">"不能应用于类型"string"和"number"。ts(2365)
console.log("a" > 1);
//编译错误:运算符"<="不能应用于类型"boolean"和"number"。ts(2365)
console.log(true <= 30);

JavaScript 中,由于比较运算符在比较不同类型时存在隐式转换,因此针对比较相等和比较不相等两种情况,分别提供了两种形式的运算符(=====!=!==)。由于 TypeScript 默认限制了隐式转换,因此在类型已经明确时使用 ===== 以及使用 !=!== 的差别不大。但如果类型不明确(例如,在 TypeScript 中使用了 any 类型,后面会提到),使用 ===== 以及使用 !=!== 就会有明显区别,示例代码如下。

let a: any = 1;
let b: any = "1";
console.log(a == b);  //true
console.log(a === b); //false
console.log(a != b);  //false
console.log(a !== b); //true

可以看到,a 的值是数值,b 的值是字符串,两者是不同的类型,但当定义为 any 类型时进行比较,用 == 比较的结果与用 === 比较的结果不同,用 != 的比较结果与用 !== 比较的结果也不同。由于使用 ==!= 时,运算符两边的类型不同,因此产生了隐式转换。以上代码等同于以下代码。

let a: any = 1;
let b: any = "1";
console.log(String(a) == b); //true
console.log(a === b);        //false
console.log(String(a) != b); //false
console.log(a !== b);        //true

任何时候都建议优先使用 ===!== 运算符,以免出现意外的结果。