一元運(yùn)算符一元運(yùn)算符只有一個參數(shù),即要操作的對象或值。它們是 ECMAScript 中最簡單的運(yùn)算符。 delete 運(yùn)算符刪除對以前定義的對象屬性或方法的引用。例如: var obj = new Object(); obj.name = "David"; alert(obj.name); //輸出 "David" delete obj.name; alert(obj.name); //輸出 "undefined"
delete 運(yùn)算符不能刪除開發(fā)者未定義的屬性和方法。例如,下面的代碼是沒什么效果的: delete obj.toString;
即使 toString 是有效的方法名,這行代碼也會引發(fā)錯誤,因為 toString() 方法是原始的 ECMAScript 方法,不是開發(fā)者定義的。 delete 還可以用來刪除數(shù)組中的元素(這沒什么奇怪的,數(shù)組和對象是相通的) var arr = [2,4,6,8,10]; delete arr[2]; alert(arr[2]);//undefined
void 運(yùn)算符對任何值返回 undefined。該運(yùn)算符通常用于避免輸出不應(yīng)該輸出的值,例如,從 HTML 的 <a> 元素調(diào)用 JavaScript 函數(shù)時。要正確做到這一點,函數(shù)不能返回有效值,否則瀏覽器將清空頁面,只顯示函數(shù)的結(jié)果。例如: <a href="javascript:window.open('about:blank')">Click me</a>
如果把這行代碼放入 HTML 頁面,點擊其中的鏈接,即可看到屏幕上顯示 "[object]"。TIY這是因為 window.open() 方法返回了新打開的窗口的引用。然后該對象將被轉(zhuǎn)換成要顯示的字符串。要避免這種效果,可以用 void 運(yùn)算符調(diào)用 window.open() 函數(shù): <a href="javascript:void(window.open('about:blank'))">A</a> //這使 window.open() 調(diào)用返回 undefined,它不是有效值,不會顯示在瀏覽器窗口中。
沒有返回值的函數(shù)真正返回的都是 undefined。 直接從 C(和 Java)借用的兩個運(yùn)算符是前增量運(yùn)算符和前減量運(yùn)算符。所謂前增量運(yùn)算符,就是數(shù)值上加 1,形式是在變量前放兩個加號(++): var iNum = 10; ++iNum; //實際上等價于 var iNum = 10; iNum = iNum + 1;
同樣,前減量運(yùn)算符是從數(shù)值上減 1,形式是在變量前放兩個減號(--): var iNum = 10;
--iNum;
在使用前綴式運(yùn)算符時,注意增量和減量運(yùn)算符都發(fā)生在計算表達(dá)式之前??紤]下面的例子: var iNum = 10; --iNum; alert(iNum); //輸出 "9" alert(--iNum); //輸出 "8" alert(iNum); //輸出 "8"
第二行代碼對 iNum 進(jìn)行減量運(yùn)算,第三行代碼顯示的結(jié)果是("9")。第四行代碼又對 iNum 進(jìn)行減量運(yùn)算,不過這次前減量運(yùn)算和輸出操作出現(xiàn)在同一個語句中,顯示的結(jié)果是 "8"。為了證明已實現(xiàn)了所有的減量操作,第五行代碼又輸出一次"8"。在算術(shù)表達(dá)式中,前增量和前減量運(yùn)算符的優(yōu)先級是相同的,因此要按照從左到右的順序計算之。例如: var iNum1 = 2; var iNum2 = 20; var iNum3 = --iNum1 + ++iNum2; //等于 "22" var iNum4 = iNum1 + iNum2;//等于 "22"
還有兩個直接從 C(和 Java)借用的運(yùn)算符,即后增量運(yùn)算符和后減量運(yùn)算符。后增量運(yùn)算符也是給數(shù)值上加 1,形式是在變量后放兩個加號(++): var iNum = 10;
iNum++;
后減量運(yùn)算符是從數(shù)值上減 1,形式為在變量后加兩個減號(--): var iNum = 10;
iNum--;
與前綴式運(yùn)算符不同的是,后綴式運(yùn)算符是在計算過包含它們的表達(dá)式后才進(jìn)行增量或減量運(yùn)算的??紤]以下的例子: var iNum = 10; iNum--; alert(iNum); //輸出 "9" alert(iNum--); //輸出 "9" alert(iNum); //輸出 "8"
在算術(shù)表達(dá)式中,后增量和后減量運(yùn)算符的優(yōu)先級是相同的,因此要按照從左到右的順序計算之。例如: var iNum1 = 2; var iNum2 = 20; var iNum3 = iNum1-- + iNum2++; //等于 "22" var iNum4 = iNum1 + iNum2; //等于 "22"
在前面的代碼中,iNum3 等于 22,因為表達(dá)式要計算的是 2 + 20。變量 iNum4 也等于 22,不過它計算的是 1 + 21,因為增量和減量運(yùn)算都在給 iNum3 賦值后才發(fā)生。 大多數(shù)人都熟悉一元加法和一元減法,它們在 ECMAScript 中的用法與您高中數(shù)學(xué)中學(xué)到的用法相同。一元加法本質(zhì)上對數(shù)字無任何影響,只用來表示正數(shù),但不能將負(fù)數(shù)轉(zhuǎn)換成正數(shù) var num=-10; alert(+num);//-10
但并不是一元加法就一無用處.由于這類的運(yùn)算符只能作用于數(shù)字,因些,當(dāng)將這些運(yùn)算符運(yùn)用于字符串時,可以起到將字符串轉(zhuǎn)換成數(shù)字的妙效! var str ="123"; str = +str; alert(typeof str);//number
一元減法也有這樣的效用,但同時,它還會對數(shù)字求負(fù)! 位運(yùn)算符位運(yùn)算符是在數(shù)字底層(即表示數(shù)字的 32 個數(shù)位)進(jìn)行操作的。 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ù)值范圍從 -2147483648 到 2147483647。 可以以兩種不同的方式存儲二進(jìn)制形式的有符號整數(shù),一種用于存儲正數(shù),一種用于存儲負(fù)數(shù)。正數(shù)是以真二進(jìn)制形式存儲的,前 31 位中的每一位都表示 2 的冪,從第 1 位(位 0)開始,表示 20,第 2 位(位 1)表示 21。沒用到的位用 0 填充,即忽略不計。例如,下面展示的是數(shù) 18 的表示法。 18 的二進(jìn)制版本只用了前 5 位,它們是這個數(shù)字的有效位。把數(shù)字轉(zhuǎn)換成二進(jìn)制字符串,就能看到有效位: var iNum = 18; alert(iNum.toString(2)); //輸出 "10010"
這段代碼只輸出 "10010",而不是 18 的 32 位表示。其他的數(shù)位并不重要,因為僅使用前 5 位即可確定這個十進(jìn)制數(shù)值。如下圖所示: 負(fù)數(shù)也存儲為二進(jìn)制代碼,不過采用的形式是二進(jìn)制補(bǔ)碼。計算數(shù)字二進(jìn)制補(bǔ)碼的步驟有三步:
要確定 -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。為了簡便,ECMAScript 用一種簡單的方式處理整數(shù),使得開發(fā)者不必關(guān)心它們的用法。另一方面,無符號整數(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ù)。
按位非運(yùn)算符首先將數(shù)字轉(zhuǎn)換成二進(jìn)制(32位),然后再對各個數(shù)位上的1替換成0,而0則替換成1 var num = 12; /*12轉(zhuǎn)換成二進(jìn)制數(shù)為1100,32位形式為 00000000000000000000000000001100 //取該二進(jìn)制數(shù)的補(bǔ)碼 11111111111111111111111111110011 //-13 */ alert(~num);//-13,輸出仍然以十進(jìn)制格式 //按位非實際上是對數(shù)字取負(fù),然后再減一
按位與,按位或,按位異或運(yùn)算符都是先將數(shù)字轉(zhuǎn)換成32位二進(jìn)制數(shù),然后對各位進(jìn)行操作 /* 0 & 0 == 0 1 | 0 == 1 0 & 1 == 0 1 | 1 == 1 1 & 1 == 1 0 | 0 == 0 異或比較特殊,當(dāng)兩加只有一個是1時返回1,其它返回0 1 ^ 1 == 0 1 ^ 0 == 1 0 ^ 0 == 0 */ var num1 = 12; var num2 = 24; /* 00000000000000000000000000001100 // 12 00000000000000000000000000011000 // 24 ----------------------------------------------------- // & 00000000000000000000000000001000 // 8 */ alert(num1 & num2);// 8 /* 00000000000000000000000000001100 // 12 00000000000000000000000000011000 // 24 ----------------------------------------------------- // | 00000000000000000000000000011100 // 28 */ alert(num1 | num2);// 28 /* 00000000000000000000000000001100 // 12 00000000000000000000000000011000 // 24 ----------------------------------------------------- // ^ 00000000000000000000000000010100 // 20 */ alert(num1 ^ num2);//20 alert(num1 << 4);//將12左移4位,192 /*左移運(yùn)算符將二進(jìn)制數(shù)字向左移動N位,空出的位置用0填充,超出32位的截去(不改變第32位) 00000000000000000000000000001100 00000000000000000000000011000000 //192 */ alert(num1 >> 4);//將12有符號右移4位,0 /*有符號右移運(yùn)算符將二進(jìn)制數(shù)字向右移動N位,前面空出的位置用0填充(不改變第32位),后面截去N位 00000000000000000000000000001100 //12 00000000000000000000000000000000 //0 */ alert(num1 >>> 4);//將12無符號右移4位,0 /*無符號右移運(yùn)算符將二進(jìn)制數(shù)字向右移動N位,前面空出的位置用0填充,后面截去N位 //如果N大于0,第32位總會用0填充,使用無符號右移運(yùn)算符得到的總是正數(shù) 00000000000000000000000000001100 //12 00000000000000000000000000000000 //0,對于正數(shù),有符號右移和無符號右移一樣 */ alert(-num1 >>> 4);//將-12無符號右移4位,268435455 /* 11111111111111111111111111110100 //-12 00001111111111111111111111111111 //268435455 */
Boolean 運(yùn)算符Boolean 運(yùn)算符有三種:NOT(!)、AND(&&) 和 OR(||)。
//下面皆返回true alert(!null); alert(!0); alert(!undefined); alert(!false); alert(!""); alert(!NaN); //下面皆返回false alert(!" "); alert(!true); alert(!(new Object())); alert(!-1);
邏輯非運(yùn)算符(!)始終返回布爾值! 當(dāng)然,邏輯非運(yùn)算符還有另外一個用途---〉將其它類型轉(zhuǎn)換成布爾值,例如: alert(!!NaN);//NaN的邏輯值為false
在 ECMAScript 中,邏輯 AND 運(yùn)算符用雙和號(&&)表示,邏輯OR運(yùn)算符有雙豎線表示(||),它們的效用你可能已經(jīng)很清楚 alert(true && true);//true alert(false && true);//false alert(false && false);//false alert(true || true);//true alert(true || false);//true alert(false || false);//false
然而在ECMAScript中,AND與OR運(yùn)算符不但可以作用于邏輯值! alert(34 && String);//將返回34 //但新手對這樣的比較可能很迷惑
ECMAScript中的邏輯與邏輯或運(yùn)算符又被稱之為"快速與","快速或",或稱之為"短路與","短路或".稱之為短路或快速,是因為它們在測試兩邊條件時(將其轉(zhuǎn)換成布爾值),如果第一個表達(dá)式的值已經(jīng)能夠確定整個表達(dá)式值的時候,就不會繼續(xù)求下一個表達(dá)式的值,直接將這個值返回.比如與操作,如果第一個值轉(zhuǎn)換為布爾是false,那么不管下個是true還是false,整個表達(dá)式的值都會是false,而對于OR運(yùn)算符,則是如果第一個邏輯值為true,那么整個表達(dá)式的值就定了,就不用判斷第二個條件了,所以,我們應(yīng)該在AND運(yùn)算中將最可能是false的條件放在前面,而在OR運(yùn)算中,則將最有可能是true的條件放在前面,這樣可以提高效率!我們可以用下面的例子來證明這一點: function fnTrue() { alert(true); return true; } function fnFalse() { alert(false); return false; } //注意是執(zhí)行兩個函數(shù),將返回值進(jìn)行比較 var a = fnFalse() && fnTrue();//只會出現(xiàn)一個彈窗,顯示false //a = fnTrue() || fnFalse();//這一步只會出現(xiàn)一個彈窗,顯示true
而對于這兩個操作符的返回值,則只要記住一點:將最后判斷的那個條件的值返回 //AND中第一個為true時,還要繼續(xù)判斷,第二個為false,整個表達(dá)式的值為false,同時將第二個條件返回 alert(true && false); //當(dāng)對其它類型使用AND時也是這樣的 alert(null && Object);//將返回null,因為在AND運(yùn)算中第一條件為false,就無須繼續(xù)了 //同理,OR運(yùn)算也是如此 alert(Object || String);//返回Object,因為它的邏輯值是true alert(false || NaN);//返回NaN
數(shù)學(xué)運(yùn)算符加法(+),減法(-),乘法(*),除法(/)以及取模(%)都是小學(xué)數(shù)學(xué)的內(nèi)容了,這里我們主要討論在ECMAScript中,當(dāng)這些運(yùn)算符與一些特殊值相遇時會是什么情況
如果對其它類型的值進(jìn)行數(shù)學(xué)運(yùn)算,那么其它類型的值會自動轉(zhuǎn)換成數(shù)字,如果轉(zhuǎn)換失敗,則返回NaN(只有加法運(yùn)算可以和普通字符串相連) 語句判斷語句:if (condition) {...} , if (condition) {....}else {....} , if (condition) {....} else if (condition) {......} else {.....} 循環(huán)語句:while (condition) {...} , do {...} while (condition) ,for (initialization; expression; post-loop-expression) statement; for (var key in obj) {......} 有標(biāo)簽的語句與break,continue語句 break 和 continue 語句的不同之處:break 語句可以立即退出循環(huán),阻止再次反復(fù)執(zhí)行任何代碼。而 continue 語句只是退出當(dāng)前循環(huán),根據(jù)控制表達(dá)式還允許繼續(xù)進(jìn)行下一次循環(huán)。 var iNum = 0; outermost: for (var i=0; i<10; i++) { for (var j=0; j<10; j++) { if (i == 5 && j == 5) { break outermost; } iNum++; } } alert(iNum); //輸出 "55"
with 語句用于設(shè)置代碼在特定對象中的作用域。 var sMessage = "hello"; with(sMessage) { alert(toUpperCase()); //輸出 "HELLO" } var person = new Object(); person.age = 18; person.name = "XXX"; person.parent = "ZZZ"; with (person) { alert(age+"\n"+name+"\n"+parent); }
with 語句是運(yùn)行緩慢的代碼塊,尤其是在已設(shè)置了屬性值時。大多數(shù)情況下,如果可能,最好避免使用它。 |
|