JavaScript高級程序設計(第3版)第三章讀書筆記

第三章  基本概念express

  1. ECMAScript中的一切(變量、函數名和操做符)都區分大小寫。
  2. 標識符是指變量、函數、屬性的名字,或者函數的參數。
  3. 標識符的組成規則是:第一個字符必須是一個字母、下劃線(_)或一個美圓符號($);其餘字符能夠是字母、下劃線、美圓符號或數字。
  4. ECMAScript標識符采用駝峯大小寫格式。
  5. ECMAScript註釋包括單行註釋(//)和塊級註釋(/*  *  */)。
  6. ECMAScript 5引入了嚴格模式的概念,嚴格模式是爲JavaScript定義了一種不一樣的解析與執行模型。
  7. 在嚴格模式下,ECMAScript3中的一些不肯定的行爲將獲得處理,並且對某些不安全的操做會拋出錯誤。在整個腳本中啓動嚴格模式,可在定都添加」use strict」;也可指定函數在嚴格模式下執行。
  8. 嚴格模式下,JavaScript的執行結果會有很大不一樣。支持嚴格模式的瀏覽器包括IE10+、Firefox4+、Safari5+、Opera12+和Chrome。
  9. ECMAScript中的語句以一個分號結尾,若是省略分號,則由解析器肯定語句的結尾。加上分號會在某些狀況下增進代碼的性能,由於這樣解析器就沒必要再花時間推測應該在哪裏插入分號了。
  10. 關鍵字和保留字不能用做標識符。(見書21頁)
  11. ECMAScript的變量是鬆散類型的,能夠用來保存任何類型的數據。用var操做符定義的變量將成爲定義該變量的做用域中的局部變量,未經初始化的變量會保存一個特殊的值——undefined。在嚴格模式下,不能定義名爲eval或arguments的變量,不然會致使語法錯誤。
  12. ECMAScript有5中基本數據類型:Undefined、Null、Boolean、Number、String,一種複雜類型:Object,Object本質上是由一組無序的名值對組成。
  13. 對一個值使用typeof操做符可能返回下列某個字符串:

「undefined」——若是這個值爲定義;數組

「boolean」——若是這個值是布爾值;瀏覽器

「string」——若是這個值是字符串;安全

「number」——若是這個值是數值;函數

「object」——若是這個值是對象或者null;性能

「function」——若是這個值是函數。測試

經過typeof操做符來區分函數和其餘對象是有必有的。編碼

  1. Undefined類型只有一個值,即特殊的undefined。對未初始化的變量執行typeof操做符會返回undefined值,而對未聲明的變量執行typeof操做符一樣也會返回undefined值。
  2. Null類型也只有一個值,即特殊的null。從邏輯角度來看,null表示一個空對象指針,所以,typeof操做符檢測null會返回」object「。
  3. null == undefined會返回true,這是由於==操做符處於比較的目的會轉換其操做數。
  4. 區分null和undefined,顯示地初始化變量爲undefined,保存對象的變量在沒有真正保存對象時,明確該變量保存null值。
  5. Boolean類型僅兩個字面值:true和false,true不必定等於1,false不必定等於0。
  6. 各類數據類型與Boolean類型的轉換規則

數據類型spa

轉換爲true的值指針

轉換爲false的值

Boolean

true

False

String

任何非空字符串

「」(空字符串)

Number

任何非零數字值(包括無窮大)

0和NaN

Object

任何對象

null

Undefined

n/a(不適用)

undefined

  1. Number類型使用IEEE754格式來表示整數和浮點數值。八進制字面量在嚴格模式下是無效的,會致使支持該模式的JavaScript引擎拋出錯誤。
  2. 保存浮點數值須要的內存空間是保存整數值的兩倍,所以ECMAScript會盡量地將浮點數轉換爲整數值。能夠用isFinite( )函數判斷一個數值是否是有窮的。ECMAScript的最小數值爲Number.MIN_VALUE=5e-324,最大數值爲Number.MAX_VALUE=1.797693134623157e+308。
  3. NaN,即非數值( Not a Number),是一個特殊的數值,用於表示一個原本要返回數值的操做數爲返回數值的狀況。任何數值除以0都會返回NaN,且在ECMAScript中不會影響其餘代碼的執行。
  4. NaN兩大特色:任何涉及NaN的操做,都會返回NaN;NaN與任何數值都不相等,包括NaN自己。
  5. IsNaN( )函數用來判斷接收的參數是否「不是數值」。
  6. 有3個函數能夠把非數值轉換爲數值:Number( )、parseInt( )和parseFloat( )
  7. Number( )函數能夠用於任何數據類型轉換。其轉換規則以下:

若是是Boolean值,true和false將分別被轉換爲1和0;

若是是數字值,知識簡單的傳入和返回;

若是是null值,返回0;

若是是undefined,返回NaN。

  1. 字符串的轉換規則以下:

若是字符串中只包含數字(包括前面帶正號或負號的狀況),則將其轉換爲十進制數值(前導的零被忽略);

若是字符串中包含有效的浮點格式,如「1.1」,則將其轉換爲對應的浮點數值(前導的零被忽略);

若是字符串中包含有效的十六進制格式,例如「0xf」,則將其轉換爲相同大小的十進制整數值;

若是字符串是空的(不包含任何字符),則將其轉換爲0;

若是字符串中包含除上述格式以外的字符,則將其轉換爲NaN。

  1. 若是是對象,則調用對象的valueOf( )方法,而後依照前面的規則轉換返回的值。若是轉換的結果是NaN,則調用對象的toString( )方法,而後再次依照前面的規則轉換返回的字符串值。
  2. 若是第一個字符不是數字字符或者符號,parseInt( )函數就會返回NaN。轉換時最好指明基數,例如var num1 = parseInt(「10」,2); //輸出結果是2。
  3. parseFloat( )與parseInt( )的兩個區別:字符串中的第一個小數點對parseFloat( )是有效的,對parseInt( )是無效的;parseFloat( )始終會忽略前導的零,即其只能解析十進制值,沒有用第二個參數指定基數的用法。特例:parseFloat(「1234.00」)=1234,參數沒有小數點或者小數點後都是零,返回整數。
  4. String類型用於表示由零或多個16爲Unicode字符組成的字符序列,由單引號(’)或雙引號(」)表示。
  5. 字符字面量

字面量

含義

\n

換行

\t

指標

\b

退格

\r

回車

\f

進紙

\\

斜槓

\’

單引號(’),在用單引號表示的字符串中使用,例如:’He said,\’hey.\’ ’

\」

雙引號(「),在用雙引號表示的字符串中使用,例如:」He said,\」hey.\」 」

\xnn

以十六進制代碼nn表示一個字符(其中n爲0~F)。例如,\x41表示」A」

\unnn

以十六進制代碼nnnn表示的一個Unicode字符(其中n爲0~F)。

  1. 把一個值轉換爲一個字符串有兩種方式:toString( )方式,數值、布爾值、對象和字符串值都可,但null和undefined無此方法。toString( )方法可設置轉換基數。
  2. 在不肯定要轉換的值是否是null或undefined的狀況下,還可使用轉型函數String( ),此方式能將任意類型的值轉換爲字符串,其遵照如下轉換規則:

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

若是值是null,則返回」null」;

若是值是undefined,則返回」undefined」。

  1. 在ECMAScript中,Object類型是全部它的實例的基礎,即Object類型所具備的任何屬性和方法也一樣存在於更具體的對象中。存在如下屬性和方法:

Constructor:保存着用於建立當前對象的函數。

hasOwnProperty(propertyName):用於檢查給定的屬性在當前對象實例中是否存在,其中,屬性名必須以字符串的形式指定,例如o.hasOwnProperty(「name」)。

isPrototypeOf(object):用於檢查對象是不是傳入對象的原型。

propertyIsEnumerable(propertyName):用於檢查給定的屬性是否可以使用for-in語句來枚舉。

toLoacleString( ):返回對象的字符串表示,該字符串與執行環境的地區對應。

toString( ):返回對象的字符串表示。

valueOf( ):返回對象的字符串、數值或布爾值表示。一般與toString( )方法的返回值相同。

  1. 只能操做一個值的操做符叫作一元操做符,包括遞增(++)和遞減(--)操做符,都可前置和後置。這些操做符在應用與非整數類型時,遵照如下規則:

在應用於一個包含有效數字字符的字符串時,先將其轉換爲數字值,再執行加減1的操做。字符串變量變成數值變量。

在應用於一個不包含有效數字字符的字符串時,將變量的值設爲NaN,字符串變量變爲數值變量。

在應用於布爾值false時,先將其轉換爲0再執行加減1的操做,布爾值變量變爲數值變量。

在應用於布爾值true時,先將其轉換爲1再執行加減1的操做,布爾值變量變成數值變量。

在應用於浮點數值時,執行加減1的操做。

在應用於對象時,先調用對象的valueOf( )方法,以取得一個可供操做的值,而後對該值應用前述規則,若是結果是NaN,則再調用toString( )方法後應用前述規則。對象變量變成數值變量。

  1. 一元加操做符以一個加號(+)表示,放在數值前面,不會對數值產生任何影響,但對非數值應用一元加操做符時,該操做符會像Number( )轉型函數同樣對這個值進行轉換。
  2. 一元減操做符以一個減號(-)表示,放在數值前面,該值變成負數,當應用於非數值時,一元減操做符遵循與一元加操做符相同的規則,最後再將獲得的數值轉換爲負數。
  3. 位操做符用於在最基本的層次上,即按內存中表示數值的位來操做數值。對於有符號的整數,32位中的前31爲用於表示整數的值,第32位用於表示數值的符號:0表示正數,1表示負數。求負數的話,使用二進制補碼,即首先求出對應正數的二進制碼,而後求其二進制反碼,最後二進制反碼加1。注意:在處理有符號正數時,是不能訪問位31(即符號位,從0開始)的。
  4. 對於無符號正數而言,第32位再也不表示符號,所以無符號數只能是正數,且無符號整數的值能夠更大,由於多出的一位再也不表示符號,能夠用來表示數值。
  5. 按位非(NOT)操做符由一個波浪線(~)表示,執行按位非的結果就是返回數值的反碼。按位非的本質是:操做數的負值減1。
  6. 按位與(AND)操做符由一個和號字符(&)表示,按位與操做只在兩個數值的對應爲都是1時才返回1,任何一位是0,結果都是0。
  7. 按位或(OR)操做符由一個豎線符號(|)表示,按位或操做在有一個位是1的狀況下就返回1,而只是在兩個位都是0的狀況下才返回0。
  8. 按位異或(XOR)操做符由一個插入符號(^)表示,此操做在兩個數值對應位上只有一個1時才返回1,若是對應的兩位都是1或都是0,則返回0。
  9. 左移操做符由兩個小於號(<<)表示,這個操做符會將數值的全部位向左移動指定的位數。左移不會影響操做數的符號位,且以0來填充右邊空位。
  10. 有符號的右移操做符由兩個大於號(>>)表示,這個操做符會將數值向右移動,但保留符號位,此時,左側空位會用符號位的值來填充全部空位。
  11. 無符號右移操做符由三個3個大於號(>>>)表示,此操做符會將數值的全部32位都向右移動,對正數而言,此方法同有符號位右移,但對負數而言,無符號右移是0來填充空位。且無符號右移會將負數的二進制碼當成正數的二進制碼,以至結果很大。
  12. 邏輯非操做符由一個歎號(!)表示,可用於ECMAScript中的任何值。邏輯非操做符遵循下列規則:

若是操做數是一個對象,返回false;

若是操做數是一個空字符串,返回true;

若是操做數是一個非空字符串,返回false;

若是操做數是數值0,返回true;

若是操做數是任意非0數值(包括Infinity),返回false;

若是操做數是null,返回true;

若是操做數是NaN,返回true;

若是操做數是undefined,返回true。

  1. 同時使用兩個邏輯非操做符,即模擬了Boolean( )轉型函數的行爲。
  2. 邏輯與操做符由兩個和號(&&)表示,能夠應用於任何類型的操做數,而不只僅是布爾值。在有一個操做數不是布爾值的狀況下,邏輯與操做就不必定返回布爾值,此時,它遵循如下規則:

若是第一個操做數是對象,則返回第二個操做數;

若是第二個操做數是對象,則只有在第一個操做數的求值結果爲true的狀況下才會返回該對象;

若是兩個操做數都是對象,則返回第二個操做數;

若是有一個操做數是null,則返回null;

若是有一個操做數是NaN,則返回NaN;

若是有一個操做數是undefined,則返回undefined。

邏輯與是短路操做,即若是第一個操做數可以決定結果,則不會對第二個操做數求值。

  1. 邏輯或操做符由兩個豎線符號(||)表示,若是有一個操做數不是布爾值,邏輯或也不必定返回布爾值,此時,其遵循如下規則:

若是第一個操做數是對象,則返回第一個操做數;

若是第一個操做數的求值結果是false,則返回第二個操做數;

若是兩個操做數都是對象,則返回第一個操做數;

若是兩個操做數都是null,則返回null;

若是兩個操做數都是NaN,則返回NaN;

若是兩個操做數都是undefined,則返回undefined。

邏輯或也是短路操做。可利用邏輯或的這一行爲來避免爲變量賦null或undefined值。

  1. 乘法操做符由一個星號(*)表示,用於計算兩個數值的乘積。在處理特殊值的狀況下,乘法操做符遵循如下規則:

若是操做數都是數值,執行常規的乘法計算。若是乘積超過了ECMAScript數值的表示範圍,則返回Infinity或-Infinity;

若是有一個操做數是NaN,則結果是NaN;

若是是Inifinity與0相乘,則結果是NaN;

若是是Inifinity與非0數值相乘,則結果是Infinity或-Infinity,取決於有符號操做數的符號;

若是有一個操做數不是數值,則在後臺調用Number( )將其轉換爲數值,而後再應用上面的規則。

  1. 除法操做符由一個斜線符號(/)表示,執行第二個操做數除第一個操做數的計算,其對特殊值處理的規則以下:

若是操做數都是數值,執行常規的除法計算,若是商超過了ECMAScript數值的表示範圍,則返回Infinity或-Infinity;

若是有一個操做數是NaN,則結果是NaN;

若是是Infinity被Infinity除,則結果是NaN;

若是是零被領出,則結果是NaN;

若是是非零的有限數被零除,則結果是Infinity或-Infinity,取決於有符號操做數的符號;

若是是Infinity被任何非零數值除,則結果是Infinity或-Infinity,取決於有符號操做數的符號。

若是有一個操做數不是數值,則在後臺調用Number( )將其轉換爲數值,而後再應用以前的規則。

  1. 求模(餘數)操做符由一個百分號(%)表示,對特殊值的處理規則以下:

若是操做數都是數值,執行常規的除法計算,返回除得的餘數;

若是被除數是無窮大值而除數是有限大的數值,則結果返回NaN;

若是被除數是有限大的數值而除數是零,則結果是NaN;

若是是Infinity被Infinity除,則結果是NaN;

若是被除數是有限大的數值而除數是無窮大的數值,則結果是被除數;

若是被除數是零,則結果是零;

若是有一個操做數不是數值,則在後臺調用Number( )將其轉換爲數值,再應用以上規則。

  1. 加法操做符(+),若是兩個操做數都是數值,執行常規的加法計算,而後根據如下規則返回結果:

若是有一個操做數是NaN,則結果是NaN;

若是是Infinity加Infinity,則結果是Infinity;

若是是-Infinity 加-Infinity,則結果是-Infinity;

若是是Infinity加-Infinity,則結果是NaN;

若是是+0加+0,則結果是+0;

若是是-0加-0,則結果是-0;

若是是+0加-0,則結果是+0;

若是有一個操做數是字符串,則應用如下規則:

若是兩個操做數都是字符串,則將第二個操做數與第一個操做數拼接起來;

若是隻有一個操做數是字符串,則將另外一個操做數轉換爲字符串,而後再將兩個字符串拼接起來。

若是有一個操做數是對象、數值或布爾值,則調用它們的toString( )方法取得相應的字符串值,而後再運用前面的關於字符串的規則。對於undefined和null,則分別調用String( )函數並取得字符串」undefined」和」null」。

  1. 減法操做符(-)在處理各類該數據類型轉換時,遵照的特殊規則以下:

若是兩個操做符都是數值,則執行常規的算術減法操做並返回結果;

若是有一個操做數是NaN,則結果是NaN;

若是是Infinity減Infinity,則結果是NaN;

若是是-Infinity減-Infinity,則結果是NaN;

若是是Infinity減-Infinity,則結果是Infinity;

若是是-Infinity減Infinity,則結果是-Infinity;

若是是+0減+0,則結果是+0;

若是是+0減-0,則結果是-0;

若是是-0減-0,則結果是+0;

若是有一個操做數是字符串、布爾值、null或undefined,則先在後臺調用Number( )函數將其轉換爲數值,而後再根據前面的規則執行減法計算。若是轉換的結果是NaN,則減法的結果就是NaN;

若是有一個操做數是對象,則調用對象的valueOf( )方法以取得表示該對象的數值。若是獲得的值是NaN,則減法的結果就是NaN。若是對象沒有valueOf( )方法,則調用其toString( )方法並將獲得的字符串轉換爲數值。

  1. 關係比較符有小於(<)、大於(>)、小於等於(<=)和大於等於(>=)。規則以下:

若是兩個操做數都是數值,則執行數值比較。

若是兩個操做數都是字符串,則比較兩個字符串對應的字符編碼值;

若是一個操做數是數值,則將另外一個操做數轉換爲數值,而後執行數值比較;

若是一個操做數是對象,則調用這個對象的valueOf( )方法,用獲得的結果按照前面的規則比較,若無valueOf( )方法,則用toString( )方法,同上。

若是一個操做數是布爾值,則先將其轉換爲數值,而後再執行比較。

注意:任何操做數與NaN進行關係比較,結果都是false。

  1. 相等(==)和(!=),會先轉換操做數,而後再比較它們的相等性。

轉換不一樣的數據類型是,規則以下:

若是有一個操做數是布爾值,則在比較相等性以前先將其轉換爲數值——false轉換爲0,true轉換爲1;

若是一個操做數是字符串,另外一個操做數是數值,在比較相等性以前先將字符串轉換爲數值;

若是一個操做數是對象,另外一個操做數不是,則調用對象的valueOf( )方法,用獲得的基本類型值按照前面的規則進行比較。

兩個操做符在進行比較時則要遵循下列規則:

null和undefined是相等的。

要比較相等性以前,不能將null和undefined轉換爲其餘任何值。

若是有一個操做數是NaN,則相等操做符返回false,而不相等操做符返回true。即便兩個操做數都是NaN,相等操做符也返回false。

若是兩個操做數都是對象,則比較它們是否是同一個對象,若是都指向同一個對象,則相等操做符返回true,不然,返回false。

  1. 全等(===)和不全等(!==),僅在比較以前不轉換操做數,其餘方面與相等和不相等操做符沒區別。注意:null==undefined會返回true,但null===undefined會返回false。由於他們是不一樣類型的值。
  2. 條件操做符與Java語法相同。 Variable = a ? b:c;
  3. 簡單的賦值操做符由等於號(=)表示,即把右側的值付給左側的變量。
  4. 複雜賦值操做符主要有:

乘/賦值 (*=);

除/賦值 (/=);

模/賦值 (%=);

加/賦值 (+=);

減/賦值 (-=);

左移/賦值 (<<=);

有符號右移/賦值 (>>=);

無符號右移/賦值 (>>>=)。

  1. 逗號操做符用於聲明多個變量,在用於賦值時,逗號操做符總會返回表達式中的最後一項,如var num =(5,4,3,2,1) //num=1.
  2. if語句的語法是: if  (condition) statement1 else statement2
  3. do-while語句是一種後測試循環語句,即只有在循環體中的代碼執行以後,纔會測試出口條件。在對條件表達式求值以前,循環體內的代碼至少會被執行一次。
  4. while語句屬於前測試循環語句,在循環貼內的代碼被執行以前,就會對出口條件求值,所以,循環體內的代碼有可能用於不會被執行。
  5. for語句也是一直前測試循環語句,但它具備在執行循環以前初始化變量和定義循環後要執行的代碼的能力。在循環內部定義的變量也能夠在外部訪問到。
  6. for-in語句是一種精準的迭代語句,能夠用來枚舉對象的屬性。語法以下:

for (property in expression) statement

    在使用for-in循環以前,先檢測確認該對象的值不是null或undefined。

  1. 使用label語句能夠在代碼中添加標籤,以便未來使用。語法爲:

Label : statement

加標籤的語句通常都要與for語句等循環語句配合使用。

  1. break 和continue語句用於在循環中精確地控制代碼的執行,其中,break語句會當即退出循環,強制繼續執行循環後面的語句。而continue語句雖然也是當即退出循環,但退出循環後會從循環的頂部繼續執行。
  2. break和continue語句均可以與label語句聯合使用,從而返回代碼中特定的位置。應用於循環嵌套的狀況。
  3. with語句的做用是將代碼的做用域設置到一個特定的對象中。語法以下:

with (expression) statement

嚴格模式下,不容許使用with語句,不然將視爲語法錯誤。大量使用with語句會致使性能降低,也會給調試代碼形成困難,不建議在大型應用程序中使用。

  1. switch語句,可使用任何數據類型,其次每一個case的值不必定是常量,能夠是變量,甚至是表達式。Switch語句在比較值時使用的是全等操做符,所以不會發生類型轉換。
  2. 任何函數在任什麼時候候均可以經過return語句後跟要返回的值來實現返回值,位於return語句以後的任何代碼都永遠不糊執行。
  3. 嚴格模式對函數有一些限制:

不能把函數命名爲eval或arguments;

不能把參數命名爲eval或arguments;

不能出現兩個命名參數同名的狀況。

不然會致使語法錯誤,代碼沒法執行。

  1. ECMAScript中的參數在函數內部用一個數組表示,在函數體內能夠經過arguments對象來訪問這個參數數組,從而獲取傳遞給函數的每個參數。arguments對象只是與數組相似,它並非Array的實例,可以使用方括號語法來訪問它的每個元素,用length屬性來肯定傳遞進來多少個參數。所以,命名參數只提供便利,但不是必需的。且arguments對象能夠與命名參數一塊兒使用。且arguments的值用於與對應命名參數的值保持同步(在ECMAScript 5中無效)。
  2. 因爲不存在函數簽名的特性,ECMAScript函數沒有重載,即定義了兩個名字相同的函數,則該名字只屬於後定義的函數。
相關文章
相關標籤/搜索