JavaScript進階程式設計(3)基本概念 上

來源:互聯網
上載者:User

標籤:技術分享   init   語言   切換   java   進階   object類   進位   建立   

本章內容:文法、資料類型、流量控制語句、函數。

   1.文法

         ECMAScrip的文法和C和其他類C語言(如JAVA和Perl)的文法大同小異。

 

   2.區分大小寫

         ECMAScript中的一切(變數、函數名和操作符)都區分大小寫。

 

 3.標識符

        指變數、函數、屬性的名字,或者函數的參數。也可以是按照下列格式規則群組合起來的一或多個字元:

          (1) 第一個必須是一個字母、底線(_)或一個貨幣符號($);

          (2) 其他字元可以字母、底線、貨幣符號或數字。

          (3) 擴充的ASCII或Unicode字母字元,但是不推薦這樣做。

   註:ECMAScript標識符採用駝峰大小寫格式

         不能把關鍵字、保留字、true、false和null用作標識符

 

    4.注釋

        ECMAScript包括單行注釋和塊級注釋。

       單行注釋以兩個斜杠開頭,如下所示:

//單行注釋

 

       塊級注釋以一個斜杠和一個星號(/*)開頭,以一個星號和一個斜杠(*/)結尾。如下所示:

/**這是一個多行*(塊級)注釋*/ 

第二三行以星號開頭並不是必需的。之所以添加,提高注釋的可讀性

 

  5.strict 模式

      ECMAScript引入了strict 模式的概念。是為JavaScript定義了一種不同的解析與執行模型。在strict 模式下,ECMAScript中的一些不確定的行為將得到處理,而且對某些不安的操作拋出錯誤。

   在函數內部的上方包含這條編譯提示,也可以指定函數在strict 模式下執行:

function doSomething(){  "use strict";   //函數體}

 

這行代碼看起來像是字串,而且也沒有賦值給任何變數,但其實它是一個編譯指示,用於告訴支援的JavaScript引擎切換到strict 模式。

strict 模式下,JavaScript的執行結果會有很大不同。支援strict 模式的瀏覽器包括IE10+、Firefox4+、Safari、Opera12+和Chrome。

 

 6.語句

  ECMAScript中的語句以一個分號結尾;如果省略分號、則由解析器確定語句的結尾。雖然語句的分號不是必需的,但建議任何時候都不要省略它。

var sum = a + b  //沒有分號也是有效語句          不推薦var diff = a - b;  //   有效語句        推薦

 

       加上分號可以避免很多錯誤(例如不完整的輸入)開發人員也可以放心地壓縮ECMAScript代碼,也可以在某些情況下增進代碼的效能。

 可以使用C語言風格把多條語句組合到一個代碼塊中,即代碼塊以左花括弧({)開頭,以右花括弧(})結尾

if (text){   test = false;   alert(test);}

 

雖然條件控制語句(if語句)只在執行多條語句的情況下才要求使用代碼塊,但最佳實務是始終在控制語句中使用代碼塊——即使代碼塊中只有一條語句。

在控制語句中使用代碼塊可以讓偏碼意圖更加清晰,而且也能降低修改代碼時出錯的幾率。

 

 7.關鍵字和保留字

  ECMA-262描述了一組具有特定用於的關鍵字,這些關鍵字可用於表示控制語句的開始或結束,或者用於執行特定操作等。按照規則,關鍵字也是語言保留的,不能用作標識符。

  

ECMA-262還描述了另外一組不能用作標識符的保留字。儘管保留字在這門語言中還沒有任何特定的用途,但他們有可能在將來被用作關鍵字。

關鍵字和保留字任然不能作為標識符使用,但是現在可以用作對象的屬性名稱。

   

8.變數

  ECMAScript的變數是鬆散類型的,所謂鬆散類型就是可以用來儲存任何類型的資料,換句話說,每個變數僅僅是一個用於儲存值的預留位置而已。

 定義變數時要使用var操作符(注意var是一個關鍵字),後跟變數名(即一個標識符)。

var message;

 

ECMAScript也支援直接初始設定變數,因此在定義變數的同時就可以設定變數的值。

var message = "hi";

 

在此,變數message中儲存了一個字串值 "hi" 。像這樣初始設定變數並不會把它標記為字串類型;初始化的過程就是給變數賦一個值那麼簡單。因此,可以在修改變數值得同時修改值的類型,

var message = "10";message = 100;

 

變數message一開始儲存了一個字串值 "hi" ,然後該值又被一個數字值100取代。雖然不建議修改變數所儲存值的類型,但是這種操作是有效。

用var操作符定義的變數將成為定義改變數的範圍中的局部變數。如果在函數中使用var定義一個變數,那麼這個變數在函數退出後就會被銷毀

function test(){ var message = "hi";   //局部變數}test();alert(massage);  //錯誤!

 

變數message是在函數中使用var定義的。當函數被調用時,就會建立該變數並為其賦值。而在此之後,這個變數又會立即被銷毀。因此例子中的下一行代碼就會導致錯誤。

可以省略var操作符,從而建立一個全域變數:

function test(){  message = "hi";   //全域變數}test();alert(massage);  //  "hi"

 

這個例子省略了var操作符,因而message就成了全域變數。這樣只要調用過一次test函數,這個變數就有了定義,就可以在函數外部的任何地方被訪問到。

 雖然省略var操作符可以定義全域變數,但這也不是推薦的做法。因為在局部範圍中定義的全域變數很難維護,如果有意地忽略了var操作符,也會由於相應變數不會馬上就有定義而導致不必要的混亂。

 可以使用一條語句定義多個變數,只要像下面這樣把每個變數(初始化或不初始化均可)用逗號分隔開即可:

var message = "hi",    found = false,    age = 29;

 

這個例子定義並初始化了3個變數。同樣由於ECMAScript是鬆散類型的,因而使用不同類型初始設定變數的操作可以放在一條語句中完成。

 

   9.資料類型 

   ECMAScript中有5中單一資料型別(也稱之為基礎資料型別 (Elementary Data Type)):Undefined、Null、Boolean、Number和String。還有一種複雜資料類型——Object,Object本質上是由一組無序的名值對組成的。

   typeof操作符:

     鑒於ECMAScript是鬆散類型的,因此需要有一種手段來檢測給定變數的資料類型——typeof就是負責提供這方面資訊的操作符。對一個值使用typeof操作符可能返回下列某個字串。

      "undefined"——未定義;

      "boolean"——布爾值;

      "string"——字串;

      "number"——數值;

      "object"——對象或null;

      "function"——函數;

    下面是幾個使用typeof操作符的例子:

var message  = "some string";alert(typeof message);        // "string"alert(typeof(message));      // "string"alert(typeof 95);                 //"number"
alert(typeof null) //object 特殊值null被認為是一個空的對象引用。

 

這幾個例子說明,typeof操作符的運算元可以是盡量(message),也可以是數值字面量。注意,typeof是一個操作符而不是函數,因此例子中的圓括弧儘管可以使用,但不是必需的。

 

Undefined類型:

   Undefined類型只有一個值,即特殊的undefined。

   未初始化和未聲明的變數執行typeof操作符都返回undefined值。

 

Null類型:

   Null類型也只有一個值,就是Null。

   null表示一個Null 物件指標,而這也是使用typeof操作符檢測null值時會返回 "object" 的原因。

   如果定義的變數準備在將來用於儲存對象,那麼最好將該變數初始化為null而不是其他值。這樣,只要直接檢查null值就可以知道相應的變數是否已經儲存了一個對象的引用。

 

Boolean類型:

  Boolean有兩個字面值,是true和false。區分大小寫,否則是標識符。

  要將一個值轉換為其對應的Boolean值,可以調用轉型函數Boolean()。可以對任何資料類型的值調用Boolean()函數,總會返回一個Boolean值。至於傳回值是true還是false,取決於轉換值的資料類型和實際值。

 各種資料類型及其對應的轉換規則:

 

 Number類型:

  表示整數和浮點數值(雙精確度數值)

  數值字面量格式:

   十進位:可以直接在代碼裡輸入;

   八進位(以8位基數):第一位必須是零(0),然後是八位元字序列(0~7)。如果字面值超出範圍,那麼前置字元為零將被忽略,後面的數值將被當做十進位數值解析。

   十六進位(以16位基數):前兩位是0x,後跟任何十六進位數字(0~9及A~F)。字母A~F大小寫都可。

var intNum = 55;                           //整數var octalNum1 = 070;                    //八進位的56var octalNum2 = 079;                    //無效的八位元值 ——解析為79var octalNum3 = 08;                      //無效的八位元值 ——解析為8 var hexNum1 = 0xA;                      //十六進位的10var hexNum2 = 0x1f;                     //十六進位的31

 

 在進行算數計算時,所有以八進位和十六進位表示的數值最終都將被轉換成十進位數值。

 

 浮點數值:

   就是該數值中必須包含一個小數點,並且小數點後面必須至少有一位元字。

   不要測試某個特定的浮點數值。因為浮點數值計算會產生舍入誤差的問題。

 

 數值範圍:

  如果超出JavaScript數值範圍的值,那麼這個數值將被自動轉換成特殊的Infinity值。該值就無法繼續參與下一次的計算,Infinity不能夠參與計算的數值

  確定一個數值是不是位於最小和最大的數值之間,可以使用 isFinite() 函數。這個函數位於之間時會返回true。

var result = Numver.MAX_VALUE + Numver.MAX_VALUE;alert(isFinite(result));      //false

 

 儘管在計算中很少出現某些值超出表示範圍的情況,但在執行極小或極大數值的計算時。檢測監控這些值是可能的,是必需的。

 

NaN:

 即非數值(Not a Number)是一個特殊的數值。用來表示一個本來要返回數值的運算元未返回數值的情況。

 兩個特點:①任何涉及NaN的操作(NaN/10)都會返回NaN,在多步計算中有可能導致問題。

               ②NaN與任何值都不相等,包括NaN本身,會返回false。

 針對這兩個特點,ECMAScript定義了isNaN()函數。這個函數接受一個參數,該參數可以是任何類型。確定這個參數是否 "不是數值"。

 isNaN() 在接收到一個值之後,會接受將這個值轉換為數值。某些不是數值的值會直接轉換為數值,而不能被轉換為數值都會導致這個函數返回true。

alert(isNaN(NaN));                                  //truealert(isNaN(10));                                   //false(10是一個數值)alert(isNaN("10"));                                 //false(可以被轉換成數值10)alert(isNaN("blue"));                               //true(不能轉換成數值)alert(isNaN(true));                                 //false(可以被轉換成數值1)

 

 

數值轉換:

 有3個函數可以把非數值轉換為數值:Number()、parseInt()和parseFloat()。第一個可以用於任何資料類型,而另兩個函數則專門用於把字串轉換成數值。

 

  Number()函數的轉換規則如下:

   ①如果是Boolean值,true和false將分別被轉換為 1 和 0 。

   ②如果是數字值,只是簡單的傳入和返回。

   ③如果是null值,返回0。

   ④如果是underfined,返回NaN。

   ⑤如果是字串,遵循以下規則:

      1.如果字串中只包含數字(包括前面帶正號或負號的情況),則將其轉換為十進位數值。"123"會變成123 ;

      2.如果字串中包含有效浮點格式,"1.1" ,則將其轉換為對應的浮點數值;

      3.如果字串中包含有效十六進位格式,如 "0xf" ,則將其轉換為相同大小的十進位整數值;

      4.如果字串是空的(不包括任何字元),則將其轉換為0;

      5.如果字串中包含除上述格式之外的字元,則將其轉換為NaN。

   ⑥如果是對象,則調用對象的valueof()方法,然後依照前面的規則轉換返回的值。如果轉換結果是NaN,則調用對象的toString()方法,然後再次依照前面的規則轉換返回的字串值。

var num1 = Number("Hello world!");                        //NaNvar num2 = Number(" ");                                   //0var num3 = Number("0000011");                             //11var num4 = Number(true);                                  //1

 

 

 parseInt()函數轉換規則:

   ①忽略字串前面的空格,直至找到第一個非空白字元;

   ②如果第一個字元不是數字字元或者符號,返回NaN。

   ③如果字串以 "0x" 開頭且後跟數字字元,則將其當做一個十六進位整數;

   ④如果字串以 "0" 開頭且後跟數字字元,則會將其當做一個八位元來解析。

var num1  = parseInt("12345blue");                 //12345var num2  = parseInt(" ");                         //NaNvar num3  = parseInt("0xA");                       //10(十六進位數)var num4  = parseInt(22.5);                        //22var num5  = parseInt("070");                       //56(八位元)var num6  = parseInt("70");                        //70(十進位數)var num7  = parseInt("0xf");                       //15(十六進位數)

 

 使用parseInt()解析像八進位字面量的字串時,ECMAScript3(八進位)和5(十進位)存在分歧。

 消除這個困惑,可以為這個函數提供第二個參數:轉換時使用的基數(即多少進位)。指定基數會影響到轉換的輸出結果:

var num1  = parseInt("10", 2);                   //2(按二進位解析)var num2  = parseInt("10", 8);                   //8 (按八進位解析)var num3   = parseInt("10", 10);                  //10(按十進位解析)var num4   = parseInt("10", 16);                  //16(按十六進位解析)

 

為了避免錯誤的解析,建議無論在什麼情況下都明確指定基數。

 

 parseFloat函數轉換規則:

  ①第一個小數點有效,第二個小數點無效。後面字串將被忽略;

  ②始終都會忽略前置的零;

  ③十六進位的字串轉換為0;

  ④只解析十進位值,因此它沒有用第二個參數指定數的用法;

  ⑤如果字串包含的是一個可解析為整數的數(沒有小數點,或者小數點後都是零),parseFloar()會返回整數。

 

var num1 = parseFloat("1234blue");          //1234(整數)var num2 = parseFloat("0xA");               //0var num3 = parseFloat("22.5");              //22.5var num4 = parseFloat("22.34.5");           //22.34var num5 = parseFloat("0908.5");            //908.5var num6 = parseFloat("3.125e7");           //31250000

 

 string類型:

   用於表示由零或多個16位Unicode字元組成的字元序列,即字串。字串可以由雙引號(")或單引號(‘)表示。

   用雙引號表示的字串和單引號的字串完全相同,不過雙引號開頭必須以雙引號結尾,單引號也如此。

字元字面量:

   String資料類型包含一些特殊的字元字面量,也叫逸出序列。用於表示非列印字元,或者具有其他用途的字元。

這些字元字面量可以出現字串中的任意位置,而且也將被作為一個字元來解析。

 字串特點:

   字串一旦建立,它們的值就不能改變。要改變某個變數儲存的字串,首先要銷毀原來的字串,然後再用另一個包含新值的字串填充該變數。

轉換為字串:

  toString()方法:返回相應值的字串表現。

 數值、布爾值、對象和字串值都有toString()方法。但是null和undefined值沒有這個方法。

 toString()可以輸出以二進位、八進位、十六進位乃至其他任意有效進位格式表示的字串值。

 String()轉型函數:這個函數能夠讓將任何類型的值轉換為字串;

  如果值又toString()方法,則調用該方法(沒有參數)並返回相應的結果;

  如果值是null,則返回 "null";

  如果值是nudefined,則返回 "undefined"。

 

 object類型:

 對象其實就是一組資料和功能的集合。對象可以通過執行new操作符後跟要建立的物件類型的名稱來建立。

 Object類型所具有的任何屬性和方法也同樣存在於更具體的對象中。

 後面章節詳細講解。

JavaScript進階程式設計(3)基本概念 上

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.