1.引用類型的值(對象)是引用類型的一個實例。在ECMAScript中,**引用類型是一種數據結構,用于將數據和功能組織在一起**。它也常被稱為類,但這種稱呼并不妥當。盡管ECMAScript從技術上講是一門面向對象的語言,但它并不具備傳統的面向對象語言所支持的類和接口等基本結構。引用類型有時候也被稱為**對象定義**,因為它們描述的是一類對象所具有的屬性和方法。
2.創建Object實例的方式有兩種。第一種是**使用new操作符后跟Object構造函數**,另一種方式是使用**對象字面量**表示法。
~~~
var person = {
name : ‘Ken’,
age : 29
};
~~~
在這個例子中,左邊的花括號表示對象字面量的開始,因為它出現在了**表達式上下文**中。ECMAScript中的表達式上下文指的是能夠返回一個值(表達式)。賦值操作符表示后面是一個值,所以左花括號在這里表示一個表達式的開始。同樣的花括號,如果出現在一個**語句上下文**中,例如跟在if語句條件的后面,則表示一個語句塊的開始。
3.***在使用對象字面量語法時,屬性名也可以使用字符串***。如下面這個例子所示:
~~~
var person = {
'name' : 'ken',
'age' : 29,
5 : true
}
~~~
**這里的數值屬性名會自動轉換為字符串**。
***對象字面量傳遞參數的模式最適合需要向函數傳入大量可選參數的情形。一般來講,命名參數雖然容易處理,但在有多個可選參數的情況下就會顯示不夠靈活。最好的做法是對那些必需值使用命名參數,而使用對象字面量來封裝多個可選參數***。
4.ECMAScript數組的每一項可以保存任何類型的數據。
5.創建數組的基本方式有兩種。
第一種是使用Array構造函數(new也可以省略)。可以給構造函數傳入一個數值,這個數值會自動變成length屬性的值;也可以像Array構造函數傳遞數組中應該包含的項。
第二種基本方式是使用數組字面量表示法。數組字面量由一對包含數字項的方括號表示,多個數組項之間以逗號隔開。
6.***數組的length屬性很有特點--它不是只讀的。因此通過設置這個屬性,可以從數組的末尾移除項或向數組添加新項(undefined)。***
***利用length屬性也可以方便地在數組末尾添加新項***,如下所示:
`colors[colors.length] = ‘black’; //數組的最后一項永遠是[length-1]`
7.Array.isArray()方法用于最終確定某個值到底是不是數組。這是因為在不同 iframe 中創建的 Array 并不共享 prototype,所以instanceof無法檢測。
8.數組轉換方法
調用數組的***toString()***方法會返回由數組中每個值的字符串形式拼接而成的一個以逗號分隔的字符串。如果使用***join()***方法,則可以使用不同的分隔符來構建這個字符串。join()方法只接受一個參數,即用作分隔符的字符串。如果傳入空字符串,則直接拼接;如果不傳入任何值,則使用逗號作為分隔符。
9.數組棧方法(FILO)
***push()***方法可以接收任意數量的參數,把它們添加到數組的末尾,并返回修改后的數組長度。而***pop()***方法則從數組末尾移除最后一項,然后返回移除的項。
10.數組隊列方法(FIFO)
正向隊列:***push() + shift()***
反向隊列:***unshift + pop()***
11.添加項的方法都可以添加任意項并返回數組長度。刪除項方法都返回被刪除的那一項。
12.數組重排序方法:
***reverse()*** 反轉數組項的順序
***sort()*** 可以傳入一個比較函數,比較函數接收兩個參數,如果第一個參數應該位于第二個**之前則返回一個負數**,如果兩個參數相等則返回0,如果第一個參數應該位于第二個參數**之后則返回一個正數***。
如果數組項是數值類型或者其valueOf)方法會返回數值類型的對象類型,可以使用更簡單的比較函數。以下這個函數將數組由大到小重排序。
~~~
function compare(a,b) {
return b-a;
}
~~~
13.數組操作方法
***concat()*** 用于獲取合并后的數組。(不是contact)該方法可以基于當前數組中的所有項創建一個副本,然后將接受到的參數添加到這個副本的末尾,最后返回新構建的數組。可以傳入多個數組或值。調用這個方法的數組維持原值不變。
***slice()*** 用于獲取數組的子數組。該方法可以接受一個或兩個參數,即要返回項的起始位置和結束位置。在只有一個參數的時候,slice()方法返回從該參數指定位置開始到當前數組末尾的所有項。如果有兩個參數,該方法返回起始和結束位置之間的項--但不包括結束位置的項。slice()方法同樣不會影響原始數組。
如果slice()方法的參數中有負數,則用數組長度加上該數來確定相應的位置。如果結束位置小于起始位置,則返回空數組。
***splice()*** 用于刪除、插入、替換數組元素。語法:
splice(起始位置,要刪除的項數,插入的新項)
splice()方法始終會返回一個數組,該數組包含從原始數組中刪除的項。如果沒有刪除任何項則返回一個空數組。
14.數組位置方法
***indexOf()***和***lastIndexOf()***用于查找某個值在數組中第一次出現的索引值。這兩個方法都接收兩個參數:要查找的項和(可選的)表示查找起點位置的索引。這兩個方法都返回要查找的項在數組中的位置,或者在沒有找到的情況下返回-1。
**注意:這兩個方法返回的位置始終是從0開始以正序排列的索引。查找起點的索引位置包括了起點本身。**
15.數組迭代方法
***every()***:對數組中的每一項運行給定函數,如果該函數對每一項都返回true,則返回true;
***some()***:對數組中的每一項運行給定函數,如果該函數任一項返回true,則返回true。
***filte()***:對數組中的每一項運行給定函數,返回該函數會返回true的項組成的數組。
***forEach()***:對數組中的每一項運行給定函數。這個方法沒有返回值。
***map()***:對數組中的每一項運行給定函數,返回每次函數調用的結果組成的數組。
語法:array.xxx(function(item,index,thisArray){
//return do something
},作用域對象(可選))
**注意:迭代方法不會對原數組造成任何影響。forEach()和對數組進行for循環的不同之處也在于此。**
16.數組歸并方法(**用于條件篩選統計**)
***reduce()***和***reduceRight()***。
語法:array.xxx(function(acc,cur,index,thisArray){
//return do something;
},歸并基礎的初始值(可選))
若不傳入歸并基礎值,則acc為數組第一項
**傳入函數的return值將作為下次循環的prev值。**
17.要創建一個日期對象,使用new操作符和Date構造函數即可,
var now = new Date();
在調用Date構造函數而不傳入參數的情況下,新創建的對象自動獲得當前日期和時間。
18.設定時間-如果想根據特定的日期和時間創建日期對象,必須傳入表示該日期的毫秒數(即從UTC時間1970年1月1日午夜起至該日期止經過的毫秒數)。為了簡化這一計算過程,ECMAScript提供了兩個方法:
18.1 Date.parse():因為地區格式及瀏覽器實現的差異,不推薦使用此方法。
18.2 Date.UTC():下例中,只有年和月這兩個參數是必須的,其他缺省值默認為最小。
~~~
//GMT時間2005年5月5日下午5時55分55秒
var time = new Date(Date.UTC(2005,4,5,17,55,55));
~~~
在創建Date()函數時傳入參數,將會在后臺調用Date.UTC()方法,但與Date.UTC()不同,直接傳入構造函數創建的時間基于**本地時區**而非GMT。
18.***Date.now()返回表示調用這個方法時的日期和時間的毫秒數(即時間戳)***。注意,這個方法僅返回毫秒數,不能對其調用Date()對象的其他方法。調用這個方法而非new一個新的Date()對象有助于提高程序的運行效率、減少內存占用。
19.Date類型的valueOf()方法返回日期的毫秒表示,因此可以方便使用比較操作符來比較日期大小。
20.常用日期/時間組件方法
**getTime()** 返回表示日期的毫秒數;與valueOf()方法返回的值相同
**setTime()** 以毫秒數設置日期,會改變整個日期
**getFullYear()** 取得4位數的年份
**getMonth()** 返回日期中的月份,其**中0表示1月,11表示十二月**
**getDate()** 返回日期月份的天數(1到31)
**getDay()** 返回日期中星期的星期幾(其中**0表示星期日0,6表示星期六**)
**getHours()**
**getMinutes()**
**getSeconds()**
21.正則表達式基本語法:
var expression = /pattern/ flags;
其中標志位可以為以下表示:
g - 表示全局模式,即模式將被應用于所有字符串,而非在發現第一個匹配項時立即停止。
i - 表示不區分大小寫,即在匹配項時忽略模式與字符串的大小寫。
m - 表示多行模式,即在到達一行文本末尾時還會繼續查找下一行中是否存在與模式匹配的項。
22.模式中的所有元字符都必須轉義。
23.RegExp實例方法:
RegExp對象的主要方法是exec(),該方法是專門為捕獲組而設計的。exec()接受一個參數,即要應用模式的字符串,然后返回包含第一個匹配信息的數組;或者在沒有匹配項的情況下返回null。返回的數組雖然是Array的實例,但包含兩個額外的屬性:index和input。其中index表示匹配項在字符串中的位置,而input表示應用正則表達式的字符串。在數組中,第一項是與整個模式匹配的字符串,其他項是與模式中的捕獲組匹配的字符串(如果模式中沒有捕獲組,則該數組只有一項)。
對于exec()方法而言,即使在模式種設置了全局標志,它每次也只會放回一個匹配項。在不設置全局標志的情況下,在同一個字符串上多次exec()將始終返回第一個匹配項的信息。而在設置全局標志的情況下,每次調用exec()則都會在字符串中繼續查找新匹配項。
正則表達式的第二個方法是***test()***,它接受一個字符串參數。在模式與該參數匹配的情況下返回true,否則返回false。因此,***test()方法經常被用在if語句中,這種用法經常出現在驗證用戶輸入的情況下***。
24.RegExp構造函數屬性,使用這些屬性可以從exec()或test()執行的操作中提取出更具體的信息。
25.函數實際上是對象,每個函數都是Function類型的實例,而且都與其他引用類型一樣具有屬性和方法。由于函數是對象,因此函數名實際上也是一個指向函數對象的指針,不會與某個函數綁定。
26.函數通常是使用函數聲明語法定義的。這與使用函數表達式的定義方式幾乎相差無幾。最后一種定義函數的方式是使用Function構造函數。Function構造函數可以接收任意數量的參數,但最后一個參數始終都被看成是函數體,而前面的參數則枚舉出了新函數的參數。例:
`var sum = new Function(‘num1’,’num2’,’return num1+num2’); //不推薦`
27.**不僅可以像傳遞參數一樣把一個函數傳遞給另一個函數,而且可以將一個函數作為另一個函數的結果返回**。例:
~~~
function callSomeFunction(someFunction, someArgument){
return someFunction(someArgument);
}
~~~
**甚至我們還可以從一個函數中返回另一個函數,而不是函數的運行結果,而且這也是極為有用的一種技術。詳見P113**
28.***arguments對象還有一個名叫callee的屬性,該屬性是一個指針,指向擁有這個arguments對象的函數。該屬性常用于解除函數執行與函數名之間的強耦合。***
29.arguments.callee.caller返回調用當前函數的函數的引用。
30.**apply()**和**call()**方法的用途都是在特定的作用域中調用函數,實際上等于設置函數體內的this對象的值。
apply()方法接收兩個參數:一個是在其中運行函數的作用域,另一個是參數數組。其中,**第二個參數可以是Array的實例,也可以是arguments對象。而call()方法傳遞給函數的參數必須租個列舉出來。**使用apply()還是call()完全取決于你采用哪種給函數傳遞參數的方式最方便。
~~~
function sum(num1,num2){
return num1+num2;
}
function callSum1(num1,num2){
return sum.apply(this,arguments);
//等同于 return sum.apply(this,[num1,num2]);
}
~~~
**注意,全局函數的this為window對象。用這兩個方法來擴充作用域的最大好處是,對象不需要與方法有任何耦合關系。**
31.***bind()***方法會創建一個函數的實例,其this值會被綁定到傳給bind()函數的值。例:
~~~
window.color = ‘red’;
var o = {color:’blue’};
function sayColor(){
alert(this.color)
}
var objectSayColor = sayColor.bind(o);
objectSayColor(); //blue
~~~
32.數值類型的toFixed()方法可把 Number 四舍五入為指定小數位數的數字,返回數值的字符串表示。能夠自動舍入的特性,使得這個方法很適合處理貨幣值。例:
~~~
var num = 10;
alert(num.toFixed(2)); //10.00
~~~
33.String類型的每個實例都有一個length屬性,表示字符串中包含的字符數。即使字符串中包含雙字節字符(不是占一個字節的ASCII),每個字符也仍然只算一個字符。
34.String類型字符方法:
***charAt()***、***charCodeAt()***這兩個方法都接收一個參數,即基于0的字符位置。其中前者以單字符串的形式返回給定位置的那個字符。后者返回該字符的字符編碼。
35.String類型字符串操作方法:
concat() 用于將一或多個字符串拼接起來,返回拼接得到的新字符串。(相當于+操作符)
***slice()***、***substr()***、substring()這三個方法都會返回被操作字符串的一個子字符串,而且也都接受一或者兩個參數。第一個參數指定字符串的開始位置,第二個參數表示字符串到哪里結束。這三個方法對原始字符串不會造成影響。
***slice()***接受兩個參數,即起始位置與終點位置;
***substr()***接受兩個參數,即起始位置與字符串長度;
substrting()使用場景比較小,區間取值,可逆向
36.String類型位置方法:
***indexOf()、lastIndexOf()***用于從字符串中查找子字符串。這兩個方法都可以接受可選的第二個參數,表示從字符串中哪個位置開始搜索(第二個參數均以正序指示)。
37.String類型trim()方法:
***trim()***方法會返回一個字符串的副本,刪除前置及后綴的所有空格。
38.String類型字符串大小寫轉換方法:
***toUpperCase()、toLowerCase()***直接作用于調用該方法的字符串本身。
39.String類型字符串的模式匹配方法:
match()方法等同于RegExp類型的exec()方法。
search()方法返回字符串中第一個匹配項的索引,如果沒有匹配項則返回-1。
***replace()***方法用于替換子字符串。這個方法接受兩個參數:第一個參數是一個RegExp對象或者一個字符串(這個字符串不會被轉換成正則表達式),第二個參數可以是一個字符串或者一個函數。如果第一個參數是字符串,那么只會替換第一個子字符串。要想替換所有子字符串,唯一的辦法就是提供一個正則表達式,而且要指定全局標志。
***split()***方法可以基于指定的分隔符將一個字符串分割成多個子字符串,并將結果放在一個數組中。分隔符可以是字符串,也可以是一個RegExp對象(這個方法不會將字符串視為正則表達式)。這個方法可以接受第二個參數,用于指定返回數組的長度。如果把空字符串 ("") 用作 分隔符,那么stringObject中的每個字符之間都會被分割。如果傳入的分隔符不存在,則返回原字符串。
40.ECMA-262對內置對象的定義是:“由ECMAScript實現提供的、不依賴于宿主環境的對象,這些對象在ECMAScript程序執行之前就已經存在了。”意思就是說,開發人員無需顯式地實例化內置對象,因為它們已經實例化了。前面我們已經介紹了大多數內置對象,例如Object、Array、String。ECMAScript還定義了兩個單體內置對象:Global和Math。
41.所有在全局作用域中定義的屬性和函數,都是Global對象的屬性。在瀏覽器環境下,Global對象是window對象的一部分。
42.***encodeURI()***和***encodeURIComponent()***方法可以對Uniform Resource Identifiers(通用資源標識符)進行編碼,以便發送給瀏覽器。其中encodeURI()主要用于整個URI,而encodeURIComponent()主要用于對URI中的某一段進行編碼。它們的主要區別在于,前者不會對本身屬于URI的特殊字符進行編碼,例如冒號、正斜杠、問號和井號;而后者則會對他發現的任何非標準字符進行編碼。
***一般來說,我們使用encodeURIComponent()方法的時候要比使用encodeURI()更多,因為在實踐中更常見的是對查詢字符串參數而不是對基礎URI進行編碼。***
它們的逆向方法分別是decodeURI()和decodeURIComponent()。
43.eval()方法就像是一個完整的ECMAScript解析器,它只接受一個參數,即要執行的ECMAScript**字符串**。
當解析器發現代碼中調用eval()方法時,他會將傳入的參數當作實際的ECMAScript語句來解析,然后把執行結果插入到原來的位置。**通過eval()執行的代碼被認為是包含該次調用的執行環境的一部分,因此被執行的代碼具有與該執行環境相同的作用域鏈。**這意味著通過eval()執行的代碼可以引用在包含環境中定義的變量。
在eval()中創建的任何變量或函數都不會被提升,因為在解析代碼的時候,它們被包圍在一個字符串中;它們只在eval()執行時創建。
44.Math對象的**min()**和**max()**方法
這兩個方法用于確定一組數值中的最小值和最大值。這兩個方法都可以接收任意多個數值參數。要找到數組中的最大或最小值,可以使用apply()方法:
~~~
var values = [1,2,3,4];
var result = Math.max.apply(Math,values);
~~~
45.Math對象的舍入方法
Math.ceil() 向上取整
Math.floor() 向下取整
Math.round() 四舍五入取整
46.Math.random()方法返回大于等于0小于1的一個隨機數。