JavaScript不具備傳統面向對象的編程語言中所支持的類和接口等基本結構,所以用類的概念描述一個引用類型不是特別的精確!
定義對象的方法:
- 使用new操作符跟Object構造函數
- 使用對象字面量的方法(因爲屬於連續定義,所以內部使用逗號分隔)
訪問對象的屬性可以使用點表示法,也可以使用方括號表示法。
這裏方括號表示法的優點是可以通過變量來訪問屬性,但是日常還是以點表示法爲主。
Array類型:
創建數組的兩種方式:
- 使用new操作符跟Array構造函數
- 使用對象字面量的方式直接定義
數組中可以放置任何類型的數據,一個數組中允許存在不同類型的數據,允許創建空數組,以及存在個數但不存在數據的數組。
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方法
數組轉換成其他類型數據:
- toLocaleString()方法
- toString()方法,顯式轉換,直接轉爲String類型
- valueOf()方法
- alter()方法會隱式轉換,先調用toString()方法,因爲alter方法需要的是字符串參數
- 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腳本程序,將其中的函數聲明都拿出來,進行解析,也就是在腳本執行之初,函數聲明部分已經被率先被解析完畢了。
函數表達式則需要等到函數運行到該行代碼的時候在進行解析。
也正是因爲解析的事件和位置不同,所以函數聲明可以在後面寫,前面可以直接調用,而函數表達式則不可以!
函數的內部屬性:
- arguments屬性:存儲函數參數的類數組
- this屬性:引用函數執行的環境對象
- callee屬性,指向擁有某個屬性/對象的函數
- caller屬性,調用當前函數的函數引用,嚴格模式下不能爲函數的caller屬性賦值
函數的屬性:
- length()方法,能夠獲取函數的長度
- prototype屬性,保存所有實例方法的地方(後面的章節有詳解,這裏不贅述)
- call()方法,改變this的指向,接收多個參數,第一個參數指向運行參數的作用域,後面的參數是要傳遞給另一個函數的參數(逐個列舉)
- aplle()方法,改變this的指向,接收兩個參數,第一個參數指向運行參數的作用域,第二個參數是要傳遞給另一個函數的參數(數組形式給出)
- bind()方法,創建一個函數的實例,this的值綁定到傳遞給bind()函數的值
基本包裝類型:
ECMAScript提供了三個特殊的引用類型:Boolean、Number、String
這裏需要注意這三種引用類型與直接創建出來的基本類型不同,同時可以使用引用類型直接實現強制類型轉換
尤其是在String類型中,存在很多新方法:
- trim()方法,去除空格t
- oUpperCase()方法,變爲大寫
- 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” )