ECMAScript 關(guān)系操作符(小于(<)、大于(>)、小于等于(<=)和大于等于(>=))
關(guān)系操作符
小于(<)、大于(>)、小于等于(<=)和大于等于(>=)這幾個(gè)關(guān)系操作符用于對(duì)兩個(gè)值進(jìn)行比較,比較的規(guī)則與我們?cè)跀?shù)學(xué)課上所學(xué)的一樣。這幾個(gè)操作符都返回一個(gè)布爾值,如下面的例子所示:
var resultl=5>3; //true
var result2=5<3; //false
在此南昌網(wǎng)站建設(shè)公司前端開(kāi)發(fā)工程師提示:與ECMAScript中的其他操作符一樣,當(dāng)關(guān)系操作符的操作數(shù)使用了非數(shù)值時(shí),也要進(jìn)行數(shù)據(jù)轉(zhuǎn)換或完成某些奇怪的操作。以下就是相應(yīng)的規(guī)則:
◎如果兩個(gè)操作數(shù)都是數(shù)值,則執(zhí)行數(shù)值比較;
◎如果兩個(gè)操作數(shù)都是字符串,則比較兩個(gè)字符串對(duì)應(yīng)的字符編碼值;
◎如果一個(gè)操作數(shù)是數(shù)值,則將另一個(gè)操作數(shù)轉(zhuǎn)換為一個(gè)數(shù)值,然后執(zhí)行數(shù)值比較;
◎如果一個(gè)操作數(shù)是對(duì)象,則調(diào)用這個(gè)對(duì)象的valueOf()方法,用得到的結(jié)果按照前面的規(guī)則執(zhí)行比較。如果對(duì)象沒(méi)有valueOf()方法,則調(diào)用toString()方法,并用得到的結(jié)果根據(jù)前面的規(guī)則執(zhí)行比較;
◎如果一個(gè)操作數(shù)是布爾值,則先將其轉(zhuǎn)換為數(shù)值,然后再執(zhí)行比較。
在使用關(guān)系操作符比較兩個(gè)字符串時(shí),會(huì)執(zhí)行—種奇怪的操作。很多人都會(huì)認(rèn)為,在比較字符串值時(shí),小于的意思是“在字母表中的位置靠前”,而大于則意味著“在字母表中的位置靠后”,但實(shí)際上完全不是那么回事。在比較字符串時(shí),實(shí)際比較的是兩個(gè)字符串中對(duì)應(yīng)位置的每個(gè)字符的字符編碼值。經(jīng)過(guò)這么一番比較之后,再返回一個(gè)布爾值。由于大寫字母的字符編碼全部小于小寫字母的字符編碼,因此我們就會(huì)看到如下所示的奇怪現(xiàn)象:
var result="Brick"’<"alphabet"; //true
在這個(gè)例子中,字符串”Brick”被認(rèn)為小于字符串”alphabet”。原因是字母B的字符綿碼為66.而字母a的字符編碼是97。如果要真正按字母表順序比較字符串,南昌網(wǎng)站制作公司前端開(kāi)發(fā)工程師認(rèn)為,就必須把兩個(gè)操作數(shù)轉(zhuǎn)換為相同的大小寫形式(全部大寫或全部小寫),然后再執(zhí)行比較,如下所示:
var result="Brick".toLowerCase() <"alphabet".toLowerCase(); //false
通過(guò)將兩個(gè)操作數(shù)都轉(zhuǎn)換為小寫形式,就可以得出”alphabet”按字母表順序排在。Brick。之前的正確判斷了。
另一種奇怪的現(xiàn)象發(fā)生在比較兩個(gè)數(shù)字字符串的情況下,比如下面這個(gè)例子:
var result="23"<"3"; //true
確實(shí),當(dāng)比較字符串”23”是否小于”3”時(shí),結(jié)果居然是true。這是因?yàn)閮蓚€(gè)操作數(shù)都是字符串,而字符串比較的是字符編碼(”2”的字符編碼是50,而”3”的字符編碼是51)。不過(guò),如果像下面例子中一樣,將一個(gè)操作數(shù)改為數(shù)值,比較的結(jié)果就正常了:
var result="23"<3;//false
此時(shí),字符串”23”會(huì)被轉(zhuǎn)換成數(shù)值23,然后再與3進(jìn)行比較,因此就會(huì)得到合理的結(jié)果。在比較數(shù)值,字符串都會(huì)被轉(zhuǎn)換成數(shù)值,然后再以數(shù)值方式與另一個(gè)數(shù)值比較,當(dāng)然,這個(gè)規(guī)則對(duì)前面的例子是適用的??墒牵绻莻€(gè)字符串不能被轉(zhuǎn)換成一個(gè)合理的數(shù)值呢?比如:
Var result=”a”<3;//false,因?yàn)椤盿”被轉(zhuǎn)換成了NaN
由于字母”a”不能轉(zhuǎn)換成合理的數(shù)值,因此就被轉(zhuǎn)換成了NaN。南昌網(wǎng)頁(yè)設(shè)計(jì)公司技術(shù)人員介紹,所以根據(jù)規(guī)則,任何操作數(shù)與NaN進(jìn)行關(guān)系比較,結(jié)果都是false。于是,就出現(xiàn)了下面這個(gè)有意思的現(xiàn)象:
var resultl=NaN<3; //false
var result2=NaN>=3; //false
按照常理,如果一個(gè)值不小于另一個(gè)值,則一定是大于或等于那個(gè)值。然而,在與NaN進(jìn)行比較時(shí),這兩個(gè)比較操作的結(jié)果都返回了false。
希望本文對(duì)廣大站長(zhǎng)或從事企業(yè)網(wǎng)站建設(shè)公司的團(tuán)隊(duì)有所幫助,如對(duì)此不太理解的,可以與南昌網(wǎng)絡(luò)公司百恒網(wǎng)絡(luò)技術(shù)部聯(lián)系。我們很高興與廣大站長(zhǎng)和從事企業(yè)網(wǎng)站建設(shè)公司技術(shù)人員分享我們的技術(shù)和經(jīng)驗(yàn)。