天天看點

JS -- 高程 - chapter5( 引用類型 )

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 種标志:

  1.   g : 整個字元串比對,而非遇到第一個滿足的子串就結束
  2.   i : 比對時忽略大小寫
  3.   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

類型的執行個體,而且和其他 引用類型 一樣具有 屬性和方法,并且由于函數也是 對象,是以函數名實際上是指向 函數對象 的指針,而不是和某個特定的函數綁定的

函數的幾種建立方式:

  1. 函數聲明 :

    function test(){ ...... }

  2. 函數表達式 :

    var test = function [name](){ ...... }; // => 函數名 name 可有可無

  3. 使用

    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類型

将數值格式化為字元串的方法:

  • toFixed

    : 按照參數指定的小數位( 支援 0~20 ),傳回對應的字元串,會進行 四舍五入
  • toExponential

    : 傳回指數表示法的字元串,接收一個參數指定小數位數,會進行 四舍五入
  • toPrecision

    : 根據情況傳回

    toFixed

    的形式或者

    toExponential

    的形式,該方法接收一個參數,表示數值所有字數的位數( 一共幾位 ),會進行 四舍五入

單體内置對象

内置對象:由 ECMA 提供實作,不依賴于宿主環境的對象

Global對象

URI編解碼方法:

  • encodeURI : 主要用于整個URI,不會對URI 的特殊字元轉義,例如 /   :  ?  #
  • encodeURIComponent: 主要用于URI的一部分,會對URI的特殊字元進行轉義
  • decodeURI: 對使用 encodeURI 方法轉義的URI進行解碼
  • decodeURIComponent: 對使用 encodeURIComponent 方法轉義的URI進行解碼