JavaScript 複習06
1 - 內建物件
1.1 內建物件
JavaScript 中的物件分為3種:自定義物件 、內建物件、 瀏覽器物件
前面兩種物件是JS 基礎 內容,屬於 ECMAScript; 第三個瀏覽器物件屬於 JS 獨有的, JS API 講解內建物件就是指 JS 語言自帶的一些物件,這些物件供開發者使用,並提供了一些常用的或是最基本而必要的功能(屬性和方法),內建物件最大的優點就是幫助我們快速開發
JavaScript 提供了多個內建物件:Math、 Date 、Array、String等
1.2 查文件
查詢文件:學習一個內建物件的使用,只要學會其常用成員的使用即可,我們可以通過查文件學習,可以通過MDN/W3C來查詢。
Mozilla 開發者網路(MDN)提供了有關開放網路技術(Open Web)的資訊,包括 HTML、CSS 和全球資訊網及 HTML5 應用的 API。
MDN:
1.3 Math物件
Math 物件不是建構函式,它具有數學常數和函式的屬性和方法。跟數學相關的運算(求絕對值,取整、最大值等)可以使用 Math 中的成員。
屬性、方法名 | 功能 |
---|---|
Math.PI | 圓周率 |
Math.floor() | 向下取整 |
Math.ceil() | 向上取整 |
Math.round() | 四捨五入版 就近取整 注意 -3.5 結果是 -3 |
Math.abs() | 絕對值 |
Math.max()/Math.min() | 求最大和最小值 |
Math.random() | 獲取範圍在[0,1)內的隨機值 |
注意:上面的方法使用時必須帶括號
獲取指定範圍內的隨機整數:
function getRandom(min, max) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
1.4 日期物件
Date 物件和 Math 物件不一樣,Date是一個建構函式,所以使用時需要例項化後才能使用其中具體方法和屬性。Date 例項用來處理日期和時間
-
使用Date例項化日期物件
- 獲取當前時間必須例項化:
var now = new Date();
- 獲取指定時間的日期物件
var future = new Date('2019/5/1');
注意:如果建立例項時並未傳入引數,則得到的日期物件是當前時間對應的日期物件
-
使用Date例項的方法和屬性
-
通過Date例項獲取總毫米數
-
總毫秒數的含義
基於1970年1月1日(世界標準時間)起的毫秒數
-
獲取總毫秒數
// 例項化Date物件 var now = new Date(); // 1. 用於獲取物件的原始值 console.log(date.valueOf()) console.log(date.getTime()) // 2. 簡單寫可以這麼做 var now = + new Date(); // 3. HTML5中提供的方法,有相容性問題 var now = Date.now();
-
1.5 陣列物件
建立陣列的兩種方式
-
字面量方式
-
示例程式碼如下:
var arr = [1,"test",true];
-
-
new Array()
-
示例程式碼如下:
var arr = new Array();
注意:上面程式碼中arr創建出的是一個空陣列,如果需要使用建構函式Array建立非空陣列,可以在建立陣列時傳入引數
引數傳遞規則如下:
-
如果只傳入一個引數,則引數規定了陣列的長度
-
如果傳入了多個引數,則引數稱為陣列的元素
-
-
檢測是否為陣列
-
instanceof 運算子
-
instanceof 可以判斷一個物件是否是某個建構函式的例項
var arr = [1, 23]; var obj = {}; console.log(arr instanceof Array); // true console.log(obj instanceof Array); // false
-
-
Array.isArray()
-
Array.isArray()用於判斷一個物件是否為陣列,isArray() 是 HTML5 中提供的方法
var arr = [1, 23]; var obj = {}; console.log(Array.isArray(arr)); // true console.log(Array.isArray(obj)); // false
-
新增刪除陣列元素的方法
- 陣列中有進行增加、刪除元素的方法,部分方法如下表
注意:push、unshift為增加元素方法;pop、shift為刪除元素的方法
陣列排序
- 陣列中有對陣列本身排序的方法,部分方法如下表
注意:sort方法需要傳入引數來設定升序、降序排序
- 如果傳入“function(a,b){ return a-b;}”,則為升序
- 如果傳入“function(a,b){ return b-a;}”,則為降序
陣列索引方法
- 陣列中有獲取陣列指定元素索引值的方法,部分方法如下表
陣列轉換為字串
- 陣列中有把陣列轉化為字串的方法,部分方法如下表
注意:join方法如果不傳入引數,則按照 “ , ”拼接元素
其他方法
- 陣列中還有其他操作方法,同學們可以在課下自行查閱學習
1.6 字串物件
基本包裝型別
為了方便操作基本資料型別,JavaScript 還提供了三個特殊的引用型別:String、Number和 Boolean。
基本包裝型別就是把簡單資料型別包裝成為複雜資料型別,這樣基本資料型別就有了屬性和方法。
// 下面程式碼有什麼問題?
var str = 'andy';
console.log(str.length);
按道理基本資料型別是沒有屬性和方法的,而物件才有屬性和方法,但上面程式碼卻可以執行,這是因為
js 會把基本資料型別包裝為複雜資料型別,其執行過程如下 :
// 1. 生成臨時變數,把簡單型別包裝為複雜資料型別
var temp = new String('andy');
// 2. 賦值給我們宣告的字元變數
str = temp;
// 3. 銷燬臨時變數
temp = null;
字串的不可變
指的是裡面的值不可變,雖然看上去可以改變內容,但其實是地址變了,記憶體中新開闢了一個記憶體空間。
當重新給字串變數賦值的時候,變數之前儲存的字串不會被修改,依然在記憶體中重新給字串賦值,會重新在記憶體中開闢空間,這個特點就是字串的不可變。
由於字串的不可變,在大量拼接字串的時候會有效率問題
根據字元返回位置
字串通過基本包裝型別可以呼叫部分方法來操作字串,以下是返回指定字元的位置的方法:
案例:查詢字串"abcoefoxyozzopp"中所有o出現的位置以及次數
- 先查詢第一個o出現的位置
- 然後 只要indexOf 返回的結果不是 -1 就繼續往後查詢
- 因為indexOf 只能查詢到第一個,所以後面的查詢,利用第二個引數,當前索引加1,從而繼續查詢
根據位置返回字元
字串通過基本包裝型別可以呼叫部分方法來操作字串,以下是根據位置返回指定位置上的字元:
在上述方法中,charCodeAt方法返回的是指定位置上字元對應的ASCII碼,ASCII碼對照表如下:
案例:判斷一個字串 'abcoefoxyozzopp' 中出現次數最多的字元,並統計其次數
-
核心演算法:利用 charAt() 遍歷這個字串
-
把每個字元都儲存給物件, 如果物件沒有該屬性,就為1,如果存在了就 +1
-
遍歷物件,得到最大值和該字元
注意:在遍歷的過程中,把字串中的每個字元作為物件的屬性儲存在物件總,對應的屬性值是該字元出現的次數
字串操作方法
字串通過基本包裝型別可以呼叫部分方法來操作字串,以下是部分操作方法:
replace()方法
replace() 方法用於在字串中用一些字元替換另一些字元,其使用格式如下:
字串.replace(被替換的字串, 要替換為的字串);
split()方法
split()方法用於切分字串,它可以將字串切分為陣列。在切分完畢之後,返回的是一個新陣列。
其使用格式如下:
字串.split("分割字元")
2 - 簡單資料型別和複雜資料型別
2.1 簡單資料型別
簡單型別(基本資料型別、值型別):在儲存時變數中儲存的是值本身,包括string ,number,boolean,undefined,null
2.2 複雜資料型別
複雜資料型別(引用型別):在儲存時變數中儲存的僅僅是地址(引用),通過 new 關鍵字建立的物件(系統物件、自定義物件),如 Object、Array、Date等;
2.3 堆疊
- 堆疊空間分配區別:
1、棧(作業系統):由作業系統自動分配釋放存放函式的引數值、區域性變數的值等。其操作方式類似於資料結構中的棧;
簡單資料型別存放到棧裡面
2、堆(作業系統):儲存複雜型別(物件),一般由程式設計師分配釋放,若程式設計師不釋放,由垃圾回收機制回收。
-
簡單資料型別的儲存方式
值型別變數的資料直接存放在變數(棧空間)中
-
複雜資料型別的儲存方式
引用型別變數(棧空間)裡存放的是地址,真正的物件例項存放在堆空間中
2.4 簡單型別傳參
函式的形參也可以看做是一個變數,當我們把一個值型別變數作為引數傳給函式的形參時,其實是把變數在棧空間裡的值複製了一份給形參,那麼在方法內部對形參做任何修改,都不會影響到的外部變數。
function fn(a) {
a++;
console.log(a);
}
var x = 10;
fn(x);
console.log(x);
執行結果如下:
2.5 複雜資料型別傳參
函式的形參也可以看做是一個變數,當我們把引用型別變數傳給形參時,其實是把變數在棧空間裡儲存的堆地址複製給了形參,形參和實參其實儲存的是同一個堆地址,所以操作的是同一個物件。
function Person(name) {
this.name = name;
}
function f1(x) { // x = p
console.log(x.name); // 2. 這個輸出什麼 ?
x.name = "張學友";
console.log(x.name); // 3. 這個輸出什麼 ?
}
var p = new Person("劉德華");
console.log(p.name); // 1. 這個輸出什麼 ?
f1(p);
console.log(p.name); // 4. 這個輸出什麼 ?
執行結果如下: