一玄帕、ECMAScript 一元運(yùn)算符
一元運(yùn)算符只有一個參數(shù)裤纹,即要操作的對象或值。它們是 ECMAScript 中最簡單的運(yùn)算符锡移。
1淆珊、delete
delete 運(yùn)算符刪除對以前定義的對象屬性或方法的引用奸汇。
var o = new Object;
o.name = "David";
alert(o.name); //輸出 "David"
delete o.name;
alert(o.name); //輸出 "undefined"
delete 運(yùn)算符不能刪除開發(fā)者未定義的屬性和方法擂找。例如婴洼,下面的代碼將引發(fā)錯誤:
delete o.toString;
因?yàn)?toString() 方法是原始的 ECMAScript 方法,不是開發(fā)者定義的欢唾。
2礁遣、void
void 運(yùn)算符對任何值返回 undefined祟霍。
提示:請記住,沒有返回值的函數(shù)真正返回的都是 undefined醇王。
3寓娩、前增量(++num)/前減量(--num)運(yùn)算符
直接從 C(和 Java)借用的兩個運(yùn)算符是前增量運(yùn)算符和前減量運(yùn)算符呼渣。
所謂前增量運(yùn)算符屁置,就是數(shù)值上加 1蓝角,形式是在變量前放兩個加號(++):
++iNum; //等價于 iNum = iNum + 1;
--iNum; //等價于 iNum = iNum - 1颇象;
- 注意增量和減量運(yùn)算符都發(fā)生在計算表達(dá)式之前遣钳。先自增(減)再計算
- 兩者優(yōu)先級相同蕴茴,按照從左到右的計算姐直。
4声畏、后增量/后減量運(yùn)算符
還有兩個直接從 C(和 Java)借用的運(yùn)算符,即后增量運(yùn)算符和后減量運(yùn)算符愿棋。
后增量運(yùn)算符也是給數(shù)值上加 1糠雨,形式是在變量后放兩個加號(++):
iNum++; //等價于 iNum = iNum + 1甘邀;
iNum--; //等價于 iNum = iNum - 1;
區(qū)別:與前綴式運(yùn)算符不同的是坞琴,后綴式運(yùn)算符是在計算過包含它們的表達(dá)式后才進(jìn)行增量或減量運(yùn)算的置济。先計算再自增(減)。
兩者優(yōu)先級相同挟纱。
5腐宋、一元加法和一元減法
一元加法本質(zhì)上對數(shù)字無任何影響:
var iNum = 20;
iNum = +iNum;
alert(iNum); //輸出 "20"
注意:盡管一元加法對數(shù)字無作用胸竞,但對字符串卻有有趣的效果卫枝,會把字符串轉(zhuǎn)換成數(shù)字。
var sNum = "20";
alert(typeof sNum); //輸出 "string"
var iNum = +sNum;
alert(typeof iNum); //輸出 "number"
當(dāng)一元加法運(yùn)算符對字符串進(jìn)行操作時吆玖,它計算字符串的方式與 parseInt()
相似沾乘,主要的不同是只有對以 "0x" 開頭的字符串(表示十六進(jìn)制數(shù)字)翅阵,一元運(yùn)算符才能把它轉(zhuǎn)換成十進(jìn)制的值掷匠。因此,用一元加法轉(zhuǎn)換 "010"夭委,得到的總是 10株灸,而 "0xB" 將被轉(zhuǎn)換成 11慌烧。
一元減法就是對數(shù)值求負(fù)(例如把 20 轉(zhuǎn)換成 -20)
與一元加法運(yùn)算符相似鸠儿,一元減法運(yùn)算符也會把字符串轉(zhuǎn)換成近似的數(shù)字进每,此外還會對該值求負(fù)田晚。
var sNum = "20";
alert(typeof sNum); //輸出 "string"
var iNum = -sNum;
alert(iNum); //輸出 "-20"
alert(typeof iNum); //輸出 "number"
二贤徒、ECMAScript 位運(yùn)算符
位運(yùn)算符是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進(jìn)行操作的。
1踢涌、重溫整數(shù)
ECMAScript 整數(shù)有兩種類型睁壁,即有符號整數(shù)(允許用正數(shù)和負(fù)數(shù))和無符號整數(shù)(只允許用正數(shù))堡僻。在 ECMAScript 中疫剃,所有整數(shù)字面量默認(rèn)都是有符號整數(shù)巢价,這意味著什么呢?
有符號整數(shù)使用 31 位表示整數(shù)的數(shù)值备燃,用第 32 位表示整數(shù)的符號并齐,0 表示正數(shù)客税,1 表示負(fù)數(shù)更耻。
- 有符號整數(shù)數(shù)值范圍從 -2147483648 到 2147483647秧均。
- 無符號整數(shù)的數(shù)值范圍為 0 到 4294967295目胡。
可以以兩種不同的方式存儲二進(jìn)制形式的有符號整數(shù),一種用于存儲正數(shù)起胰,一種用于存儲負(fù)數(shù)。正數(shù)是以真二進(jìn)制形式存儲的炉峰,前 31 位中的每一位都表示 2 的冪疼阔,從第 1 位(位 0)開始婆廊,表示 20巫橄,第 2 位(位 1)表示 21湘换。沒用到的位用 0 填充,即忽略不計扶平。
負(fù)數(shù)也存儲為二進(jìn)制代碼结澄,不過采用的形式是二進(jìn)制補(bǔ)碼岸夯。計算負(fù)數(shù)二進(jìn)制補(bǔ)碼的步驟有三步:
- 確定該數(shù)字的非負(fù)版本(絕對值)的二進(jìn)制表示(例如囱修,要計算 -18的二進(jìn)制補(bǔ)碼破镰,首先要確定 18 的二進(jìn)制表示)
- 求得二進(jìn)制反碼鲜漩,即要把 0 替換為 1孕似,把 1 替換為 0
- 在二進(jìn)制反碼上加 1
要確定 -18 的二進(jìn)制表示,首先必須得到 18 的二進(jìn)制表示养渴,如下所示:
0000 0000 0000 0000 0000 0000 0001 0010
接下來理卑,計算二進(jìn)制反碼藐唠,如下所示:
1111 1111 1111 1111 1111 1111 1110 1101
最后宇立,在二進(jìn)制反碼上加 1妈嘹,如下所示:
1111 1111 1111 1111 1111 1111 1110 1101
1
---------------------------------------
1111 1111 1111 1111 1111 1111 1110 1110
因此蟋滴,-18 的二進(jìn)制表示即 1111 1111 1111 1111 1111 1111 1110 1110。記住津函,在處理有符號整數(shù)時尔苦,開發(fā)者不能訪問 31 位允坚。
有趣的是稠项,把負(fù)整數(shù)轉(zhuǎn)換成二進(jìn)制字符串后展运,ECMAScript 并不以二進(jìn)制補(bǔ)碼的形式顯示拗胜,而是用數(shù)字絕對值的標(biāo)準(zhǔn)二進(jìn)制代碼前面加負(fù)號的形式輸出埂软。例如:
var iNum = -18;
alert(iNum.toString(2)); //輸出 "-10010"
這段代碼輸出的是 "-10010"勘畔,而非二進(jìn)制補(bǔ)碼,這是為避免訪問位 31庆寺。
另一方面,無符號整數(shù)把最后一位作為另一個數(shù)位處理壤圃。在這種模式中伍绳,第 32 位不表示數(shù)字的符號冲杀,而是值 231权谁。由于這個額外的位旺芽,無符號整數(shù)的數(shù)值范圍為 0 到 4294967295采章。對于小于 2147483647 的整數(shù)來說悯舟,無符號整數(shù)看來與有符號整數(shù)一樣,而大于 2147483647 的整數(shù)則要使用位 31(在有符號整數(shù)中,這一位總是 0)菠镇。
把無符號整數(shù)轉(zhuǎn)換成字符串后承璃,只返回它們的有效位盔粹。
注意:所有整數(shù)字面量都默認(rèn)存儲為有符號整數(shù)舷嗡。只有 ECMAScript 的位運(yùn)算符才能創(chuàng)建無符號整數(shù)进萄。
2中鼠、位運(yùn)算 NOT
位運(yùn)算 NOT 由否定號(~)表示援雇,它是 ECMAScript 中為數(shù)不多的與二進(jìn)制算術(shù)有關(guān)的運(yùn)算符之一惫搏。
位運(yùn)算 NOT 是三步的處理過程:
- 把運(yùn)算數(shù)轉(zhuǎn)換成 32 位數(shù)字
- 把二進(jìn)制數(shù)轉(zhuǎn)換成它的二進(jìn)制反碼
- 把二進(jìn)制數(shù)轉(zhuǎn)換成浮點(diǎn)數(shù)
位運(yùn)算 NOT 實(shí)質(zhì)上是對數(shù)字求負(fù),然后減 1揖铜。
var iNum1 = 25; //25 等于 00000000000000000000000000011001
var iNum2 = ~iNum1; //轉(zhuǎn)換為 11111111111111111111111111100110
alert(iNum2); //輸出 "-26"
3蛮位、位運(yùn)算 AND
位運(yùn)算 AND 由和號(&)表示失仁,直接對數(shù)字的二進(jìn)制形式進(jìn)行運(yùn)算萄焦。它把每個數(shù)字中的數(shù)位對齊拂封,然后用下面的規(guī)則對同一位置上的兩個數(shù)位進(jìn)行 AND 運(yùn)算:同真為真,一假為假。
例如,要對數(shù)字 25 和 3 進(jìn)行 AND 運(yùn)算,代碼如下所示:
var iResult = 25 & 3;
alert(iResult); //輸出 "1"
25 和 3 進(jìn)行 AND 運(yùn)算的結(jié)果是 1票唆。為什么走趋?分析如下:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
AND = 0000 0000 0000 0000 0000 0000 0000 0001
4、位運(yùn)算 OR
位運(yùn)算 OR 由符號(|)表示姨伟,也是直接對數(shù)字的二進(jìn)制形式進(jìn)行運(yùn)算。在計算每位時肆糕,OR 運(yùn)算符采用下列規(guī)則:一真為真诚啃,同假為假始赎。
5、位運(yùn)算 XOR
位運(yùn)算 XOR 由符號(^)表示魔招,當(dāng)然办斑,也是直接對二進(jìn)制形式進(jìn)行運(yùn)算。XOR 不同于 OR蠕蚜,當(dāng)只有一個數(shù)位存放的是 1 時靶累,它才返回 1尺铣。
對 25 和 3 進(jìn)行 XOR 運(yùn)算,代碼如下:
var iResult = 25 ^ 3;
alert(iResult); //輸出 "26"
25 和 3 進(jìn)行 XOR 運(yùn)算的結(jié)果是 26:
25 = 0000 0000 0000 0000 0000 0000 0001 1001
3 = 0000 0000 0000 0000 0000 0000 0000 0011
---------------------------------------------
XOR = 0000 0000 0000 0000 0000 0000 0001 1010
可以看出争舞,在兩個數(shù)字中凛忿,共有 4 個數(shù)位存放的是 1,這些數(shù)位被傳遞給結(jié)果竞川。二進(jìn)制代碼 11010 等于 26
6店溢、左移運(yùn)算<<
左移運(yùn)算由兩個小于號表示(<<)。它把數(shù)字中的所有數(shù)位向左移動指定的數(shù)量委乌。例如,把數(shù)字 2(等于二進(jìn)制中的 10)左移 5 位遭贸,結(jié)果為 64(等于二進(jìn)制中的 1000000):
var iOld = 2; //等于二進(jìn)制 10
var iNew = iOld << 5; //等于二進(jìn)制 1000000 十進(jìn)制 64
注意:在左移數(shù)位時戈咳,數(shù)字右邊多出 5 個空位。左移運(yùn)算用 0 填充這些空位,使結(jié)果成為完整的 32 位數(shù)字著蛙。
注意:左移運(yùn)算保留數(shù)字的符號位删铃。
7、有符號右移運(yùn)算
有符號右移運(yùn)算符由兩個大于號表示(>>)踏堡。它把 32 位數(shù)字中的所有數(shù)位整體右移猎唁,同時保留該數(shù)的符號(正號或負(fù)號)。有符號右移運(yùn)算符恰好與左移運(yùn)算相反
8顷蟆、無符號右移運(yùn)算
無符號右移運(yùn)算符由三個大于號(>>>)表示诫隅,它將無符號 32 位數(shù)的所有數(shù)位整體右移。對于正數(shù)帐偎,無符號右移運(yùn)算的結(jié)果與有符號右移運(yùn)算一樣逐纬。
用有符號右移運(yùn)算中的例子,把 64 右移 5 位肮街,將變?yōu)?2:
var iOld = 64; //等于二進(jìn)制 1000000
var iNew = iOld >>> 5; //等于二進(jìn)制 10 十進(jìn)制 2
對于負(fù)數(shù)风题,情況就不同了。
無符號右移運(yùn)算用 0 填充所有空位嫉父。對于正數(shù)沛硅,這與有符號右移運(yùn)算的操作一樣,而負(fù)數(shù)則被作為正數(shù)來處理绕辖。
由于無符號右移運(yùn)算的結(jié)果是一個 32 位的正數(shù)摇肌,所以負(fù)數(shù)的無符號右移運(yùn)算得到的總是一個非常大的數(shù)字。例如仪际,如果把 -64 右移 5 位围小,將得到 134217726。
三树碱、ECMAScript Boolean 運(yùn)算符
Boolean 運(yùn)算符有三種:NOT肯适、AND 和 OR。
-
ToBoolean 操作
在學(xué)習(xí)各種邏輯運(yùn)算符之前成榜,讓我們先了解一下 ECMAScript-262 v5 規(guī)范中描述的 ToBoolean 操作框舔。
抽象操作 ToBoolean 將其參數(shù)按照下表中的規(guī)則轉(zhuǎn)換為邏輯值:
ToBoolean 操作
1、邏輯 NOT 運(yùn)算符
在 ECMAScript 中赎婚,邏輯 NOT 運(yùn)算符與 C 和 Java 中的邏輯 NOT 運(yùn)算符相同刘绣,都由感嘆號(!)表示。
與邏輯 OR 和邏輯 AND 運(yùn)算符不同的是挣输,邏輯 NOT 運(yùn)算符返回的一定是 Boolean 值纬凤。
邏輯 NOT 運(yùn)算符的行為如下:
- 如果運(yùn)算數(shù)是對象,返回 false
- 如果運(yùn)算數(shù)是數(shù)字 0撩嚼,返回 true
- 如果運(yùn)算數(shù)是 0 以外的任何數(shù)字停士,返回 false
- 如果運(yùn)算數(shù)是 null挖帘,返回 true
- 如果運(yùn)算數(shù)是 NaN,返回 true
- 如果運(yùn)算數(shù)是 undefined恋技,發(fā)生錯誤
判斷 ECMAScript 變量的 Boolean 值時肠套,也可以使用邏輯 NOT 運(yùn)算符。這樣做需要在一行代碼中使用兩個 NOT 運(yùn)算符猖任。無論運(yùn)算數(shù)是什么類型,第一個 NOT 運(yùn)算符返回 Boolean 值瓷耙。第二個 NOT 將對該 Boolean 值求負(fù)朱躺,從而給出變量真正的 Boolean 值。
var bFalse = false;
var sRed = "red";
var iZero = 0;
var iThreeFourFive = 345;
var oObject = new Object;
document.write("bFalse 的邏輯值是 " + (!!bFalse));
document.write("sRed 的邏輯值是 " + (!!sRed));
document.write("iZero 的邏輯值是 " + (!!iZero));
document.write("iThreeFourFive 的邏輯值是 " + (!!iThreeFourFive));
document.write("oObject 的邏輯值是 " + (!!oObject));
結(jié)果:
bFalse 的邏輯值是 false
sRed 的邏輯值是 true
iZero 的邏輯值是 false
iThreeFourFive 的邏輯值是 true
oObject 的邏輯值是 true
2搁痛、邏輯 AND 運(yùn)算符
在 ECMAScript 中长搀,邏輯 AND 運(yùn)算符用雙和號(&&)表示:
邏輯 AND 運(yùn)算的運(yùn)算數(shù)可以是任何類型的,不止是 Boolean 值鸡典。
如果某個運(yùn)算數(shù)不是原始的 Boolean 型值源请,邏輯 AND 運(yùn)算并不一定返回 Boolean 值:
- 如果一個運(yùn)算數(shù)是對象,另一個是 Boolean 值彻况,返回該對象谁尸。
- 如果兩個運(yùn)算數(shù)都是對象,返回第二個對象纽甘。
- 如果某個運(yùn)算數(shù)是 null良蛮,返回 null。
- 如果某個運(yùn)算數(shù)是 NaN悍赢,返回 NaN决瞳。
- 如果某個運(yùn)算數(shù)是 undefined,發(fā)生錯誤左权。
與 Java 中的邏輯 AND 運(yùn)算相似皮胡,ECMAScript 中的邏輯 AND 運(yùn)算也是簡便運(yùn)算,即如果第一個運(yùn)算數(shù)決定了結(jié)果赏迟,就不再計算第二個運(yùn)算數(shù)屡贺。對于邏輯 AND 運(yùn)算來說,如果第一個運(yùn)算數(shù)是 false瀑梗,那么無論第二個運(yùn)算數(shù)的值是什么烹笔,結(jié)果都不可能等于 true。
3抛丽、邏輯 OR 運(yùn)算符
ECMAScript 中的邏輯 OR 運(yùn)算符與 Java 中的相同谤职,都由雙豎線(||)表示:
與邏輯 AND 運(yùn)算符相似,如果某個運(yùn)算數(shù)不是 Boolean 值亿鲜,邏輯 OR 運(yùn)算并不一定返回 Boolean 值:
- 如果一個運(yùn)算數(shù)是對象允蜈,并且該對象左邊的運(yùn)算數(shù)值均為 false冤吨,則返回該對象。
- 如果兩個運(yùn)算數(shù)都是對象饶套,返回第一個對象漩蟆。
- 如果最后一個運(yùn)算數(shù)是 null,并且其他運(yùn)算數(shù)值均為 false妓蛮,則返回 null怠李。
- 如果最后一個運(yùn)算數(shù)是 NaN,并且其他運(yùn)算數(shù)值均為 false蛤克,則返回 NaN捺癞。
- 如果某個運(yùn)算數(shù)是 undefined,發(fā)生錯誤构挤。
與邏輯 AND 運(yùn)算符一樣髓介,邏輯 OR 運(yùn)算也是簡便運(yùn)算。對于邏輯 OR 運(yùn)算符來說筋现,如果第一個運(yùn)算數(shù)值為 true唐础,就不再計算第二個運(yùn)算數(shù)。
四矾飞、ECMAScript 乘性運(yùn)算符
ECMAScript 的乘性運(yùn)算符與 Java一膨、C、Perl 等于語言中的同類運(yùn)算符的運(yùn)算方式相似洒沦。需要注意的是汞幢,乘性運(yùn)算符還具有一些自動轉(zhuǎn)換功能。
1微谓、乘法運(yùn)算符
乘法運(yùn)算符由星號(*)表示森篷,用于兩數(shù)相乘。
不過豺型,在處理特殊值時仲智,ECMAScript 中的乘法還有一些特殊行為:
-如果結(jié)果太大或太小,那么生成的結(jié)果是 Infinity 或 -Infinity姻氨。
- 如果某個運(yùn)算數(shù)是 NaN钓辆,結(jié)果為 NaN。
- Infinity 乘以 0肴焊,結(jié)果為 NaN前联。
- Infinity 乘以 0 以外的任何數(shù)字,結(jié)果為 Infinity 或 -Infinity娶眷。
- Infinity 乘以 Infinity似嗤,結(jié)果為 Infinity。
注釋:如果運(yùn)算數(shù)是數(shù)字届宠,那么執(zhí)行常規(guī)的乘法運(yùn)算烁落,即兩個正數(shù)或兩個負(fù)數(shù)為正數(shù)乘粒,兩個運(yùn)算數(shù)符號不同,結(jié)果為負(fù)數(shù)伤塌。
2灯萍、除法運(yùn)算符
除法運(yùn)算符由斜杠(/)表示,用第二個運(yùn)算數(shù)除第一個運(yùn)算數(shù)每聪。
與乘法運(yùn)算符相似旦棉,在處理特殊值時,除法運(yùn)算符也有一些特殊行為:
- 如果結(jié)果太大或太小药薯,那么生成的結(jié)果是 Infinity 或 -Infinity他爸。
- 如果某個運(yùn)算數(shù)是 NaN,結(jié)果為 NaN果善。
- Infinity 被 Infinity 除,結(jié)果為 NaN系谐。
- Infinity 被任何數(shù)字除巾陕,結(jié)果為 Infinity。
- 0 除一個任何非無窮大的數(shù)字纪他,結(jié)果為 NaN鄙煤。
- Infinity 被 0 以外的任何數(shù)字除,結(jié)果為 Infinity 或 -Infinity茶袒。
3梯刚、取模運(yùn)算符
除法(余數(shù))運(yùn)算符由百分號(%)表示,使用方法如下:
var iResult = 26%5; //等于 1
與其他乘性運(yùn)算符相似薪寓,對于特殊值亡资,取模運(yùn)算符也有特殊的行為:
- 如果被除數(shù)是 Infinity,或除數(shù)是 0向叉,結(jié)果為 NaN锥腻。
- Infinity 被 Infinity 除,結(jié)果為 NaN母谎。
- 如果除數(shù)是無窮大的數(shù)瘦黑,結(jié)果為被除數(shù)。
- 如果被除數(shù)為 0奇唤,結(jié)果為 0幸斥。
注釋:如果運(yùn)算數(shù)是數(shù)字,那么執(zhí)行常規(guī)的算術(shù)除法運(yùn)算咬扇,返回除法運(yùn)算得到的余數(shù)甲葬。
五、ECMAScript 加性運(yùn)算符
1懈贺、加法運(yùn)算符
與乘性運(yùn)算符一樣演顾,在處理特殊值時供搀,ECMAScript 中的加法也有一些特殊行為:
- 某個運(yùn)算數(shù)是 NaN,那么結(jié)果為 NaN钠至。
- -Infinity 加 -Infinity葛虐,結(jié)果為 -Infinity。
- Infinity 加 -Infinity棉钧,結(jié)果為 NaN屿脐。
- +0 加 +0,結(jié)果為 +0宪卿。
- -0 加 +0的诵,結(jié)果為 +0。
- -0 加 -0佑钾,結(jié)果為 -0西疤。
不過,如果某個運(yùn)算數(shù)是字符串休溶,那么采用下列規(guī)則:
如果兩個運(yùn)算數(shù)都是字符串代赁,把第二個字符串連接到第一個上。
如果只有一個運(yùn)算數(shù)是字符串兽掰,把另一個運(yùn)算數(shù)轉(zhuǎn)換成字符串芭碍,結(jié)果是兩個字符串連接成的字符串。
2孽尽、減法運(yùn)算符
與加法運(yùn)算符一樣窖壕,在處理特殊值時,減法運(yùn)算符也有一些特殊行為:
- 某個運(yùn)算數(shù)是 NaN杉女,那么結(jié)果為 NaN瞻讽。
- Infinity 減 Infinity,結(jié)果為 NaN熏挎。
- -Infinity 減 -Infinity卸夕,結(jié)果為 NaN。
- Infinity 減 -Infinity婆瓜,結(jié)果為 Infinity快集。
- -Infinity 減 Infinity,結(jié)果為 -Infinity廉白。
- +0 減 +0个初,結(jié)果為 +0。
- -0 減 -0猴蹂,結(jié)果為 -0院溺。
- +0 減 -0,結(jié)果為 +0磅轻。
- 某個運(yùn)算符不是數(shù)字珍逸,那么結(jié)果為 NaN逐虚。
六、ECMAScript 關(guān)系運(yùn)算符
關(guān)系運(yùn)算符執(zhí)行的是比較運(yùn)算谆膳。每個關(guān)系運(yùn)算符都返回一個布爾值叭爱。
1、常規(guī)比較方式
關(guān)系運(yùn)算符小于漱病、大于买雾、小于等于和大于等于執(zhí)行的是兩個數(shù)的比較運(yùn)算,比較方式與算術(shù)比較運(yùn)算相同杨帽。最后都返回一個布爾值漓穿。
對于字符串,第一個字符串中每個字符的代碼都與會第二個字符串中對應(yīng)位置的字符的代碼進(jìn)行數(shù)值比較注盈。完成這種比較操作后晃危,返回一個 Boolean 值。問題在于大寫字母的代碼都小于小寫字母的代碼老客,這意味這著可能會遇到下列情況:
var bResult = "Blue" < "alpha";
alert(bResult); //輸出 true
在上面的例子中僚饭,字符串 "Blue" 小于 "alpha",因?yàn)樽帜?B 的字符代碼是 66沿量,字母 a 的字符代碼是 97。要強(qiáng)制性得到按照真正的字母順序比較的結(jié)果冤荆,必須把兩個數(shù)轉(zhuǎn)換成相同的大小寫形式(全大寫或全小寫的)朴则,然后再進(jìn)行比較:
var bResult = "Blue".toLowerCase() < "alpha".toLowerCase();
alert(bResult); //輸出 false
2、比較數(shù)字和字符串
另一種棘手的狀況發(fā)生在比較兩個字符串形式的數(shù)字時钓简,比如:
var bResult = "25" < "3";
alert(bResult); //輸出 "true"
上面這段代碼比較的是字符串 "25" 和 "3"乌妒。兩個運(yùn)算數(shù)都是字符串,所以比較的是它們的字符代碼("2" 的字符代碼是 50外邓,"3" 的字符代碼是 51)撤蚊。
不過,如果把某個運(yùn)算數(shù)該為數(shù)字损话,那么結(jié)果就有趣了:
var bResult = "25" < 3;
alert(bResult); //輸出 "false"
這里侦啸,字符串 "25" 將被轉(zhuǎn)換成數(shù)字 25,然后與數(shù)字 3 進(jìn)行比較丧枪,結(jié)果不出所料光涂。
無論何時比較一個數(shù)字和一個字符串,ECMAScript 都會把字符串轉(zhuǎn)換成數(shù)字拧烦,然后按照數(shù)字順序比較它們忘闻。
不過,如果字符串不能轉(zhuǎn)換成數(shù)字又該如何呢恋博?考慮下面的例子:
var bResult = "a" < 3;
alert(bResult);
你能預(yù)料到這段代碼輸出什么嗎齐佳?字母 "a" 不能轉(zhuǎn)換成有意義的數(shù)字私恬。不過,如果對它調(diào)用 parseInt() 方法炼吴,返回的是 NaN本鸣。根據(jù)規(guī)則,任何包含 NaN 的關(guān)系運(yùn)算符都要返回 false缺厉,因此這段代碼也輸出 false:
var bResult = "a" >= 3;
alert(bResult); //false
通常永高,如果小于運(yùn)算的兩個值返回 false,那么大于等于運(yùn)算必須返回 true提针,不過如果某個數(shù)字是 NaN命爬,情況則非如此。
七辐脖、ECMAScript 等性運(yùn)算符
ECMAScript 提供了兩套等性運(yùn)算符:等號和非等號用于處理原始值饲宛,全等號和非全等號用于處理對象。
1嗜价、等號和非等號
在 ECMAScript 中艇抠,等號由雙等號(==)表示,當(dāng)且僅當(dāng)兩個運(yùn)算數(shù)相等時久锥,它返回 true家淤。非等號由感嘆號加等號(!=)表示,當(dāng)且僅當(dāng)兩個運(yùn)算數(shù)不相等時瑟由,它返回 true絮重。為確定兩個運(yùn)算數(shù)是否相等,這兩個運(yùn)算符都會進(jìn)行類型轉(zhuǎn)換歹苦。
執(zhí)行類型轉(zhuǎn)換的規(guī)則如下:
- 如果一個運(yùn)算數(shù)是 Boolean 值青伤,在檢查相等性之前,把它轉(zhuǎn)換成數(shù)字值殴瘦。false 轉(zhuǎn)換成 0狠角,true 為 1。
- 如果一個運(yùn)算數(shù)是字符串蚪腋,另一個是數(shù)字丰歌,在檢查相等性之前,要嘗試把字符串轉(zhuǎn)換成數(shù)字屉凯。
- 如果一個運(yùn)算數(shù)是對象动遭,另一個是字符串,在檢查相等性之前神得,要嘗試把對象轉(zhuǎn)換成字符串厘惦。
- 如果一個運(yùn)算數(shù)是對象,另一個是數(shù)字,在檢查相等性之前宵蕉,要嘗試把對象轉(zhuǎn)換成數(shù)字酝静。
在比較時,該運(yùn)算符還遵守下列規(guī)則:
- 值 null 和 undefined 相等羡玛。
- 在檢查相等性時别智,不能把 null 和 undefined 轉(zhuǎn)換成其他值。
- 如果某個運(yùn)算數(shù)是 NaN稼稿,等號將返回 false薄榛,非等號將返回 true。
- 如果兩個運(yùn)算數(shù)都是對象让歼,那么比較的是它們的引用值敞恋。如果兩個運(yùn)算數(shù)指向同一對象,那么等號返回 true谋右,否則兩個運(yùn)算數(shù)不等硬猫。
重要提示:即使兩個數(shù)都是 NaN,等號仍然返回 false改执,因?yàn)楦鶕?jù)規(guī)則啸蜜,NaN 不等于 NaN。
下表列出了一些特殊情況辈挂,以及它們的結(jié)果:2衬横、全等號和非全等號
全等號由三個等號表示(===),只有在無需類型轉(zhuǎn)換運(yùn)算數(shù)就相等的情況下终蒂,才返回 true蜂林。全等必須值和類型都相等才返回true。
八后豫、ECMAScript 條件運(yùn)算符
variable = boolean_expression ? true_value : false_value;
如果 Boolean_expression 為 true悉尾,就把 true_value 賦給變量突那;如果它是 false挫酿,就把 false_value 賦給變量。
九愕难、ECMAScript 賦值運(yùn)算符
賦值運(yùn)算符:
- 簡單的賦值運(yùn)算符由等號(=)實(shí)現(xiàn)早龟,只是把等號右邊的值賦予等號左邊的變量。
- 復(fù)合賦值運(yùn)算是由乘性運(yùn)算符猫缭、加性運(yùn)算符或位移運(yùn)算符加等號(=)實(shí)現(xiàn)的
每種主要的算術(shù)運(yùn)算以及其他幾個運(yùn)算都有復(fù)合賦值運(yùn)算符:
- 乘法/賦值(*=)
- 除法/賦值(/=)
- 取模/賦值(%=)
- 加法/賦值(+=)
- 減法/賦值(-=)
- 左移/賦值(<<=)
- 有符號右移/賦值(>>=)
- 無符號右移/賦值(>>>=)
十葱弟、ECMAScript 逗號運(yùn)算符
用逗號運(yùn)算符可以在一條語句中執(zhí)行多個運(yùn)算。
例如:
var iNum1 = 1, iNum = 2, iNum3 = 3;
逗號運(yùn)算符常用變量聲明中猜丹。
本文摘自W3shcool教程