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