第三章 基本概念java
基於ECMA-262第三版中定義的ECMAScript介紹這門語言的基本概念express
3.1 語法數組
ECMAScript的語法大量借鑑了C及其餘類C語言(如Java 和 Perl)的語法瀏覽器
3.1.1 區分大小寫安全
ECMAScript中的一塊兒(變量、函數名和操做符)都區分大小寫。app
3.1.2 標識符函數
所謂標識符,就是指變量、函數、屬性的名字或者函數的參數。標識符能夠是按照下列各式規則組合起來的一或多個字符:oop
第一個字符必須是一個字母、下劃線(_)或一個美圓符號($);post
其餘字符能夠是字母、下劃線、美圓符號或數字。性能
爲了與ECMAScript內置的函數和對象命名格式保持一致,ECMAScript標識符采用駝峯大小寫格式,也就是第一個字母小寫,剩下的每一個有意義的單詞的首字母大寫。
3.1.3 註釋
// 單行註釋
/*
多行註釋
*/
3.1.4 嚴格模式
ECMAScript 5 引入了嚴格模式的概念。嚴格模式是爲JS定義了一種不一樣的解析與執行模型。在嚴格模式下,ECMAScript3中一些不肯定的行爲將獲得處理,並且對某些不安全的操做會拋出錯誤。
整個腳本中啓用嚴格模式,能夠在頂部添加以下代碼:
「use strict」;
在函數內部的上方包含這條編譯指示,也能夠指定函數在嚴格模式下執行
3.1.5 語句
ECMAScirpt中的語句以一個分號結尾;若是省略分號,則由解析器肯定語句的結尾。語句結尾的分號不是必需的,可是加上分號能夠增進代碼的性能,由於解析器沒必要花時間推測應該在哪裏插入分號了。
3.2 關鍵字和保留字
ECMA-262描述了一組具備特定用途的關鍵字,這些關鍵字可用於表示控制語句的開始或結束,或者用於執行特定操做等。不用用做標識符
break do instanceof typeof case else new var catch finally return void continue
for switch while debugger function this with default if throw delete in try
另外描述了另一組不能用做標識符的保留字(未來可能被用做關鍵字)
abstract enum int short boolean export interface static byte extends long super char
final native synchronized class float package throws const goto private transient
debugger implements protected volatile double import public
嚴格模式下,第5版還對如下保留字施加了限制:
implements package public interface private static let protexted yield
除了上面列出的保留字和關鍵字,ECMA-262第5版對eval 和 arguments 還施加了限制。在嚴格模式下,這兩個單詞也不能做爲標識符或屬性名
3.3 變量
ECMAScript的變量是鬆散類型的,能夠用來保存任何類型的數據。每一個變量僅僅是一個用於保存值的佔位符而已。定義變量時要使用var操做符,後跟變量名。
var message = 「hi」;
使用var操做符定義的變量將成爲定義該變量的做用域中的局部變量。若是在函數中使用var定義一個變量,那麼這個變量在函數退出後就會被銷燬。(省略var操做符能夠定義全局變量,但不推薦這種作法,由於會使變量難以維護,致使沒必要要的混亂,在嚴格模式下會致使拋出ReferenceError錯誤)
可使用一條語句定義多個變量,只要把每一個變量(賦不賦值都可)用逗號分隔開便可:
var message = 「hi」, found ,age=29;
3.4 數據類型
簡單數據類型 (基本數據類型):Undefined、Null、Boolean、Number和String。
複雜數據類型:Object
3.4.1 typeof 操做符
typeof能夠用來檢測給定變量的數據類型,對一個值使用typeof操做符可能返回下列某個字符串:
「undefined」——若是這個值未定義;
「boolean」——若是這個值是布爾值;
「string」——若是這個值是字符串;
「number」——若是這個值是數值;
「object」——若是這個值是對象或null;
「function」——若是這個值是函數。
typeof操做符的操做數能夠是變量,也能夠是數值字面量。注意typeof是一個操做符而不是函數。
3.4.2 Undefined類型
Undefined類型只有一個值,即特殊的undefined。在使用var聲明變量但未對其加以初始化時,這個變量的值就是undefined
對於還沒有聲明過的變量,只能執行一項操做,即便用typeof操做符檢測其數據類型。然而,使人困惑的是:對未初始化的變量執行typeof操做符會返回undefined值,而對未聲明的變量執行typeof操做符一樣也會返回undefined值。
3.4.3 Null類型
Null類型是第二個只有一個值的數據類型,這個特殊的值是null。從邏輯角度來看,null值表示一個空對象指針,而這也正是使用typeof操做符檢測null值時會返回「object」的緣由。
實際上, undefined值是派生自null值的,所以ECMA-262規定對它們的相等性測試要返回true。(不全等)
3.4.4 Boolean類型
Boolean類型只有兩個字面值:true和false(區分大小寫)。
雖然Boolean類型的字面值只有兩個,但ECMAScript中全部類型的值都有與這兩個Boolean值等價的值。轉型函數Boolean()能夠將一個值轉換爲其對應的Boolean值。
Boolean轉換規則
數據類型 |
轉換爲true的值 |
轉換爲false的值 |
Boolean |
true |
false |
String |
任何非空字符串 |
「」 |
Number |
任何非零數字值(包括無窮大) |
0和NaN |
Object |
任何對象 |
null |
Undefined |
|
undefined |
這些轉換規則對理解流控制語句(如if語句)自動執行相應的Boolean轉換很是重要。
3.4.5 Number類型
ECMAScript中的Number類型使用IEEE754格式表示整數和浮點數值(浮點數值在某些語言中也被稱爲雙精度數值)。
a.支持的進制
最基本的數值字面量格式是十進制整數
八進制字面值的第一位是零(0),而後是八進制數字序列(0-7)。若是字面值中的數值超出了範圍,那麼前導零將被忽略,後面的數值將被當作十進制數值解析。八進制字面量在嚴格模式下是無效的。會致使拋出錯誤。
十六進制字面量的前兩位必須是0x,後跟任何十六進制數字(0-9及a-f)。其中,字母a-f能夠大寫,也能夠小寫。
在進行算數計算時,全部以八進制和十六進制表示的數值最終都將被轉換成十進制數值。
b.浮點數值
浮點數值,就是數值中包含一個小數點,而且小數點後面至少有一位數字,小數點前面能夠沒有整數。
因爲保存浮點數值須要的內存空間是保存整數值的兩倍,所以ECMAScript會不失時機地將浮點數值轉換爲整數值。
對於那些極大或極小的數值,能夠用e表示法。用e表示法表示的數值等於e前面的數值乘以10的指數次冪。
var floatNum = 3.123e7; // 31230000
c.數值範圍
因爲內存的限制,ECMAScript並不能保存世界上全部的數值。ECMAScript可以表示的最小數值保存在Number.MIN_VALUE中,最大數值保存在Number.MAX_VALUE中。若是某次計算的結果獲得了一個超出JS數值範圍的值,那麼這個數值將被自動轉換成特殊的Infinity值(包括-Infinity負無窮)。Infinity不能參加計算。
isFinite()函數能夠肯定一個數值是否是又窮的,若是是會返回true。
d.NaN
NaN,即非數值(Not a Number)是一個特殊的數值,這個數值用於表示一個原本要返回數值的操做數未返回數值的狀況(這樣就不會拋出錯誤了)。在ECMAScript中,任何數值除以0會返回NaN,所以不會影響其餘代碼的執行。
NaN的兩個特色:設計NaN的計算都會返回NaN,NaN與任何值都不想等,包括NaN自己。
isNaN()函數:這個函數接受一個參數,該參數能夠是任何類型,而函數會幫咱們肯定這個參數是否「不是數值」。該函數在接收到一個值以後,會嘗試講這個之轉換爲數值,任何不能被轉換爲數值的值都會致使這個函數返回true。
e.數值轉換
三個函數能夠把非數值轉換爲數值:Number()、parseInt()和parseFloat()。Number()能夠用於任何數據類型,另兩個函數則專門用於把字符串轉換成數值。
Number()函數轉換規則
Boolean:true轉換爲1,false轉換爲0
Number:簡單的傳入和返回
Null: null轉換爲0
Undefined: undefined轉換爲NaN
String: 空字符串「」轉換爲 0(裏面有空格也是轉換爲0)
字符串只包含數字,則轉換爲十進制數值(會忽略前導0,不論有幾個0)
字符串包含有效的浮點格式,則轉換爲對應的浮點數值(只能夠有一個小數點,會忽略前導0)
若是字符串中包含有效的十六進制格式,例如「0xf」,則將其轉換爲相同大小的十進制整數值
其餘狀況轉換爲NaN
Object:調用對象的valueOf()方法,而後依照前面的規則轉換返回的值。若是轉換的結果是NaN,則調用對象的toString()方法,而後再次轉換返回的字符串值
parseInt()函數在轉換字符串時,更多的是看其是否符合數值模式
轉換規則
忽略字符串前面的空格,直至找到一個非空格字符。若是第一個字符不是數字字符或者負號,parseInt()就會返回NaN(空字符串返回0)。若是第一個字符是數字字符,會繼續解析第二個字符,知道解析完全部後續字符或者遇到了一個非數字字符
若是字符串中的第一個字符是數字字符。parseInt()也可以識別出各類整數格式(十進制、八進制、十六進制),若是字符串以「0x」開頭且後跟數字字符,就會將其當作一個十六進制整數;若是字符串以「0」開頭且後跟數字字符,則會將其當作一個八進制數來解析。
「034」在ES3中會轉換爲28 在ES5中會轉換爲0,在ES6中會轉換爲34
能夠爲這個函數提供第二個參數:轉換時使用的基數(即多少進制)。
parseInt("034",8) //28
parseFloat函數的區別
字符串中的第一個小數點是有效的,第二個小數點就是無效的了
會忽略前導0
只解析10進制
3.4.6 String類型
String類型用於表示由零或多個16位Unicode字符組成的字符序列,即字符串
1.字符字面量
字符字面量即轉義序列,用於表示非打印字符,或者具備其餘用途的字符
\n 換行 \t製表 \b空格 \r回車 \f進紙 \\斜槓
\’ 單引號(’)在用單引號表示的字符串中使用。
例如 'he said \' i like apple\' '=》"he said ' i like apple' "
\」 雙引號(」)在用雙引號表示的字符串中使用(同上)
\xnn 以十六進制代碼nn標識的一個字符(其中n爲0-f)
例如 '\x23' =》「#」
\unnnn 以十六進制代碼nnnn表示的一個Unicode字符(其中n爲0-f)
例如 "\u03a3" =》"Σ"
2.轉換爲字符串
toString()方法 返回相應值的字符串表現。
數值、布爾值、對象和字符串值都有toString()方法。但null和undefined值沒有這個方法。
多數狀況下,調用toString()方法沒必要傳遞參數,可是調用數值的toString()方法時,能夠傳遞一個參數:輸出數值的基數(默認是十進制)
String()轉型函數,能夠講任何類型的之轉換爲字符串
若是值有toString()方法,調用該方法(沒有參數),返回相應的結果;
若是值是null,則返回「null」;
若是值是undefined,則返回「undefined」
3.4.7 Object類型
ECMAScript中的對象其實就是一組數據和功能的集合。能夠經過new操做符後跟要建立的對象類型的名稱來建立。建立Object類型的實例併爲其添加屬性和方法,就能夠建立自定義的對象。
在ECMAScript中,Object類型是全部它的實例的基礎。換句話說Object類型所具備的任何屬性和方法也一樣存在於更具體的對象中。
Object的每一個實例都具備下列屬性和方法。
Constructor:保存着用於建立當前對象的函數
hasOwnProperty(propertyName):用於檢查給定的屬性在當前對象實例中(而不是在實例的原型中)是否存在。其中做爲參數的屬性名必須以字符串形式指定
isPrototypeOf(object): 用於檢查傳入的對象是不是另外一個對象的原型
propertyIsEnumerable(propertyName):用於檢查給定的屬性是否可以使用for-in語句來枚舉,做爲參數的屬性名必須以字符串形式指定
toLocaleString():返回對象的字符串表示,該字符串與執行環境的地區對應。
toString():返回對象的字符串表示。
valueOf(): 返回對象的字符串、數值或布爾值表示。一般與toString()方法的返回值相同。
3.5 操做符
ECMAScript-262描述了一組用於操做數據值的操做符,包括算術操做符、位操做符、關係操做符和相等操做符。它們可以適用於不少值,例如字符串、數字值、布爾值,甚至對象。不過,在應用於對象時,相應的操做符一般都會調用對象的valueOf()和toString()方法,一邊去的能夠操做的值
3.5.1 一元操做符
a.遞增和遞減操做符
分爲兩個版本:前置型和後置型
執行前置操做時,變量的值都是在語句被求值之前改變的。(在計算機科學領域,這種狀況一般被稱做副效應。)
這4個操做符對任何值都適用,應用於非Number類型時,先用Number()函數轉換爲數值變量,再執行加減操做。
b. 一元加和減操做符
在對非數值應用1元加/減操做符時,該操做符會像Number()轉型函數同樣對這個值執行轉換。
一元加操做符主要用於基本的算數運算,能夠用用於轉換數據類型。
3.5.2 位操做符
位操做符用於在最基本的層次上,即按內存中表示數值的位來操做數值。不作深刻了解。
3.5.3 布爾操做符
a.邏輯非(!)返回一個布爾值
邏輯非操做符首先會將它的操做數轉換爲一個布爾值,而後再對其求反。
邏輯非返回true的情景:
空字符串(若是裏面有空格返回false)、數值0、NaN、null、undefined。
同時使用兩個邏輯非操做符,實際上就會模擬Boolean()轉型函數的行爲。
b.邏輯與(&&)有兩個操做數。在有一個操做數不是布爾值的狀況下,邏輯與操做就不必定返回布爾值;此時,它遵循下列規則:
若是第一個操做數是對象,則返回第二個操做數;
若是第二個操做數是對象,則只有第一個操做數的求職結果爲true的狀況下才會返回該對象。
若是兩個操做數都是對象,則返回第二個操做數;
若是有一個操做數是null,則返回null;
若是有一個操做數是NaN,則返回NaN;
若是有一個操做數是undefined,則返回undefined。
c.邏輯或(||)有兩個操做數。在有一個操做數不是布爾值的狀況下,邏輯與操做就不必定返回布爾值;此時,它遵循下列規則:
若是第一個操做數是對象,則返回第二個操做數;
若是第一個操做數的求值結果爲false,則返回第二個操做數;
若是兩個操做數都是對象,則返回第一個操做數;
若是兩個操做數都是null,則返回null;
若是兩個操做數都是NaN,則返回NaN;
若是兩個操做數都是undefined,則返回undefined。
咱們能夠利用邏輯或的行爲爲變量賦優先值和默認值
3.5.4 乘性操做符
ECMAScript定義了三個乘性操做符:乘法、除法和求模。在操做數爲非數值的狀況下會執行自動的類型轉換(Number())
規則:
得出值超出ECMAScript數值的表示範圍 返回 Infinity 或 –Infinity。
有一個操做數是NaN,則結果爲NaN
Infinity 與 0 相乘 ,則結果是NaN,與非零數值相乘結果是Infinity或-Infinity,取決於有符號操做數的符號。
Infinity與Infinity相乘,結果爲Infinity,相除結果是NaN
0除以0 結果是NaN
求模狀況下:
若是被除數是無窮大而除數是有限大的數值,結果是NaN;
若是被除數是有限大的數值而除數是零,結果是NaN;
Infinity被Infinity除,結果是NaN;
被除數是有限大的數值而除數是無窮大的數值,結果爲被除數
被除數是0,則結果是零
3.5.5 加性操做符
+能夠用在字符串拼接。
3.5.6 關係操做符
小與、大於、小於等於、大於等於,這幾個操做符都返回一個布爾值
3.5.7 相等操做符
1.相等和不相等——先轉換再比較值
2.全等和不全等——先轉換再比較值,若是經過再比較以前的數據類型(??)??
3.5.8 條件操做符
條件操做符即三目運算
Variable = Boolean_expression ? true_value :false_value
3.5.9 賦值操做符
簡單賦值=>(=) ,複合賦值=》(+=)
3.5.10 逗號操做符
逗號操做符能夠在一條語句中執行多個操做 例如:
var num1=1,num2=2;
3.6 語句
3.6.1 if語句
if(condition) {…} else {…}
if(condition1) {…} else if(condition2){…}else {…}
ECMAScript會自動調用Boolean()轉換函數將這個表達式的結果轉換爲一個布爾值。
3.6.2 do-while 語句
do-while語句是一種後測試循環語句,在對條件表達式求值以前,循環體內的代碼至少會被執行一次。
var i = 0; do {i+=2; console.log(i)} while (i<10)
3.6.3 while語句
While語句屬於前測試循環語句,循環體內的代碼有可能永遠不會執行。
var i =0; while(i<10){i+=2}
3.6.4 for語句
for 語句也是前測試循環語句
for(initialization;expression;post-loop-expression) statement
3.6.5 for-in 語句
for-in 語句是一種精準的迭代語句,能夠用來枚舉對象的屬性。
for(property in expression) statement
for-in循環輸出的屬性名的順序是不可預測的。具體來說,全部屬性都會被返回一次,但返回的前後次序可能會因瀏覽器而異。
3.6.6 label語句
使用label語句能夠在代碼中添加標籤,以便未來使用
label:statement 以下示例:
start: for( var i=0; i<count; i++) { alert(i); }
這個例子中定義的start標籤能夠在未來由break或continue語句引用。加標籤的語句通常都要與for語句等循環語句配合使用。
3.6.7 break和continue語句
break和continue語句用於在循環中精確地控制代碼的執行。其中,break語句會當即退出循環,強制繼續執行循環後面的語句。而continue語句雖然也是當即退出循環,但退出循環後會從循環的頂部繼續執行。
break和continue語句均可以與label語句聯合使用,從而返回代碼中特定的位置。這種聯合使用的狀況多發生在循環嵌套的狀況下。
在這個例子中,outermost標籤表示外部的for語句。若是每一個循環正常執行10次,則num++語句就會正常執行100次,num的值應該是100。但內部循環中的break語句帶了一個參數:要返回的標籤。添加這個標籤的結果將致使break語句不只會退出內部的for循環(變量j的循環),並且也會退出外部的for語句(變量i的循環)。爲此,當變量i和j都等於5時,num的值正好是55.
continue語句會強制繼續執行循環——退出內部循環,執行外部循環。當i與j都是5時,continue語句執行,跳出循環直接到i=6,開始。這也意味着內部循環少執行了5次,所以num的結果是95.
3.6.8 with語句
with語句的做用是將代碼的做用域設置到一個特定的對象中。
with(ecpression) statement;
定義with語句的目的主要是爲了簡化屢次編寫同一個對象的工做
嚴格模式下不容許使用with語句
3.6.9 switch 語句
switch (expression){
case value : statement
break;
case value : statement
break;
default : statement }
switch語句在比較值時使用的是全等操做符。
3.7 函數
ECMAScript中的函數使用function關鍵字來聲明,後跟一組參數以及函數體。
函數能夠經過return語句後跟要返回的值來實現返回值。return 語句以後的任何代碼都不會執行。實際上,未指定返回值的函數返回的是一個特殊的undefined值。
3.7.1 理解參數
ECMAScript中的參數在內部是用一個數組來表示的。函數接收到的始終都是這個數組,而不關心數組中包含哪些參數。實際上,在函數體內能夠經過arguments對象來訪問這個參數數組,從而得到傳遞給函數的每個參數。
ECMAScript函數有一個重要特色:命名的參數只提供便利,但不是必需的。
經過訪問arguments對象的length屬性能夠獲知傳遞了多少個參數。
arguments對象中的值會自動反映到對應的命名參數,這並非說讀取這兩個值會訪問相同的內存空間;它們的內存空間是獨立的,但它們的值會同步。但這種影響是單向的:修改命名參數不會改變arguments中對應的值。
嚴格模式對arguments對象做出了不少限制,因此最好別用arguments
3.7.2 沒有重載
ECMAScirpt函數沒有簽名,由於其參數是由包含零或多個值的數組來表示的。而沒有函數簽名,真正的重載是不可能作到的。
在其餘語言(如java)中,能夠爲一個函數編寫兩個定義,只要這兩個定義的簽名(接受的參數的類型和數量)不一樣便可
經過檢查傳入函數中參數的類型和數量並做出不一樣的反應,能夠模仿方法的重載。
3.8小結
5種基本數據類型
複雜數據類型Object
流控制語句
基本操做符
函數 arguments 不能重載