引用類型的值(對象)是引用類型的一個實例。創建一個引用類型實例需要用new操作符后跟一個構造函數來創建。構造函數本身也是函數,只不過出于創建新對象的目的而定義的。
一、Object類型
Object實例有兩種創建方式:
1、var obj = new Object();
2、使用對象字面量表示法
var person={ }
用對象字面量創建實際上是不會調用Object構造函數的。
訪問實例屬性有兩種
1、點表示法:alert(obj.name)
一般建議用點表示法訪問。
2、方括號表示法:alert(obj[name])
在屬性名中包含會導致語法錯誤的字符的時候可以用方括號表示法。
二、Array類型
Array類型即數組是數據的有序列表,每個元素都可以使不同類型,也可動態調整大小,也可隨著數組添加自動增長。兩種創建方式:1、var arr=new Array()
Array可以接受參數可以是數組長度也可以是數組的元素。2、var arr=[]
。訪問數組通過下標和方塊號表示法,arr[0]
表示訪問,數組的第一個元素。length也可以訪問數組的長度。
1、檢測數組
第一個alert(arr instanceof Array)//true
問題在于,有多個全局執行環境(網頁中包含多個框架)就會具有各自不同的構造函數。于是延伸出第二種方式。
第二個alert(Array.isArray(arr))//true
2、轉換方法
所有對象都具有toLocaleString()
、toString()
、valueOf()
方法.
數組調用toString()返回數組中每個值的字符串形式拼接而成的一個以逗號分隔的字符串。valueOf()返回的還是數組,toLocaleString()大多返回的和前兩個一樣,但是他會調用每一個數組元素的toLoceString()方法。
join()則是用不同的分隔符來構建字符串(參數可以是任意符號,不傳入則是逗號分隔)。
3、棧方法
棧是一種LIFO(last-in-first-out 后進先出)的數據結構,由push()
和pop()
組成棧方法。
push()
方法接收任意數量參數,把他們逐個添加到數組末尾。
pop()
方法從數組末尾刪除最后一項,減少length值,并返回最后一項。
4、隊列方法
隊列是一種FIFO(first-in-first-uot 先進先出)。在隊列末端添加數據,在隊列前端刪除數據,由push()
和shift()
組成隊列方法。
shift()刪除數組中第一個元素并將第一個返回,減少數組length值1。
pop()
和unshift()
可以從相反的方向模擬隊列。就是從前端添加項,從末尾移出。
unshift()
和shift()
相反在數組前端添加任意數量的元素。pop()
從末位刪除。
5、重排序方法
重排序顧名思義重新排序方法有reverse()和sort()。
reverse()
就是把數組翻轉過來。
sort()
按升序排列數組,最小值位于最前面漸漸增大,在排序的時候會為每一個元素掉用toString()
成字符串進行比較。一般不是最佳方案,這時候就需要在sort()
中傳遞一個比較函數,比較函數接受兩個參數,如果第一個參數應位于第二個參數之前返回負數,如果相等則反回0,第一個參數位于第二個參數之后返回正數。
function compare(value1,value2){
if(value1>value2){
return 1;//這是升序如果倒序只要換一下返回值即可
}else if(value1<value2){
return -1;//這是升序如果倒序只要換一下返回值即可
}else{
retuen 0;
}
}
function compare(value1,value2){ //如果是數值類型或可以用valueOf()返回數值的對象類型可以用這個函數
return value2-value1;//這是升序如果倒序交換即可。
}
6、操作方法
JavaScript為操作已經包含在數組中的項提供了很多方法如:concat()
、slice()
、splice()
。
concet()
:基于當前數組的項創建一個新數組。然后將接收到參數添加到新數組末尾。并返回新數組。
slice
:他能夠基于當前數組中一個或者多個創建一個新數組。接受兩個參數,第一個起始位置,第二個要結束的位置,一個參數就是起始到末尾。
splice
:刪除、插入、替換。刪除時傳兩個參數1、起始位置 2、要刪除幾個。插入時傳三個參數1、起始位置 2、要刪除的項可以為0(表示不刪除)3、要添加的項可以多個逗號分隔。替換時傳入三個參數1、起始位置 2、要刪除的項 3、要替換的項()可多項。三種功能
7、位置方法
JavaScript的位置方法:indexOf()和lastIndexOf()。
indexOf():有兩個參數1、要查找的項2、可選的查找的起始位置。從開始查起。
lastIndexOf():從后面查起。兩個方法都返回查找值在數組的位置,沒有返回-1。且查找的時候都是全等于===。
8、迭代方法
JavaScript為數組定義了5個迭代方法,每個方法都接受兩個參數:要在每一項上運行的函數和(可選的)運行在該函數的作用域---影響this的值。
every():給定運行每一項的函數,如果該函數對每一項都返回true,則返回true。
filter():同上,返回該函數會返回true的項組成數組。
forEach():同上,這個方法沒有返回值。
map():同上,返回每次函數調用的結果組成數組。
some():同上,如果該函數任意一項返回true,則返回true。
給定函數三個參數:function(數組項的值,該數組中的位置,數組本身)。
9、縮小方法
ECMAScript 5 還新增了兩個縮小數組方法:reduce()
和reduceRight()
。這兩個方法都會迭代數組中所有項,然后構建一個最終返回值。reduce是從數組前面開始reduceRight是從后面遍歷,他們都接受兩個參數:一個在每一項上調用的函數和(可選的)作為縮小基礎的初始值。
給定函數:function(前一個值,當前值,項的索引,數組對象)。
三、Data類型
javascript的Date使用的是自UTC(國際協調時間)1970年1月1日0時0分0秒開始經過的毫秒書來保存日期。
創建日期對象var now = new Date()
使用new和Date操作符。
var a = Date.now()
返回1970,1,1到現在的毫秒數,var a = +newDate()
一樣的效果。
1、繼承方法
Date對象也重寫了toLocaleString()
、toString()
、valueOf
方法,toLocaleString()會按著與瀏覽器設置地區先適應的格式日期和時間,這大致意味著時間格式會包含AM和PM,但不會包含時區。toString()通常返回帶有時區信息的日期和時間。valueOf()不會返回字符串,會返回日期的毫秒表示。
2、日期格式化方法
var a = new Date(2017,09,01)
a//Sun Oct 01 2017 00:00:00 GMT+0800 (中國標準時間)
a.toDateString()//"Sun Oct 01 2017"以特定于實現的格式顯示星期幾、月、日、年。
a.toTimeString()//"00:00:00 GMT+0800 (中國標準時間)"以特定于實現的格式顯示時、分、秒。
a.toLocaleDateString()//"2017/10/1"以特定于地區的格式顯示星期幾、月、日、年。
a.toLocaleTimeString()//"上午12:00:00"以特定于實現的格式顯示時、分、秒。
a.toUTCString()//"Sat, 30 Sep 2017 16:00:00 GMT"以特定于實現的格式完整的UTC日期。
3.日期/時間組件方法
[getDate()]從 Date 對象返回一個月中的某一天 (1 ~ 31)。
[getDay()]從 Date 對象返回一周中的某一天 (0 ~ 6)。
[getMonth()]從 Date 對象返回月份 (0 ~ 11)。
[getFullYear()]從 Date 對象以四位數字返回年份。
[getYear()]請使用 getFullYear() 方法代替。
[getHours()]返回 Date 對象的小時 (0 ~ 23)。
[getMinutes()]返回 Date 對象的分鐘 (0 ~ 59)。
[getSeconds()]返回 Date 對象的秒數 (0 ~ 59)。
[getMilliseconds()]返回 Date 對象的毫秒(0 ~ 999)。
[getTime()]返回 1970 年 1 月 1 日至今的毫秒數。
[getTimezoneOffset()]返回本地時間與格林威治標準時間 (GMT) 的分鐘差。
[getUTCDate()]根據世界時從 Date 對象返回月中的一天 (1 ~ 31)。
[getUTCDay()]根據世界時從 Date 對象返回周中的一天 (0 ~ 6)。
[getUTCMonth()]根據世界時從 Date 對象返回月份 (0 ~ 11)。
[getUTCFullYear()]根據世界時從 Date 對象返回四位數的年份。
[getUTCHours()]根據世界時返回 Date 對象的小時 (0 ~ 23)。
[getUTCMinutes()]根據世界時返回 Date 對象的分鐘 (0 ~ 59)。
[getUTCSeconds()]根據世界時返回 Date 對象的秒鐘 (0 ~ 59)。
[getUTCMilliseconds()]根據世界時返回 Date 對象的毫秒(0 ~ 999)。
[parse()]返回1970年1月1日午夜到指定日期(字符串)的毫秒數。
[setDate()]設置 Date 對象中月的某一天 (1 ~ 31)。
[setMonth()]設置 Date 對象中月份 (0 ~ 11)。
[setFullYear()]設置 Date 對象中的年份(四位數字)。
[setYear()]請使用 setFullYear() 方法代替。
[setHours()]設置 Date 對象中的小時 (0 ~ 23)。
[setMinutes()]設置 Date 對象中的分鐘 (0 ~ 59)。
[setSeconds()]設置 Date 對象中的秒鐘 (0 ~ 59)。
[setMilliseconds()]設置 Date 對象中的毫秒 (0 ~ 999)。
[setTime()]以毫秒設置 Date 對象。
[setUTCDate()]根據世界時設置 Date 對象中月份的一天 (1 ~ 31)。
[setUTCMonth()]根據世界時設置 Date 對象中的月份 (0 ~ 11)。
[setUTCFullYear()]根據世界時設置 Date 對象中的年份(四位數字)。
[setUTCHours()]根據世界時設置 Date 對象中的小時 (0 ~ 23)。
[setUTCMinutes()]根據世界時設置 Date 對象中的分鐘 (0 ~ 59)。
[setUTCSeconds()]根據世界時設置 Date 對象中的秒鐘 (0 ~ 59)。
[setUTCMilliseconds()]根據世界時設置 Date 對象中的毫秒 (0 ~ 999)。
[toSource()]返回該對象的源代碼。
四、RegExp類型
JavaScript用RegExp類型來支持正則表單式。var expression = / pattern / flags
。
模式(pattern)部分:可以是任何簡單或者復雜正則表達式。
標志(flags)部分:用以標明表達式的行為。
有三個標志
1、g:表示全局模式 全局匹配。
2、i:表示不區分大小寫模式。
3、m:表示多行模式。在達到一行末尾時繼續往下查。
var patteern= / .at / gi //匹配所有以at結尾的三個字符的組合,全局且不區分大小寫。
模式中的元字符都必須轉義,正則表達式中的元字符包括:
( [ { \ ^ $ | ? * + . ) ] }
正則表達式字面量和正則表達式構造函數創建的實例在循環使用上有差別,正則表達式字面量始終都會共享一個實例,用構造函數則不會。但是在后代瀏覽器修改了這個bug
1、RegExp實例屬性
global:布爾值,表示是否設置了g。
ignoreCase:布爾值,表示是否設置了i。
lastIndex:整數,表示搜索下一個匹配的位置,從0起。
multiline:布爾值,表示是否設置了m標志。
source:正則表達式的字符串表示,按照字面量形式而非傳入構造函數中的字符串模式返回。
2、RegExp實例方法
exec():接受一個參數,即是字符串,返回第一個返回項信息的數組,沒有匹配返回null。返回包含兩個額外屬性index和input。index表示返回的位置,input表示應用表達式的字符串。如果不設置全局標志g多次調用則會始終返回第一個匹配項,設置g標志會查找新的匹配項。
test():接受一個參數,返回布爾值。驗證通過返回true,不通過false。
3、RegExp構造函數屬性
RegExp構造函數的屬性返回最近一次正則表達式操作而變化。他們又分為長屬性名和短屬性名
input ($_):屬性返回原始字符串。
leftContext ($`):返回匹配字符串之前的字符串。
rightContext ($'):返回匹配之后的字符串。
lastMatch ($&):返回最近一次匹配的字符串。
lastparem ($+):返回最近一次捕獲組。
4、RegExp類型的局限性
1、匹配字符串開始和末尾的\A和\Z的錨。(但是支持插入^ $,來匹配字符串開始和末尾)
2、向后查找。(但是支持往前查找)
3、并集與交集類。
4、原子組。
5、Unicode支持。
6、命名捕獲組。(但是支持編碼的捕獲組)
7、單行和無間隔匹配模式。
8、條件匹配。
9、正則表達式注釋。
五、Function類型
每個函數都是Function類型的實例,創建函數三種方式函數聲明式、函數表達式、Function構造函數。
1、沒有重載
說白了就是函數名覆蓋了,函數的指針被覆蓋了。
2、函數聲明和函數表達的區別
函數聲明會變量提升,而函數表達式必須執行到代碼。
3、作為值的函數
函數本身就是個變量,所以函數作為值來傳遞,而且可以把一個函數做為另一個函數的值返回。
4、函數內部屬性
arguments和this,arguments是類數組對象保存著函數的參數,但是他有一個屬性callee的屬性指向arguments對象的數組。this指向的就是函數執行環境。還有一個caller他指向的是調用此函數的函數引用。arguments和callee還有caller在嚴格模式下會報錯。
5、函數的屬性和方法
函數的兩個屬性length和prototype,length就是查看函數希望得到的參數函數名.length
,prototype是為函數添加自定義屬性和方法的。
函數的兩個方法apply()和call(),這兩個方法都是在特定的作用域下調用函數,實際上就是設置函數體內this對象的值。第一個在其中運行函數的作用域,第二個參數apply必須是數組或者是arguments對象,call的第一參數沒變還是this但是其余的必須是逐個列舉的。還有他們的作用可以擴充函數作用域。bind()方法,他會創建一個函數的實例,把this值綁定到傳入bind()函數中的值。
window.color='red';
var o = {color:'blue'};
function sayColor(){
alert(this.color);
}
sayColor()//red
sayColor.call(window)或者apply(window)//red;
sayColor.call(o)或者apply(o)//blue;
var objectSayColor = sayColor.bind(o);
objectSayColor();//biue
toString()、valueOf()、toLocoleString()都返回函數的代碼。
六、基本包裝類型
JavaScript還有三個基本包裝類Number、Boolean、String。但是他們都有與之對應的基本類型的特殊行為。
三個基本類型在調用方法的時候其實都是通過后臺轉變成基本包裝類的,只不過在完成調用方法后被銷毀實例。
var s= "string";
s.color='red';
alert(s.color)//undefined
如上給基本類型添加屬性一樣,當添加時調用基本包裝類型構造函數,添加完就銷毀,如果訪問基本類型屬性會重新調用基本包裝類型構造函數。但是沒有所以返回undefined。
當然,也可以手動調用基本包裝類構造函數,但是不建議用。一是會引用類型和基本類型處理上分不清,二是有不確定因素。
用基本包裝類型構造函數創建的實例調用typeof會返回Object。
用基本包裝類用new和不用說有區別的。用new就是Object類型。
Boolean類型
像這樣var boolean = new Boolean(true);
,來創建Boolean對象。
Boolean重寫valueof()、toString()這兩個方法
valueof返回的是基本類型boolean值true和false。
toString返回的是字符串'true'和'false'。
Boolean對象和boolean基本類型的區別
Boolean對象會返回true,因為除了null和undefined之外的對象都返回true。
typeof操作符boolean基本類型會返回boolean,而Boolean對象會返回Object。
instanceof測試Boolean,Boolean對象會返回true,而boolean基本類型會返回false。
Number類型
像這樣var number = new Number(12)
來創建Number對象實例。
Number重寫valueof()、toString()、toLocaleString()這三個方法
valueof返回基本類型數值。
toString和toLocaleString返回是字符串的數值。
Number類型還提供了將數值格式化字符串的方法
toFixed():接受一個參數,傳入數字,幾就代表顯示幾位小數。
toExponential():也是接受一個參數,傳入數字,該方法返回以指數表示法(也稱e表示法)。
toPrecision():接受一個參數,傳入數字,傳入幾表示用幾位數表示數值。
Number對象和number基本類型的區別
Number對象會返回true,因為除了null和undefined之外的對象都返回true。
typeof操作符number基本類型會返回number,而Number對象會返回Object。
instanceof測試Number,Number對象會返回true,而number基本類型會返回false。
String類型
像這樣var string= new String('hello')
來創建String對象實例。
每一個String實例類型都有一個length屬性。
1、字符串方法
charAt():接受一個參數,基于0字符位置返回給定數值位置的那個字符。其實也可以string[0]用方括號訪問。
charCodeAt():接收一個參數,基于0字符位置返回給定數值位置的那個字符編碼。
2、字符串操作方法
concat():拼接字符串方法,傳入一個或多個將要拼接的字符串,其實用
+
拼接更加方便。
slice():截取字符串方法,兩個參數,第一個起始位置,第二個結束位置。第一個參數為負數時,會和length屬性相加來返回。第二個為負數時,也是會相加。
substring():截取字符串方法,兩個參數,第一個起始位置,第二個結束位置。第一個參數為負數時,會轉化成0。第二個為負數時,會解析成0。
substr():截取字符串方法,兩個參數,第一個起始位置,第二個結束個數。第一個參數為負數時,會和length屬性相加來返回。第二個為負數時,會解析成0。
3、字符串位置方法
indexOf():搜索給定字符,然后返回相應字符位置,沒找到返回-1,第二個參數是起始搜索位置,從正面搜索。
lastIndexOf():搜索給定字符,然后返回相應字符位置,沒找到返回-1,第二個參數是起始搜索位置,從后面搜索。
4、trim()方法
該方法會創建一個字符串副本,刪除前面和后面所有空格并返回。Chrome8+支持trimLeft()和trimRight()方法。
5、字符串大小轉化方法
toUpperCase():轉化為大寫。
toLowerCase():轉化為小寫。
toLocaleUpperCase():針對地區的方法。
toLocaleLowerCase():針對地區的方法。
6、字符串的模式匹配方法
match():和RegExp對象的exec()方法相同,在字符串上調用,只接受一個參數,要么是正則表達式,要么是RegExp對象。
search():和match參數一樣,返回字符串中第一個匹配索引。
replace():替換方法,接受兩個參數,第一個是RegExp對象或者是匹配字符。第二個可以是一個字符換或者是一個函數。函數接受三個參數能給更精確替換,function(match(模式的匹配項),pos(模式匹配項在字符串中位置),originalText(原始字符串))。
split():分隔字符串,給予傳入的字符分隔,第二個是分隔數組的大小。
7、localeCompaare()方法
localeCompaare()大于要比較的字符串返回1,等于返回0,小于返回-1。
8、fromCharCode()方法傳入字符編碼返回字符串。
9、HTML方法
七、單體內置類型
內置對象是指有javascript實現提供的,不依賴宿主環境的對象。
Global對象
Global對象是整個javascript的最底層對象。前面所介紹的都是Glodal的方法屬性。還有以下方法
encodeURL()和encodeComponent()方法是對URL進行編碼,以便發給瀏覽器。
eval()方法只接受一個參數,是對要javascript字符串執行。在嚴格模式下訪問不到eval中創建的任何變量和方法。給eval賦值也會報錯。
Math對象
1、Math對象的屬性
Math.E:自然對數的底數,就是常量e的值
Math.LN10:10的自然數
Math.LN2:2的自然數
Math.LOG2E:以2為底e的對數
Math.LOG10E:以10為底e的對數
Math.PI:返回圓周率(約等于3.14159)。
Math.SQRT1_2:1/2的平方根
Math.SQRT2:2的平方根
2、min()和max()方法,他們確定一組數據里面最小和最大的值。他們都接受任意多個值。
3、舍入方法
Math.ceil():向上舍入到最近的整數
Math.floor():向下舍入到最近的整數
Math.round():標準的四舍五入到最近的整數
4、Math.random()方法返回介于0到1之間的隨機小數。
5、Math對象其他方法列表
[abs(x)]:返回數的絕對值。
[acos(x)]:返回數的反余弦值。
[asin(x)]:返回數的反正弦值。
[atan(x)]:以介于 -PI/2 與 PI/2 弧度之間的數值來返回 x 的反正切值。
[atan2(y,x)]:返回從 x 軸到點 (x,y) 的角度(介于 -PI/2 與 PI/2 弧度之間)。
[ceil(x)]:對數進行上舍入。
[cos(x)]:返回數的余弦。
[exp(x)]:返回 e 的指數。
[log(x)]:返回數的自然對數(底為e)。
[pow(x,y)]:返回 x 的 y 次冪。
[sin(x)]:返回數的正弦。
[sqrt(x)]:返回數的平方根。
[tan(x)]:返回角的正切。
小結
Object是一個基礎類型,其他的所有類型都是從Object上繼承的基本行為。
Array類型是一組值的有序列表,同時還提供了操作和轉換這些值的方法。
Date類型提供了有關日期和時間的信息,還有他們相關的計算功能。
RegExp類型正則表達式的一個接口,還提供了最基本和一些高級的正則表達式功能。
函數是Function類型的實例。
因為有了基本包裝類型,所以基本類型值可以當作對象來訪問,三種基本包裝類分別是String、Number、Boolean。
每個包裝類型都映射到同名的基本類型。
在讀取模式下訪問基本類型值時,就會創建對應的基本包裝類型的對象,從而方便操作。
操作基本類型語句一經執行結束,就會立即銷毀。
在所有代碼執行之前,作用域就已經存在兩個內置對象Global和Math對象,在大多數javascript實現中都不能訪問Global對象,但是可以在瀏覽器中實現了承擔該對象的window對象。全局變量和函數都是Global對象的屬性,Math對象提供了很多屬性和方法用于數學計算。