JavaScript比较运算符
JavaScript比较
我们从数学中知道许多比较运算符。
在 JavaScript 中,它们是这样写的:
大于/小于:a > b, a < b.
大于/小于或等于:a >= b, a <= b.
Equals: a == b,请注意双等号==表示相等测试,单等号表示a = b赋值。
不等于:在数学中,符号是≠,但在 JavaScript 中,它被写为a != b。
在本文中,我们将更多地了解不同类型的比较,JavaScript 如何进行比较,包括重要的特性。
最后,您会找到避免“JavaScript 怪癖”相关问题的好方法。
结果是布尔值
所有比较运算符都返回一个布尔值:
true – 表示“是”、“正确”或“真相”。
false – 表示“不”、“错误”或“不是事实”。
例如:
alert( 2 > 1 ); // true (correct) alert( 2 == 1 ); // false (wrong) alert( 2 != 1 ); // true (correct)
一个比较结果可以赋值给一个变量,就像任何值一样:
let result = 5 > 4; // assign the result of the comparison alert( result ); // true
字符串比较
为了查看一个字符串是否大于另一个字符串,JavaScript 使用所谓的“字典”或“词典”顺序。
换句话说,字符串是一个字母一个字母的比较。
例如:
alert( 'Z' > 'A' ); // true alert( 'Glow' > 'Glee' ); // true alert( 'Bee' > 'Be' ); // true
比较两个字符串的算法很简单:
1、比较两个字符串的第一个字符。
2、如果第一个字符串中的第一个字符大于(或小于)另一个字符串,则第一个字符串大于(或小于)第二个。我们完成了。
3、否则,如果两个字符串的第一个字符相同,则以相同的方式比较第二个字符。
4、重复直到任一字符串的结尾。
5、如果两个字符串以相同的长度结束,则它们相等。否则,更长的字符串更大。
在上面的第一个示例中,比较'Z' > 'A'在第一步得到结果。
所述第二比较'Glow'和'Glee'需要更多的步骤作为字符串进行比较的字符逐字符:
G与 相同G。
l与 相同l。
o大于e。停在这里。第一个字符串更大。
这里说的字典不是真正的字典,而是 Unicode 顺序
上面给出的比较算法大致相当于字典或电话簿中使用的比较算法,但并不完全相同。
例如,下面很重要。大写字母"A"不等于小写字母"a"。哪个更大?小写"a"。为什么?因为小写字符在 JavaScript 使用的内部编码表 (Unicode) 中具有更大的索引。
不同类型的比较
比较不同类型的值时,JavaScript 会将值转换为数字。
例如:
alert( '2' > 1 ); // true, string '2' becomes a number 2 alert( '01' == 1 ); // true, string '01' becomes a number 1
对于布尔值,true变成1和false变成0。
例如:
alert( true == 1 ); // true alert( false == 0 ); // true
一个有趣的结果
有可能同时:
两个值相等。
其中一个是true布尔值,另一个是false布尔值。
例如:
let a = 0; alert( Boolean(a) ); // false let b = "0"; alert( Boolean(b) ); // true alert(a == b); // true!
从 JavaScript 的角度来看,这个结果很正常。相等检查使用数字转换(因此"0"变为0)来转换值,而显式Boolean转换使用另一组规则。
严格平等
定期的平等检查==有问题。它不能区分0来自false:
alert( 0 == false ); // true
空字符串也会发生同样的事情:
alert( '' == false ); // true
发生这种情况是因为不同类型的操作数被相等运算符转换为数字==。空字符串,就像 一样false,变成零。
怎么做,如果我们想区分0的false?
严格相等运算符===在没有类型转换的情况下检查相等性。
换句话说,如果a和b是不同的类型,则a === b立即返回false而不尝试转换它们。
让我们试试看:
alert( 0 === false ); // false, because the types are different
还有一个!==类似于的“严格不等式”运算符!=。
严格相等运算符的编写时间要长一些,但它使发生的事情一目了然,并减少了出错的空间。
与 null 和 undefined 的比较
当null或undefined与其他值进行比较时,存在非直观行为。
对于严格的平等检查 ===
这些值是不同的,因为它们中的每一个都是不同的类型。
alert( null === undefined ); // false
对于非严格检查 ==
有一个特殊的规则。这两个是“甜蜜的情侣”:它们彼此相等(在 意义上==),但没有任何其他价值。
alert( null == undefined ); // true
用于数学和其他比较 < > <= >=
null/undefined转换为数字:null变成0,而undefined变成NaN。
现在让我们看看当我们应用这些规则时会发生一些有趣的事情。而且,更重要的是,如何不落入他们的圈套。
奇怪的结果:null vs 0
让我们null与零进行比较:
alert( null > 0 ); // (1) false alert( null == 0 ); // (2) false alert( null >= 0 ); // (3) true
在数学上,这很奇怪。最后一个结果表明“null大于或等于零”,因此在上面的比较之一中它必须是true,但它们都是false。
原因是相等检查==和比较的> < >= <=工作方式不同。比较转换null为数字,将其视为0. 这就是为什么(3)null >= 0为true而(1)null > 0为false的原因。
另一方面,==对undefined和的相等性检查null被定义为,在没有任何转换的情况下,它们彼此相等并且不等于其他任何东西。这就是为什么(2)null == 0是错误的。
无与伦比的未定义
该值undefined不应与其他值进行比较:
alert( undefined > 0 ); // false (1) alert( undefined < 0 ); // false (2) alert( undefined == 0 ); // false (3)
为什么它那么讨厌零?永远是false!
我们得到这些结果是因为:
1、比较(1)和(2)返回false因为undefined被转换为NaN并且NaN是一个特殊的数值,它false为所有比较返回。
2、平等检查(3)的回报false,因为undefined只有等于null,undefined并没有其他价值。
避免问题
我们为什么要讨论这些例子?我们应该一直记住这些特点吗?嗯,不是真的。实际上,这些棘手的事情会随着时间的推移逐渐变得熟悉,但是有一个可靠的方法可以避免它们出现问题:
1、小心对待任何比较,undefined/null除了严格的平等===。
2、不要>= > < <=与可能为 的变量进行比较null/undefined,除非您非常确定自己在做什么。如果变量可以具有这些值,请单独检查它们。
总结概括
比较运算符返回一个布尔值。
字符串按“字典”顺序逐个字母进行比较。
当比较不同类型的值时,它们会被转换为数字(不包括严格的相等检查)。
值null和彼此undefined相等==,不等于任何其他值。
使用像>或<偶尔可能为 的变量时要小心null/undefined。null/undefined单独检查是个好主意。