1. 程式人生 > 實用技巧 >JavaScript 複習06

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:

https://developer.mozilla.org/zh-CN/

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出現的位置以及次數

  1. 先查詢第一個o出現的位置
  2. 然後 只要indexOf 返回的結果不是 -1 就繼續往後查詢
  3. 因為indexOf 只能查詢到第一個,所以後面的查詢,利用第二個引數,當前索引加1,從而繼續查詢

根據位置返回字元

​ 字串通過基本包裝型別可以呼叫部分方法來操作字串,以下是根據位置返回指定位置上的字元:

​ 在上述方法中,charCodeAt方法返回的是指定位置上字元對應的ASCII碼,ASCII碼對照表如下:

​ 案例:判斷一個字串 'abcoefoxyozzopp' 中出現次數最多的字元,並統計其次數

  1. 核心演算法:利用 charAt() 遍歷這個字串

  2. 把每個字元都儲存給物件, 如果物件沒有該屬性,就為1,如果存在了就 +1

  3. 遍歷物件,得到最大值和該字元

    ​ 注意:在遍歷的過程中,把字串中的每個字元作為物件的屬性儲存在物件總,對應的屬性值是該字元出現的次數

字串操作方法

​ 字串通過基本包裝型別可以呼叫部分方法來操作字串,以下是部分操作方法:

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. 這個輸出什麼 ?  

​ 執行結果如下: