標籤:技術分享 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)基本概念 上