小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

javascript快速入門10

 橘子悅讀 2013-12-02

一元運(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ǔ)碼的步驟有三步:

  1. 確定該數(shù)字的非負(fù)版本的二進(jìn)制表示(例如,要計算 -18的二進(jìn)制補(bǔ)碼,首先要確定 18 的二進(jìn)制表示)
  2. 求得二進(jìn)制反碼,即要把 0 替換為 1,把 1 替換為 0
  3. 在二進(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。為了簡便,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)算符
按位非 NOT
按位與 AND
按位或 OR
按位異或 XOR
左移運(yùn)算 <<
有符號右移運(yùn)算 >>
無符號右移運(yùn)算 >>>

按位非運(yùn)算符首先將數(shù)字轉(zhuǎn)換成二進(jìn)制(32位),然后再對各個數(shù)位上的1替換成0,而0則替換成1

復(fù)制代碼
    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ù),然后再減一
復(fù)制代碼

 

按位與,按位或,按位異或運(yùn)算符都是先將數(shù)字轉(zhuǎn)換成32位二進(jìn)制數(shù),然后對各位進(jìn)行操作

復(fù)制代碼
    /*
    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
    */
復(fù)制代碼

 

Boolean 運(yùn)算符

Boolean 運(yùn)算符有三種:NOT(!)、AND(&&) 和 OR(||)。

邏輯 NOT 運(yùn)算符的行為如下:
對于0,true,null,NaN,undefined,空字符串,返回true
對于非0數(shù)字,非空字符串,非空對象,true,返回false
復(fù)制代碼
    //下面皆返回true
    alert(!null);
    alert(!0);
    alert(!undefined);
    alert(!false);
    alert(!"");
    alert(!NaN);
    //下面皆返回false
    alert(!" ");
    alert(!true);
    alert(!(new Object()));
    alert(!-1);
復(fù)制代碼

 

邏輯非運(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的條件放在前面,這樣可以提高效率!我們可以用下面的例子來證明這一點:

復(fù)制代碼
    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
復(fù)制代碼

 

而對于這兩個操作符的返回值,則只要記住一點:將最后判斷的那個條件的值返回

復(fù)制代碼
    //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
復(fù)制代碼

 

數(shù)學(xué)運(yùn)算符

加法(+),減法(-),乘法(*),除法(/)以及取模(%)都是小學(xué)數(shù)學(xué)的內(nèi)容了,這里我們主要討論在ECMAScript中,當(dāng)這些運(yùn)算符與一些特殊值相遇時會是什么情況

加法(+)
-Infinity 加 -Infinity,結(jié)果為 -Infinity。Infinity 加 Infinity,結(jié)果為 Infinity。
Infinity 加 -Infinity,結(jié)果為 NaN。
當(dāng)只要有一邊是字符串時,兩邊都被轉(zhuǎn)換成字符串進(jìn)行相連
減法(-)
-Infinity 減 Infinity,結(jié)果為 NaN。
-Infinity 減 -Infinity,結(jié)果為 NaN。
Infinity 減 -Infinity,結(jié)果為 Infinity。
-Infinity 減 Infinity,結(jié)果為 -Infinity。
乘法(*)
如果結(jié)果太大或太小,那么生成的結(jié)果是 Infinity 或 -Infinity。
Infinity 乘以 0 以外的任何數(shù)字,結(jié)果為 Infinity 或 -Infinity。
Infinity 乘以 Infinity,結(jié)果為 Infinity。
除法(/)
如果結(jié)果太大或太小,那么生成的結(jié)果是 Infinity 或 -Infinity。
Infinity 被 Infinity 除,結(jié)果為 NaN。
Infinity 被任何數(shù)字除,結(jié)果為 Infinity。
0 除一個任何非無窮大的數(shù)字,結(jié)果為 NaN。
Infinity 被 0 以外的任何數(shù)字除,結(jié)果為 Infinity 或 -Infinity。
取模(%)
如果被除數(shù)是 Infinity,或除數(shù)是 0,結(jié)果為 NaN。
Infinity 被 Infinity 除,結(jié)果為 NaN。
如果除數(shù)是無窮大的數(shù),結(jié)果為被除數(shù)。
如果被除數(shù)為 0,結(jié)果為 0。

如果對其它類型的值進(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)。

復(fù)制代碼
    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"
復(fù)制代碼

 

with 語句用于設(shè)置代碼在特定對象中的作用域。

復(fù)制代碼
    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);
    }
復(fù)制代碼

 

with 語句是運(yùn)行緩慢的代碼塊,尤其是在已設(shè)置了屬性值時。大多數(shù)情況下,如果可能,最好避免使用它。

    本站是提供個人知識管理的網(wǎng)絡(luò)存儲空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊一鍵舉報。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多