ECMAScript 運(yùn)算

一玄帕、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)算

注意:左移運(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教程

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末芝加,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子射窒,更是在濱河造成了極大的恐慌藏杖,老刑警劉巖将塑,帶你破解...
    沈念sama閱讀 218,858評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異蝌麸,居然都是意外死亡点寥,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,372評論 3 395
  • 文/潘曉璐 我一進(jìn)店門来吩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來敢辩,“玉大人,你說我怎么就攤上這事弟疆∑莩ぃ” “怎么了?”我有些...
    開封第一講書人閱讀 165,282評論 0 356
  • 文/不壞的土叔 我叫張陵兽间,是天一觀的道長历葛。 經(jīng)常有香客問我,道長嘀略,這世上最難降的妖魔是什么恤溶? 我笑而不...
    開封第一講書人閱讀 58,842評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮帜羊,結(jié)果婚禮上咒程,老公的妹妹穿的比我還像新娘。我一直安慰自己讼育,他們只是感情好帐姻,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,857評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著奶段,像睡著了一般饥瓷。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上痹籍,一...
    開封第一講書人閱讀 51,679評論 1 305
  • 那天呢铆,我揣著相機(jī)與錄音,去河邊找鬼蹲缠。 笑死棺克,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的线定。 我是一名探鬼主播娜谊,決...
    沈念sama閱讀 40,406評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼斤讥!你這毒婦竟也來了纱皆?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,311評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎派草,沒想到半個月后撑帖,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,767評論 1 315
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澳眷,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,945評論 3 336
  • 正文 我和宋清朗相戀三年胡嘿,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片钳踊。...
    茶點(diǎn)故事閱讀 40,090評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡衷敌,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出拓瞪,到底是詐尸還是另有隱情缴罗,我是刑警寧澤,帶...
    沈念sama閱讀 35,785評論 5 346
  • 正文 年R本政府宣布祭埂,位于F島的核電站面氓,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏蛆橡。R本人自食惡果不足惜舌界,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,420評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望泰演。 院中可真熱鬧呻拌,春花似錦、人聲如沸睦焕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,988評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽垃喊。三九已至猾普,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間本谜,已是汗流浹背初家。 一陣腳步聲響...
    開封第一講書人閱讀 33,101評論 1 271
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留耕突,地道東北人笤成。 一個月前我還...
    沈念sama閱讀 48,298評論 3 372
  • 正文 我出身青樓评架,卻偏偏與公主長得像眷茁,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子纵诞,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,033評論 2 355

推薦閱讀更多精彩內(nèi)容