與其說是JavaScript基礎,不如叫ECMAScript基礎,由於關於語法、類型、控制語句、函數等都是ECMAScript標準制定的。javascript
ECMAScript版次目前是第5版次,可是目前主流瀏覽器支持版次並不一致,正如咱們在第一篇簡介中介紹的同樣,ECMA-262第4版沒有發佈就夭折了,因此如今主流瀏覽器支持的是第三和第五版,須要是咱們會特別指出區別。java
ECMAScript語法大量借鑑了C及其餘類C語言(如Java和Perl)的語法。inode
1.同C同樣,Javascript的變量是區分大小寫的。標識符、註釋、語句也同C相似,特別指出的是:Javascript 語句的末尾不加分號也能夠正常執行,但不建議這樣作。數組
ECMAScript 5 引進了嚴格模式(strict mode)的概念。嚴格模式是位javascript定義了一種不一樣的解析與執行模型。在嚴格模式下,ECMAScript 3 中的一些不肯定的行爲將獲得處理,並且對某些不安全的操做也會拋出錯誤。要在整個腳本中啓動嚴格模式,能夠在頂部添加以下代碼:瀏覽器
「use strict」;
這行代碼看起來想字符串,並且沒有賦值給任何變量,但其實他是一個編譯指示,用於告訴支持的JavaScript引擎切換到楊哥模式。安全
ECMAScript的變量是鬆散類型的,能夠用來保存任何類型的數據。定義變量是使用var操做符。函數
同C同樣ECMAScript也有局部變量,在函數內生命的變量是局部變量,函數外沒法訪問。但若是函數體內不是用var聲明的變量就全局變量,所以函數體外能夠訪問。可是在嚴格模式下,給未經生命的變量賦值會返回ReferenceError異常。spa
3.數據類型調試
ECMAScript有五種簡單數據類型(也稱爲基本數據類型):Undefined、Null、Boolean、Number、String。還有一種複雜數據類型:Object。code
使用typeof操做符返回字符串可能有:undefined、boolean、string、number、object、function。對null使用typeof操做符會返回「object」,由於特殊值null被認爲是一個空的對象引用。
Undefined類型只有一個值,就是undefined。在使用var聲明變量但未對其加以初始化時,這個變量就是undefined。
Null類型也只有一個值,就是null。null==undefined返回是true。
Boolean類型有兩個值,true和false。使用轉型函數Boolean() 能夠講一個值轉換成其對應的Boolean值。轉換規則以下:
數據類型 | 轉換成ture的值 | 轉換成false的值 |
Boolean | true | false |
String | 任何非空字符串 | 「」(空字符串) |
Number | 任何非零數字值 | 0和NaN |
Object | 任何對象 | null |
Undefined | undefined |
Number類型使用IEEE754格式來表示整數和浮點數值。整數能夠用8進制和16進製表示,其中8進制前導是0,16進制前導是0x。注意,在嚴格模式下8進制格式是無效的,會拋出異常。浮點數值可使用科學表示法來表示,如var floatNum=3.14e6;注意IEEE754數值的通病是精度問題,如0.2+0.1=0.300000000000000004,因此0.2+0.1!=0.3。ECMAScript可以表示的最小數值保存在Number.MIN_VALUE中。最大值保存在Number.MAX_VALUE中。Number.NEGATIVE_INFINITY和Number.POSITIVE_INFINNITY保存着負和正的超出範圍的值,分別爲:-Infinity和Infinity。有一個函數能夠判斷數值是否有限:isFinite()。NaN即非數值。首先,任何涉及NaN的操做都會返回NaN,這個特色是在多部計算中有可能致使的問題。其次,NaN與任何值都不相等。包括NaN。因此NaN!=NaN。函數:isNaN()能夠判斷參數是否不是數值。
有三個函數能夠把非數值轉換成數值:Number() parseInt() parseFloat()。使用parseInt()方法建議放入兩個參數,第二個參數用來肯定第一個參數表明的進制。
String類型用單引號和雙引號並無區別。ECMAScript中字符串是不可變的,也就是說一旦字符串建立,他們的值就不能改變。要改變某個變量保存的字符串,首先要銷燬原來的字符串,而後再用另外一個包含新值的字符串填充該變量。把一個值轉換成字符串使用該值自帶的toString方法(相似java),可是null和undefined是沒有這個方法的。那麼就要使用String()方法。null返回「null」,undefined返回「undefined」。
Object類型其實就是一組數據和功能的集合。同java中java.lang.Object方法同樣,是全部對象的父類。其中包含的屬性和方法以下:
在ECMAScript中Object是全部對象的基礎,所以全部對象都具備這些基本的屬性和方法。
一元操做符:++/--/+/-同C語言。
位操做符:非~ / 與& / 或| / 異或^ / 左移<< / 有符號右移>> / 無符號右移>>>
布爾操做符:非!/ 與&& / 或||
乘性操做符:乘法* / 除法/ / 求模%
加性操做符:加法+ / 減法-
關係操做符:大於> / 小於< / 大於等於>= / 小於等於<=
相等操做符:相等和不相等== != 先轉換再比較 / 全等和不全等 === !== 僅比較不轉換
條件操做符: ?:同java
賦值操做符: = 在等號前面再添加乘性操做符、加性操做符或位操做符就能夠完成複合賦值操做。
逗號操做符:逗號操做符多用於聲明多個變量。
if語句、do-while語句、while語句、for語句、for-in語句、label語句、break、continue語句、with語句、switch語句
須要特別講一下的是label語句,這個語句相信是來自彙編或C的,用於在代碼中添加標籤,以便未來使用,通常都配合break和continue使用(是由於沒有goto語句)。由於break和continue都只能跳出最近的一次循環,配合label就能夠想跳出多少個循環就跳出多少個循環了,通常label放在for以前。
"use strict"; var num=0; outermost: for(var i=0; i<10; i++){ for(var j=0; j<10; j++){ if(i==5 && j==5){ continue outermost; } num++; } } console.log(num);
想一下這段代碼會返回什麼?答案是95.由於i==5 j==5的時候跳出了循環,i繼續增長變成6,j繼續從0開始,致使i5 j五、i5j六、i5j七、i5j八、i5j9五次沒有執行。
with語句不建議使用由於會影響效率,並且增長了調試難度。
其餘語句和c或java並沒有二致。
ECMAScript函數的參數與大多數其餘語言中函數的參數不一樣,ECMAScript的函數不介意傳遞進來多少個參數,也不在意傳遞進來參數是什麼類型。ECMAScript中參數在內部是用一個數組表示的。函數接收到的始終都是這個數組,而不關心數組中有哪些參數。在函數體內能夠經過arguments對象來訪問這個數組,進而獲取到傳遞給函數的每個參數。
其實arguments只是與數組相似,並非Array的實例。
ECMAScript中全部參數傳遞的都是值,不可能經過引用傳遞參數。
由於ECMAScript函數沒有函數簽名,因此ECMAScript函數沒有重載。咱們能夠經過判斷arguments的長度來變相的來實現重載。
function doAdd(){ if(arguments.length == 1){ console.log(arguments[0] + 10); }else if(arguments.length == 2){ console.log(arguments[0] + arguments[1]); } } var arg0 = 10; var arg1 = 20; doAdd(arg0); //返回20 doAdd(arg0, arg1); //返回30
ECMAScript中包含了全部基本的語法、操做符、數據類型、已經完成基本計算任務所必須的對象。可是沒有對取得輸入和產生輸出的機制作規定。目前大多數實現所遵循的都是ECMA-262的第三版,但已經有一部分開始實現第5版了。
ECMAScript的基本要素有: