Object類型
建立
Object
類型的執行個體有兩種方式,一是使用構造函數
var person = new Object()
,
二是使用對象字面量
var person = { }
,通過字面量建立對象時,不會調用
Object
的構造函數
Array類型
建立
Array
類型對象的方式有兩種,一種是使用構造函數,二是使用字面量 ,使用字面量時不會調用
Array
構造函數
構造函數:
var arr = new Array() // 建立一個空數組
var arr = new Array(3) // 建立一個長度為 3 的數組
字面量:
var arr = new Array(1,2) // 建立數組長度為 2 ,值為 1、2 的數組(注意和上方的不同)
var arr = [1,2]
var arr = []
var arr = [1,2,] // 不建議
var arr = [ , , , ] // 不建議
數組對象的長度儲存在
length
屬性上,這個屬性不是隻讀的,可以通過改變它來實作數組的删除和擴容( 數組末尾 )
2.1 轉換方法
數組的
valueOf
方法,傳回自身
如果數組中的某一項是
undefined
或者
null
,則
toString、toLocalString、valueOf
使用 空字元串 表示這兩個值
2.2 棧方法
ECMA 為數組實作了
push、pop
方法,可實作類似棧的行為
push
: 可以向數組中從末尾推入任意數量的值,若值為數組,将整個數組推入當成一個元素,傳回添加後的數組長度
pop
: 從數組的末尾彈出一個元素,并将數組的
length
屬性值 減 1,傳回被彈出的元素
2.3 隊列方法
shift
方法可以獲得數組第一項的值,
unshift
方法則與之相反,是向數組頭部插入任意數量個元素
shift
: 将數組頭部的元素彈出數組,并傳回其值,同時将數組長度減 1
unshift
: 向數組頭部插入任意數量個元素,并傳回插入後數組的長度
2.4 排序方法
reverse
方法會反轉元素在數組中的順序,
sort
則可以對數組中的元素根據某種規則進行排序,兩個方法都傳回排序後的數組
sort
: 預設情況下,按照升序順序排序,會對每個元素調用
toString
方法,然後對其排序,其可以接受一個函數來自定義排序規則( 函數有兩個參數,分别為需要比較的兩個元素 )
比較函數傳回規則:如果 元素1 應該位于 元素2 之前,則傳回負數,反之則傳回正數,相同傳回 0
(a, b) => a - b // 升序排列(a<b, 則 a 在前)
(a, b) => b - a // 降序排列(a<b, 則 a 在後)
2.5 操作方法
concat
: 該方法可以基于目前數組中的所有元素建立一個新數組。該方法會先建立目前數組的一個副本,然後将參數中的項添加到副本的數組末尾,然後傳回這個副本數組,如果參數為數組,則将數組中的每一項添加到複制數組中
**
slice
:**基于目前數組的一個或多個元素建立一個新數組,可以接收兩個參數,表示從第一個參數位置開始,截取到第二個參數位置( 不包括 )的所有元素,如果隻傳第一個參數,則從第一個參數位置開始,截取到數組末尾。
兩個參數都可以為負值
第一個參數為負值的時候,會從
的位置開始截取元素,若參數的絕對值 >= 數組長度,則傳回整個數組的副本
數組長度 + 第一個參數
[1,2,3].slice(-1) // => [3]
第二個參數為負值的時候,會截取第一個參數開始,到
[1,2,3].slice(-4) // => [1,2,3]
的位置的元素,若
數組長度 + 第二個參數
的值 <= 第一個參數,則傳回一個空數組
數組長度 + 第二個參數
[1,2,3].slice(1,-1) // => [2]
兩個參數都為負值的時候,從
[1,2,3].slice(1,-3) // => []
截取到
數組長度 + 第一個參數
的位置
數組長度 + 第二個參數
[1,2,3].slice(-2,-1) // => [2]
**
splice
:**該方法可以 删除、插入、替換 目前數組元素,始終傳回一個數組,該數組包含了從原數組中 删除 的元素,沒有則傳回空數組
- 删除 : 可以删除任意數量的元素,需要指定 兩個參數,第一個參數表示開始删除的位置,第二個參數表示要删除的元素的數量。
[1,2,3,4].splice(1,1) // => [2]
- 插入 : 可以向指定位置插入任意數量元素,需要指定 至少三個參數 ,起始位置、0( 要删除的元素數量 )、要插入的元素( rest )。
[1,2,3].splice(1,0,4,5,6) // => arr: [1,4,5,6,2,3]
- 替換 : 可以将指定位置開始的 n 個元素替換為其他元素( 數量不一定相等 ),需要指定 至少三個參數,起始位置、n ( 需要替換的元素個數 )、替換的元素( rest )。
[1,2,3].splice(1,1,4) // => arr: [1,4,3]
2.6 位置方法
indexOf、lastIndexOf
用于查找元素在數組中的位置,使用全等 ===,未找到則傳回 -1 ,并且可以将第二個參數作為起始位置,開始查找,傳回的是元素的下标
2.7 疊代方法
ES5 定義了 5 個疊代方法,都可以接收 兩個參數, 第一個參數是要在每個元素上運作的函數,第二個參數是該函數内部的
this
值 ( 箭頭函數的
this
值無法被綁定 ),運作函數可以接收三個參數,目前元素、元素索引、目前數組對象
every
: 對數組每個元素執行給定函數,每個元素執行結果都傳回
true
,則傳回
true
,隻要元素執行傳回
false
,就不會繼續執行下去,立即傳回
false
filter
: 對數組每個元素執行給定函數,傳回執行給定函數時傳回
true
的元素組成的 新數組
forEach
: 對數組每個元素執行給定函數,沒有傳回值,給定函數傳回值不會影響原數組元素
map
: 對數組每個元素執行給定函數,傳回每次函數調用的傳回結果組成的 新數組
some
: 對數組每個元素執行給定函數,隻要有一個元素執行傳回
true
,就 立即 傳回
true
,不會繼續執行後面的元素
2.8 歸并方法
reduce、reduceRight
都會疊代所有元素,并且建構一個最終的傳回值,隻是方向相反,
reduce
從數組頭部開始執行,
reduceRight
從數組末尾開始執行
兩個方法都接收 兩個參數**:** 在每個元素上調用的函數、作為歸并基礎的初始值
調用函數可以接收 四個參數**:** 前一個值( 歸并的值 )、目前元素、元素索引、目前數組對象
如果沒有指定歸并的初始值,則從第二個元素開始執行,執行函數的第一個參數為第一個元素,如果指定了歸并的初始值,則從第一個元素開始執行,執行函數的第一個參數為初始值
####2.8 數組方法類型
數組的方法可以分為 變異方法 和 非變異方法,變異方法 即指 方法會 改變原數組,非變異方法則不會改變原數組
變異方法:
push、 pop、 shift、 unshift、 reverse、 sort、 splice
非變異方法:
concat、 slice、 forEach、 map、 filter、 every、 some
Date類型
ECMA 中的
Date
類型使用 UTC 1970年 1 月 1 日零時開始,到現在經過的毫秒數來儲存日期
調用構造函數而不傳參數時,新建立的對象會自動獲得目前日期,若想根據特定日期、時間建立對象,必須傳入該日期的毫秒數,或者傳入類似
Date.parse、Date.UTC
方法的參數
Date
提供了
Date.parse、Date.UTC
兩個方法來擷取指定日期的毫秒數,
parse
會嘗試将日期字元串參數解析為毫秒數,解析失敗傳回 NaN
Date.UTC
: 最多可以接收 七個參數,分别為 年份、月份(011)、天(131)、小時(0~23)、分鐘、秒、毫秒,隻有前兩個參數是必須的,其他參數未傳預設為 0 ( 建立的時間是GMT時間 )
Date.UTC(2018,0,20,18,30,20) // => 2018 年 1 月 20 日 18 點 30 分 20 秒
UTC 日期指的是沒有時區偏差情況下的日期值
###RegExp
ECMA 可以通過類似 Perl 的文法建立正規表達式:
var reg = / parttern / flags
正規表達式的比對模式支援以下 3 種标志:
- g : 整個字元串比對,而非遇到第一個滿足的子串就結束
- i : 比對時忽略大小寫
- m: 多行比對
三種标志可以同時使用
若想比對元字元本身,模式( pattern )中所有元字元都必須轉義,元字元包括:( ) { } [ ] \ * . ^ $ | ? +
第二種建立正規表達式的方式是使用
RegExp
構造函數,它接收兩個參數,要比對的模式字元串、可選的标志字元串
使用構造函數時,所有轉義的元字元必須使用雙重轉義:
/\[a/ => "\\[a"
執行個體屬性
- global: 辨別是否設定了 g 标志
- ignoreCase: 辨別是否設定了 i 标志
- lastIndex: 表示開始搜尋下一個比對項的開始位置( 一開始為 0 )
- mutiline: 辨別是否設定了 m 标志
- source: 傳回該正則的字面量表示形式的模式
執行個體方法
exec
: 該方法專門為捕獲組而設計,接收一個要比對的字元串參數,傳回包含第一個比對項資訊的數組,未比對到傳回 null
傳回的數組包含兩個額外屬性,
index
和
input
,分别表示比對到的 位置索引、比對的字元串( 還有個 groups 屬性 )
在數組中,第一項是與整個模式比對的所有字元串,以空格分開,其他項是與模式中的捕獲組比對的字元串
對于
exec
方法,即使設定了 g 标志,每次也隻會傳回一個比對項,而每次對這個字元串執行
exec
方法,若設定了 g 标志,則會在上一次的基礎上向後查詢,否則一直傳回第一個比對項( 最後一次比對之後再執行,會傳回 null,因為沒有比對到,再執行就會從頭開始)
test
: 判斷目标字元串中是否和正規表達式中的模式比對,接收一個字元串參數,有比對則傳回
true
,否則傳回
false
構造函數屬性
正則的構造函數屬性:
- input: 最近比對的字元串
- lastMatch: 最近一次比對的字元串
- lastParen: 最近一次的捕獲組
- leftContext: 目前比對的( lastMatch )左邊的字元串
- rightContext: 目前比對的( lastMatch )右邊的字元串
還有 $1~9 表示捕獲組,
exec
,
test
方法都會自動填充這幾個屬性
Function類型
每個函數都是
Function
類型的執行個體,而且和其他 引用類型 一樣具有 屬性和方法,并且由于函數也是 對象,是以函數名實際上是指向 函數對象 的指針,而不是和某個特定的函數綁定的
函數的幾種建立方式:
- 函數聲明 :
function test(){ ...... }
- 函數表達式 :
var test = function [name](){ ...... }; // => 函數名 name 可有可無
- 使用
:Function
,該構造函數可以接收任意個數的參數,最後一個參數被視為函數體,前面的參數都視為函數參數,不推薦這種寫法var test = new Function(arg1, args, "return arg1 + arg2")
函數表達式與函數聲明: 解析器會先讀取函數聲明,并使其在執行任何代碼前可用( 變量提升 ),而函數表達式則必須等到解析器執行到所在處代碼,完成指派之後,才可以被執行
函數内部屬性
在函數内部,有兩個特殊的屬性
arguments、this
,其中
arguments
對象不僅儲存着函數的參數,其還有一個屬性
callee
指向擁有該
arguments
對象的函數,
this
引用的是函數執行的環境對象
函數對象還有一個屬性
caller
,它儲存着調用目前函數的函數的引用( 函數調用時所在的函數 )
函數屬性和方法
屬性
每個函數都包含兩個屬性
length、prototype
,
length
屬性表示函數的形參清單的參數個數,
prototype
屬性則指向函數的原型對象
方法
每個函數都包含兩個非繼承來的方法:
apply、call
,這兩個方法的目的是改變函數體内的
this
指向
call
: 接收任意多個參數,第一個參數是執行函數時的
this
值,其餘參數是執行時函數的參數
apply
: 接收兩個參數,第一個參數是執行函數時的
this
值,第二個值是一個數組或者類數組對象,表示函數執行時用到的參數
使用
call、apply
時,函數會立即執行并傳回結果
ES5 還定義了一個
bind
方法,該方法會建立一個函數執行個體,并且該執行個體内部的
this
指向
bind
方法傳入的參數,該方法還支援傳入多個參數( 類似
call
方法,但不會立即執行 )
基本包裝類型
Object 構造函數會像工廠方法一樣,根據傳入值的類型傳回對應包裝類型的執行個體
Number類型
将數值格式化為字元串的方法:
-
: 按照參數指定的小數位( 支援 0~20 ),傳回對應的字元串,會進行 四舍五入toFixed
-
: 傳回指數表示法的字元串,接收一個參數指定小數位數,會進行 四舍五入toExponential
-
: 根據情況傳回toPrecision
的形式或者toFixed
的形式,該方法接收一個參數,表示數值所有字數的位數( 一共幾位 ),會進行 四舍五入toExponential
單體内置對象
内置對象:由 ECMA 提供實作,不依賴于宿主環境的對象
Global對象
URI編解碼方法:
- encodeURI : 主要用于整個URI,不會對URI 的特殊字元轉義,例如 / : ? #
- encodeURIComponent: 主要用于URI的一部分,會對URI的特殊字元進行轉義
- decodeURI: 對使用 encodeURI 方法轉義的URI進行解碼
- decodeURIComponent: 對使用 encodeURIComponent 方法轉義的URI進行解碼