关系运算符小于、大于、小于等于和大于等于执行的是两个数的比较运算,比较方式与算术比较运算相同。
每个关系运算符都返回一个布尔值:
var bResult1 = 2 >1 //true
var bResult2 = 2 <1 //false
不过,对两个字符串应用关系运算符,它们的行为则不同。许多人认为小于表示“在字母顺序上靠前”,大于表示“在字母顺序上靠后”,但事实并非如此。对于字符串,第一个字符串中每个字符的代码都与会第二个字符串中对应位置的字符的代码进行数值比较。完成这种比较操作后,返回一个 Boolean 值。问题在于大写字母的代码都小于小写字母的代码,这意味这着可能会遇到下列情况:
var bResult = "Blue" <"alpha"
alert(bResult) //输出 true
在上面的例子中,字符串 "Blue" 小于 "alpha",因为字母 B 的字符代码是 66,字母 a 的字符代码是 97。要强制性得到按照真正的字母顺序比较的结果,必须把两个数转换成相同的大小写形式(全大写或全小写的),然后再进行比较:
var bResult = "Blue".toLowerCase() <"alpha".toLowerCase()
alert(bResult) //输出 false
把两个运算数都转换成小写,确保了正确识别出 "alpha" 在字母顺序上位于 "Blue" 之前。
比较数字和字符串
另一种棘手的状况发生在比较两个字符串形式的数字时,比如:
var bResult = "25" <"3"
alert(bResult) //输出 "true"
上面这段代码比较的是字符串 "25" 和 "3"。两个运算数都是字符串,所以比较的是它们的字符代码("2" 的字符代码是 50,"3" 的字符代码是 51)。
不过,如果把某个运算数该为数字,那么结果就有趣了:
var bResult = "25" <3
alert(bResult) //输出 "false"
这里,字符串 "25" 将被转换成数字 25,然后与数字 3 进行比较,结果不出所料。
无论何时比较一个数字和一个字符串,ECMAScript 都会把字符串转换成数字,然后按照数字顺序比较它们。
不过,如果字符串不能转换成数字又该如何呢?考虑下面的例子:
var bResult = "a" <3
alert(bResult)
你能预料到这段代码输出什么吗?字母 "a" 不能转换成有意义的数字。不过,如果对它调用 parseInt() 方法,返回的是 NaN。根据规则,任何包含 NaN 的关系运算符都要返回 false,因此这段代码也输出 false:
var bResult = "a" >= 3
alert(bResult)
通常,如果小于运算的两个值返回 false,那么大于等于运算必须返回 true,不过如果某个数字是 NaN,情况则非如此。
js是弱类型语言,也就是说不关注变量的具体类型
举个例子:
<script>let a = '1'
if (a === 1)
{
console.log(a)
}
</script>
结果:
打印出来了1,说明‘1’ == 1,字符串可以直接与数字进行对比。
那你就没有必要去转化它,他本身就是在运行的时候自动确定变量类型。
再看一段代码:
<script>// let a = '1'
// if (a == 1)
// {
// console.log(a)
// }
let str = "123"
let num = 456
console.log(typeof(str), str)
console.log(typeof(num), num)
let new_var1 = str + num
console.log(typeof(new_var1), new_var1)
</script>
结果:
明白了吧
在JavaScript中,字符串的比较,是字符按从左到右一一对应比较的。如:
"hello" >"hi"
先对首字母"h"进行比较。因为相等,所以再对下一位进行比较。
而单个字符的比较,实际上是ASCII码的比较。
字母"e"的ASCII码对应编号是101,而"i"的对应编号是105,所以 "e" >"i" 会返回false。
对上面字符串的比较,可以拆分理解为:
"h" >"h" &&
"e" >"i" &&
"l" >"" &&
"l" >"" &&
"o" >""
因此,
"hello" >"hi" // return false