JavaScript高級程序設計(反芻)3

JavaScript不具備傳統面向對象的編程語言中所支持的類和接口等基本結構,所以用類的概念描述一個引用類型不是特別的精確!

定義對象的方法:

  1. 使用new操作符跟Object構造函數
  2. 使用對象字面量的方法(因爲屬於連續定義,所以內部使用逗號分隔)

訪問對象的屬性可以使用點表示法,也可以使用方括號表示法
這裏方括號表示法的優點是可以通過變量來訪問屬性,但是日常還是以點表示法爲主。

Array類型:

創建數組的兩種方式:

  1. 使用new操作符跟Array構造函數
  2. 使用對象字面量的方式直接定義

數組中可以放置任何類型的數據,一個數組中允許存在不同類型的數據,允許創建空數組,以及存在個數但不存在數據的數組。

var a1 = [“1”, 2, “3”, true];   //length=4,存放的String、Number、Boolean
var a2 = [];                    //length=0,空數組
var a3 = [1, 2, 3,];            //IE8之前爲length=4,最後一位undefined,之後的全部瀏覽器改爲length=3
var a4 =[ , , , , ,];           //IE8之前爲length=6,全部爲undefined,之後全部的瀏覽器改爲length=5,全部爲undefined

訪問數組中的值可以直接使用值索引( array[number] ),如果索引小於數組的長度,那麼直接返回數據,如果大於數組長度,需指定具體數值後,會數組拉伸至索引長度。

var a = [1,2,3,4];
a[5];
console.log(a);      //4
a[5] = 10;
console.log(a);      //5

數組中的length方法並非只是一個只讀數據,而是可以操作數組的方法

var a = [1,3,4,5,6];
var b = a.length;
console.log(b);         //5
var c = a.length(3);
console.log(c);         //3; Array{1,3,4};
var d = a.length(4);
console.log(d);         //4; Array{1,3,4,undefined,undefined};

數組最多可以包含4292967295個項

檢測數組可以使用instanceof() 方法或者isArray方法

數組轉換成其他類型數據:

  1. toLocaleString()方法
  2. toString()方法,顯式轉換,直接轉爲String類型
  3. valueOf()方法
  4. alter()方法會隱式轉換,先調用toString()方法,因爲alter方法需要的是字符串參數
  5. join()方法,顯式轉換,但是這種方法可以設置分隔符

數組中的(先進後出)和隊列(先進先出):
棧
數組中存在pop()方法與push()方法,從數組的尾端插入和取出,模擬棧
隊列
數組中也存在unshift()與shift()方法,在數組的底端插入數據,在數組的頂端去除數據,模擬隊列

重排序方法:

  • reverse()方法,反轉數組項的順序
  • sort()方法,升序排序

操作方法:

  • concat()方法,拼接數組(個人感覺還不如使用加號操作符)
  • slice()方法,截取數組,接收一個或兩個參數,爲截取開始的位置和結束位置
  • splice()方法,截取數組,接收1/2/3個參數,第一個參數爲截取開始的位置,第二個參數爲截取的個數,第三個參數爲添加的參數(使用該方法組合形成截取/添加/替換方法)

位置方法:

  • indexOf()方法,從前向後查找數據
  • lastIndexOf()方法,從後向前查找數據
    兩種方法都是找不到返回 -1

迭代方法:(個人還沒感覺到具體的用處)

  • every(item, index, array)方法,全部爲true則返回true
  • filter(item, index, array)方法,返回true項組成的數組
  • foreach(item, index, array)方法,沒有返回值,與for循環類似
  • map(item, index, array)方法,返回函數每次調用結構組成的數組
  • some(item, index, array)方法,任意一項返回true,則返回true
    (item爲數組項,index爲索引,array爲數組對象)

歸併方法:(個人也還沒感覺到具體的用處)

  • Reduce()方法,從前向後迭代所有項,構建一個最終返回值
  • ReduceRight()方法,從後向前迭代所有項,構建一個最終返回值
    兩種方法都會接受四個值,prev前一個值,cur當前值,index項的索引,array數組對象

Date類型:
創建日期返回,但是這個類型個人感覺沒必要非得掌握,也或許是個人閱歷比較淺,返回值只是那麼固定的幾種,使用方面也基本上侷限於日期時間的返回,構建一個以ajax方式交互的時鐘,或者一個能活動的日曆,其他地方一般用不到。
Data數據,直接使用new操作符創建即可,後面有比較具體的日期格式化方法,使用時依據個人情況判斷即可

RegExp類型:
ECMAScript通過RegExp類型來支持正則表達式
var ecpression = / pattern/ flags ;
pattern:模式部分,也就是正則表達式部分,還是原來正常的正則表達式寫法
flags:標誌部分,g(global)表示全局應用,i(case-insensitive)表示不區分大小寫,m(multiline)表示多行
(剩下的部分個人理解的可能比較有侷限性,感覺並非特別重要,後續可能用到時,有了深入理解再補上)

Function類型:

函數名在前面的文章中已經給了一些描述,這裏就不再具體的描述了。其根本就是函數名並非函數,而僅僅是函數創建時被同時創造出的一個指向函數的指針
也正是因爲函數名僅僅是一個指針,所以在JavaScript中函數沒有重載這一說法,當函數出現同名情況時,就是將指針的指向進行了調整,這時原來的指向失去作用,所以再次使用函數名調用該函數時,指針指向新位置,舊位置被放棄。

函數的聲明與函數表達式還存在細微差別
函數聲明在聲明的時候就已經進行了解析,瀏覽器內置的解析器在執行代碼前會先行閱讀一遍全部的js腳本程序,將其中的函數聲明都拿出來,進行解析,也就是在腳本執行之初,函數聲明部分已經被率先被解析完畢了。
函數表達式則需要等到函數運行到該行代碼的時候在進行解析。
也正是因爲解析的事件和位置不同,所以函數聲明可以在後面寫,前面可以直接調用,而函數表達式則不可以!

函數的內部屬性:

  1. arguments屬性:存儲函數參數的類數組
  2. this屬性:引用函數執行的環境對象
  3. callee屬性,指向擁有某個屬性/對象的函數
  4. caller屬性,調用當前函數的函數引用,嚴格模式下不能爲函數的caller屬性賦值

函數的屬性:

  1. length()方法,能夠獲取函數的長度
  2. prototype屬性,保存所有實例方法的地方(後面的章節有詳解,這裏不贅述)
  3. call()方法,改變this的指向,接收多個參數,第一個參數指向運行參數的作用域,後面的參數是要傳遞給另一個函數的參數(逐個列舉)
  4. aplle()方法,改變this的指向,接收兩個參數,第一個參數指向運行參數的作用域,第二個參數是要傳遞給另一個函數的參數(數組形式給出)
  5. bind()方法,創建一個函數的實例,this的值綁定到傳遞給bind()函數的值

基本包裝類型:
ECMAScript提供了三個特殊的引用類型:BooleanNumberString
這裏需要注意這三種引用類型與直接創建出來的基本類型不同,同時可以使用引用類型直接實現強制類型轉換
尤其是在String類型中,存在很多新方法:

  1. trim()方法,去除空格t
  2. oUpperCase()方法,變爲大寫
  3. toLocaleLowerCase()方法,變爲小寫
    (還有其他的一些方法個人覺得用處不大就沒有寫出,有需要的同學可以直接去這本書的P130查看)

Global對象:
Global對象是ECMAScript中最爲特殊的一個對象,這個對象是一個全局對象,但是你是感覺不到它存在的。但是它是所有對象中最底層的一個,在全局作用域中定義的屬性和函數都是Global對象的屬性

URI編碼:
EncodeURI()方法和encodeURIComponent()方法都是對URI進行編碼,但是前者僅對主域名“/”後進行編碼,而後者對於所有都進行編碼
DecodeURI()方法和decodeURIComponent()方法對URI進行解碼
Eval()方法,ECMAScript中最強大的方法,方法直接執行包含在其中的代碼,且該代碼的執行環境爲所處的函數內執行環境,與函數的執行環境一致,也具有相同的作用域鏈。嚴格模式下爲eval賦值會報錯,且這種方法可以被用於代碼注入。
Global是window對象的一部分

Math對象:
屬性
Math.ceil()向上舍入、Math.floor()向下舍入、Math.round()標準四捨五入
random()隨機數:
value = Math.floor( Math.random()*可能值總數 + 第一個可能值 )
(計算中如果不熟悉,可以使用“可能值總數+第一個可能值-1”的方法確定區間,也就是 “第一個可能值 —— 可能值總數+第一個可能值-1” )
方法

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章