1. 程式人生 > 其它 >JS學習筆記(五)-JavaScript內建物件和資料型別總結與JS第一階段個人小結

JS學習筆記(五)-JavaScript內建物件和資料型別總結與JS第一階段個人小結

技術標籤:前端字串javascripthtml5

2021.1.15

文章目錄

JS學習筆記(五)

JS內建物件

內建物件

  • JavaScript中的物件分為三種:自定義物件內建物件瀏覽器物件
  • 前面兩種物件是JS基礎內容,屬於ECMAScript;
  • 第三個瀏覽器物件屬於我們JS獨有的,我們在學習JS API時重點講解。
  • 內建物件就是指JS語言自帶的一些物件,這些物件供開發者使用,並提供了一些常用的或是最基本而必要的功能(屬性和方法)。
  • 內建物件最大的優點就是幫助我們快速開發。
  • JavaScript提供了多個內建物件:MathDateArrayString等。

查文件

MDN

學習一個內建物件的使用,只要學會其常用成員的使用即可,我們可以通過查文件學習,可以通過MDN/W3C來查詢。
Mozilla開發者網路(MDN)提供了有關開放網路技術(Open Web)的資訊,包括HTML、CSS和全球資訊網及HTML5應用的API。

MDN官方網址:https://developer.mozilla.org/zh-CN/

如何學習物件中的方法

  1. 查閱該方法的功能
  2. 檢視裡面引數的意義和型別
  3. 檢視返回值的意義和型別
  4. 通過demo進行測試

Math物件

Math數學物件不是一個建構函式,所以我們不需要new來呼叫,而是直接使用裡面的屬性和方法即可。例如:

console.log(Math.PI);//一個屬性 圓周率
console.log(Math.max(-1,-10));//-1
console.log(Math.max(1,99,'Ludwig'));// NaN
console.log(Math.max());//-Infinity

練習:封裝自己的數學物件


利用物件封裝自己的數學物件,裡面有PI、最大值和最小值。

<script>
    var myMath = {
      PI: 3.141592653,
      max: function() {
          var max = arguments[0];
          for (var i = 1; i < arguments.length; i++) {
              if (arguments[i] > max) {
                  max = arguments[i];
              }
            }
          return max;
      },
      min: function() {
          var min = arguments[0];
          for (var i = 1; i < arguments.length; i++) {
              if (arguments[i] < min) {
                  min = arguments[i];
              }
            }
          return min;
      }
    }
    console.log(myMath.PI);
    console.log(myMath.max(1, 9, 85, 7));
  </script>

Math概述
Math物件不是建構函式,它具有數學常數和函式的屬性和方法。
跟數學相關的運算(求絕對值,取整,最大值等)可以使用Math中的成員。

Math.PI                 //圓周率
Math.floor()            //向下取整,往小了取(floor地板)
Math.ceil()             //向上取整,往大了取(ceil天花板)
Math.round()            //四捨五入版,就近取整。
                        //注意.5特殊,往大了取,如:-3.5結果是-3
Math.abs()              //絕對值
Math.max()/Math.min()   //求最大和最小值

Note:console.log(Math.abs(’-1’));//輸出結果為1,說明abs()方法存在隱式轉換,會把字串型的’-1’轉換為數字型的’-1’。

隨機數方法random()

  1. random()返回一個隨機的小數。範圍屬於[0,1)。
  2. 這個方法裡面不跟引數。
  3. 我們想得到兩個數字之間的隨機整數,並且包含這兩個整數。

查閱MDN文件可知:
Math.floor(Math.random() * (max - min + 1)) + min; //含最大值,含最小值,我們只需將其封裝到函式裡去,呼叫即可。

function getRandom(min,max){
  return Math.floor(Math.random() * (max - min + 1)) + min;
}
console.log(getRandom(1,10));
  1. 隨機點名
var arr=['張三','李四','王五','陳六'];
console.log(arr[getRandom(0,arr.length-1)]);

日期物件

Date()日期物件是一個建構函式,必須使用new來呼叫建立我們的日期物件。

Note:
var arr=new Array();//建立一個數組物件
var obj=new Object();//建立了一個物件例項

使用Date

var date = new Date();
console.log(date);
  • 如果沒有引數,返回當前系統時間
  • 引數常用的寫法
    • 數字型 2021,1,14
    • 字串型 ‘2021-1-14 8:8:8’//常用
    var date1=new Date(2021,1,14);
    console.log(date1);//返回的是11月,不是10月
    var date2=new Date('2021-1-14 8:8:8');
    console.log(date2);
    

日期格式化

我們可以採用如下方法:

getFullYear();       //獲取當前年
getMonth();          //獲取當月(0-11)
getDate();           //獲取當天日期
getDay();            //獲取星期幾(週日0~週六6)
getHours();          //獲取當前小時
getMinutes();        //獲取當前分鐘
getSeconds();        //獲取當前秒

Note:
1.輸出月份的時候要記得加1
console.log(date.getMonth()+1);
2.輸出今天周幾,週一週六返回的是16,而週日返回的是0
console.log(date.getDay());

案例1寫一個 今天是2021年1月14日 週四

var date = new Date();//先建立物件例項
var year = date.getFullYear();
var month = date.getMonth()+1;
var dates = date.getDate();
var arr=['日','一','二','三','四','五','六'];
var day = date.getDay();
console.log('今天是'+year+'年'+month+'月'+dates+'日'+' '+'星期'+arr[day]);

案例2要求封裝一個函式返回當前的時分秒,格式為 08:08:08

function getTimer() {
    var time = new Date(); //這句話不能忘!一定要寫!
    var h = time.getHours();
    h = h < 10 ? '0' + h : h;
    var m = time.getMinutes();
    m = m < 10 ? '0' + m : m;
    var s = time.getSeconds();
    s = s < 10 ? '0' + s : s;
    return h + ':' + m + ':' + s;
}
console.log(getTimer());

獲取日期的總的毫秒形式(時間戳)

Date物件是基於1970年1月1日(世界標準時間)起的毫秒數。
我們經常利用總的毫秒數來計算時間,因為它更精確。

Note
獲取Date總的毫秒數,不是當前時間的毫秒數,
而是距離1970年1月1號過了多少毫秒。

  • 1.通過valueOf()、getTime()
    var date = new Date();
    console.log(date.valueOf());
    console.log(date.getTime());//我們現在的時間距離1970.1.1總的毫秒數。
    
  • 2.簡單的寫法(最常用的寫法)
    var date1 = +new Date();//如果引數不為空則返回的是括號裡時間總的毫秒數。
    console.log(date1);
    
  • 3.H5新增的方法Date.now();
    console.log(Date.now());
    

案例倒計時

分析:

  1. 核心演算法:輸入的時間減去現在的時間就是剩餘的時間,即倒計時,但是不能拿著時分秒相減,比如05分減去25分,結果會是負數。
  2. 時間戳來做。使用者輸入時間的總的毫秒數-現在時間的總的毫秒數,得到的就是剩餘時間的毫秒數。
  3. 把剩餘時間的毫秒數轉換為天、時、分、秒(時間戳轉換為時分秒)
    轉換公式如下:
    • d = parseInt(總秒數/60/60/24);//計算天數
    • h = parseInt(總秒數/60/60%24);//計算小時
    • m = parseInt(總秒數/60%60); //計算分數
    • s = parseInt(總秒數%60); //計算當前秒數
<script>
    function countDown(time){
        var nowTime=+new Date();//如果括號為空,返回的是當前時間總的毫秒數
        var inputTime=+new Date(time);//如果括號非空,返回的是使用者輸入時間總的毫秒數
        var times=(inputTime-nowTime)/1000;//time是剩餘時間總的毫秒數,1s=1000ms
        var d=parseInt(times/60/60/24);//天
        d = d < 10 ? '0' + d : d;
        var h=parseInt(times/60/60%24);//時
        h = h < 10 ? '0' + h : h;
        var m=parseInt(times/60%60);//分
        m = m < 10 ? '0' + m : m;
        var s=parseInt(times%60);//當前的秒
        s = s < 10 ? '0' + s : s;
        return d+'天'+h+'時'+m+'分'+s+'秒';
    }
    console.log(countDown('2021-1-16 00:00:00'));
    var date=new Date();
    console.log(date);
</script>

陣列物件

陣列物件的建立

建立陣列物件有兩種方式:

  • 字面量方式
  • new Array()
      var arr1=new Array();//建立一個空的陣列
      var arr2=new Array(2);//建立一個長度為2的陣列,裡面有兩個空的陣列元素
      var arr3=new Array(2,3);//等價於[2,3],裡面有兩個陣列元素是2和3
    

檢測是否為陣列

1.instanceof運算子,它可以用來檢測是否為陣列。

var arr = [];
console.log(arr instanceof Array);//arr是否屬於Array,如果屬於是陣列,返回true。

2.Array.isArray(引數); 用該方法檢測是否為陣列。//H5新增的方法

var arr = [];
console.log(Array.isArray(arr));

新增刪除陣列元素的方法

  1. push():在我們陣列的末尾,新增一個或者多個數組元素 push 推

    var arr=[1,2,3];
    arr.push(4,'Ludwig');
    
    • 作用:push()可以給陣列末尾追加新的元素
    • 引數:push()引數直接寫陣列元素就可以了
    • 返回值:push完畢後,返回的結果是新陣列的長度
      console.log(arr.push(4,‘Ludwig’));//返回值是5
  2. unshift:在我們的陣列開頭,新增一個或者多個數組元素

     var arr=[1,2,3];
     arr.unshift('red','blue');
    
    • 作用:usnhift()可以給陣列開頭追加新的元素
    • 引數:unshift()引數直接寫陣列元素就可以了
    • 返回值:unshift()完畢後,返回的結果是新陣列的長度
      console.log(arr.unshift(4,‘Ludwig’));//返回值是5
  3. pop():它可以刪除陣列的最後一個元素

    arr.pop();
    console.log(arr);//返回剩下的陣列
    console.log(arr.pop());//返回被刪掉的元素
    
    • 作用:pop()可以刪除陣列的最後一個元素,但一次只能刪一個
    • 引數:pop()沒有引數
    • 返回值:pop()完畢之後,返回的結果是刪除的那個元素
  4. shift():它可以刪除陣列的第一個元素

    arr.shift();
    console.log(arr);//返回剩下的陣列
    console.log(arr.shift());//返回被刪掉的元素
    
    • 作用:shift()可以刪除陣列的第一個元素,但一次只能刪一個
    • 引數:shift()沒有引數
    • 返回值:shift()完畢之後,返回的結果是刪除的那個元素

陣列排序

  1. reverse() 翻轉陣列

    var arr=['8','1','Ludwig'];
    arr.reverse();
    console.log(arr);
    console.log(arr.reverse());
    
  2. sort() 陣列排序(氣泡排序)

    var arr=[3,4,7,1];
    arr.sort();
    console.log(arr);
    

    Note:陣列元素只能是個位數
    如果是13,4,77,1,7。返回結果是1,13,4,7,77。錯誤。

    var arr=[13,4,77,17];
    arr.sort(function(){
      return a-b;//升序的順序排列
      //return b-a;//降序的順序排列
    });
    console.log(arr);
    

陣列索引方法

  1. indexOf():陣列中查詢給定元素的第一個索引。如果找不到,則返回-1。

    var arr=['red','green','blue','pink'];
    console.log(arr.indexOf('blue'));//返回值2
    
  2. lastIndexOf():陣列中的最後一個索引,從後往前找。找不到則返回-1。

案例陣列去重

1.目標:把舊數組裡面不重複的元素選取出來放到新陣列中,重複的元素只保留一個,放到新陣列中去。
2.核心演算法:遍歷舊陣列,然後拿著舊陣列元素去查詢新陣列,如果該元素在新數組裡面沒有出現過,就新增,否則不新增。
3.我們怎麼知道該元素沒有存在?利用新陣列.indexOf(陣列元素)
如果返回 -1 則說明新數組裡面沒有該元素。
4.封裝一個去重的函式unique 獨一無二的。

function unique(arr){
  var newArr = [];
  for(var i = 0;i < arr.length;i++){
    if(newArr.indexOf(arr[i]) === -1){
      newArr.push(arr[i]);
    }
  }
  return newArr;
}
var demo = unique(['c','a','z','a','x','a','x','c','b']);
console.log(demo);

陣列轉換為字串

  1. toString():把陣列轉換成字串,逗號分隔每一項。返回值是一個字串。

    var arr = [1,2,3];
    console.log(arr.toString());
    
  2. join(‘分隔符’):把陣列中的所有元素轉換為一個字串

    var arr = ['green','red','blue'];
    console.log(arr.join());//green,red,blue.如果沒有引數預設逗號分隔
    console.log(arr.join('-'));//green-red-blue.
    

陣列中的其他常用方法

  1. concat():陣列連線
    連線兩個或多個數組,不影響原陣列。
    返回值:返回一個新的陣列。

    var arr1 = ['a','b','c'];
    var arr2 = ['d','e','f'];
    var arr3 = arr1.concat(arr2);
    console.log(arr3);//["a", "b", "c", "d", "e", "f"]
    
  2. slice():陣列擷取

    var color=['red','blue','green','black','yellow'];
    console.log(color.slice(2));//["green", "black", "yellow"]前兩個截掉
    console.log(color.slice(2,4));//["green", "black"]
    //淺拷貝slice(begin,end),包括begin,不包括end。
    console.log(color.slice(1,5));//["blue", "green", "black", "yellow"]
    
  3. splice():刪除或替換陣列元素//此方法會改變原陣列

    var months = ['Jan', 'March', 'April', 'June'];
    months.splice(1, 0, 'Feb');
    // replaces 0 element at index 1,即inserts at index 1
    console.log(months);
    // expected output: Array ["Jan", "Feb", "March", "April", "June"]
    months.splice(4, 1, 'May');
    // replaces 1 element at index 4
    console.log(months);
    // expected output: Array ["Jan", "Feb", "March", "April", "May"]
    

字串物件

一個問題

var str = 'andy';
console.log(str.length);//4

物件,也就是複雜資料型別,才有屬性和方法,
簡單資料型別字串為什麼會有length屬性呢?

基本包裝型別

基本包裝型別:就是把簡單資料型別包裝成為了複雜資料型別。

  • 第一步:把簡單資料型別包裝為複雜資料型別
    var temp = new String('andy');
    
  • 第二步:把臨時變數的值給str
    str = temp;
    
  • 第三步:銷燬臨時變數
    temp = null;
    

這樣基本資料型別就有了屬性和方法。
為了方便操作基本資料型別JavaScript提供了三個特殊的引用型別:
StringNumberBoolean

字串的不可變

指的是裡面的值不可變,雖然看上去可以改變內容,但其實是地址變了,記憶體中開闢了一個新的記憶體空間。因此我們不要大量的拼接字串。

var str = '';
for (var i = 1;i <= 1000000000;i++){
  str += i;
}
console.log(str);//由於字串的不變性,在不停開闢新的記憶體空間,所以可能會卡死。

也因此,字串的所有方法,都不會修改字串本身(字串是不可變的),操作完成會返回一個新的字串。

根據字元返回位置

1. str.indexOf(‘要查詢的字元’,[起始的位置])//中括號表示可選項。

var str = '改革春風吹滿地,春天來了';
console.log(str.indexOf('春'));
console.log(str.indexOf('春',3));//從索引號是3的位置開始往後查詢

2. lastIndexOf()//從後往前查詢,只找到第一個匹配的。
案例查詢字串中某個字串中某個字元出現的位置及次數

var str = 'abcoefoxyozzopp';
var index = str.indexOf('o');
var num = 0;
while(index !== -1){
  console.log(index);
  num++;
  index = str.indexOf('0',index + 1);
}
console.log('o出現的次數是:'+num);

根據位置返回字元

  1. charAt(index):根據位置返回字元

    var str = 'andy';
    console.log(str.charAt(3));//y
    //遍歷所有字串所有的字元
    for (var i = 0;i < str.length;i++){
      console.log(str.charAt(i));
    }
    
  2. charCodeAt(index):返回指定位置處字元的ASCII碼值
    目的:判斷使用者按下了哪個鍵。

    console.log(str.charCodeAt(0));//97
    
  3. str[index]:獲取指定位置處字元//HTML5新增

    console.log(str[0]);//a
    

案例判斷一個字串中出現次數最多的字元,並統計其次數
一個鋪墊

//有一個物件
var obj = {
  age:18
}
if (obj['age']){//obj['age']相當於obj.age
//如果沒有該屬性返回的值就是undefined,在if中轉化為false
  console.log('裡面有該屬性');
}else{
  console.log('沒有該屬性');
}

案例分析
1.核心演算法:利用charAt()遍歷這個字串
2.把每個字元都儲存給物件,如果物件沒有該屬性就為1,如果存在了就+1
3.遍歷物件,得到最大值和該字元

var str = 'abcoefoxyozzopp';
var obj = {};
for(var i = 0;i < str.length;i++){
  var chars = str.charAt(i);//chars是字串的每一個字元
  if(obj[chars]){//obj[chars]得到的是屬性值,相當於上文的obj.age
    obj[chars]++;
  }else{
    obj[chars] = 1;
  }
}
console.log(obj);
//遍歷物件,用for...in
var max = 0;
var ch = '';
for(var k in obj){
  //k得到的是屬性名
  //o[k]得到的是屬性值
  if(o[k]>max){
    max = o[k];
    ch = k;
  }
}
console.log(max);
console.log('出現最多的字元是'+ch);

字串操作方法

  1. concat(str1,str2,str3…)
    concat()方法用於連線兩個或多個字串。拼接字串,等效於+,+更常用。

    var str = 'andy';
    console.log(str.concat('red'));//andyred
    
  2. substr(start,length)

    var str = '改革春風吹滿地';
    console.log(str.substr(2,2));//春風
    //第一個2是索引號的2,第二個2是擷取長度
    
  3. replace(‘被替換的字元’,‘替換為的字元’):替換字元

    var str = 'andyandy';
    console.log(str.replace('a','b'));//bndyandy
    

    Note:它只會替換第一個字元。

    案例把一個字串裡所有字元o全部替換為

    var str = 'abcoefoxyozzopp';
    while(str.indexOf('o') !== -1){
      str=str.replace('o','*');
    }
    console.log(str);//過濾文章敏感詞
    
  4. split(‘分隔符’) 字元轉換為陣列//join把陣列轉換為字串
    split裡的分隔符取決於字串裡是用什麼隔開的

    var str1 = 'red,pink,blue';
    console.log(str1.split(','));//["red", "pink", "blue"]
    var str2 = 'red&pink&blue';
    console.log(str2.split('&'));//["red", "pink", "blue"]
    console.log(str2.split('l')); //["red&pink&b", "ue"]
    
  5. toUpperCase():轉換大寫

  6. toLowerCase():轉換小寫

JS簡單型別與複雜型別(資料型別的總結)

簡單型別與複雜型別

簡單型別又叫做基本資料型別或者值型別
複雜型別又叫做引用型別

  • 值型別:簡單資料型別/基本資料型別,在儲存變數中儲存的是值本身,因此叫做值型別。string,number,boolean,undefined,null

    Note:簡單資料型別null很特殊,它返回的是一個空的物件object。
    因此,如果有個變數我們以後打算儲存為物件,暫時還沒想好放啥,這個時候就給null。

    var timer = null;
    console.log(typeof timer);//object
    
  • 引用型別:複雜資料型別,在儲存時變數中儲存的僅僅是地址(引用),因此叫做引用資料型別。可以通過new關鍵字建立物件(系統物件、自定義物件),如:Object、Array、Date等。

堆和棧

在計算機中,作業系統會將記憶體分為兩大類,
堆疊空間分配區別:

  1. (作業系統):簡單資料型別存放到棧裡面
    由作業系統自動分配釋放存放函式的引數值、區域性變數的值等。
    其操作方式類似於資料結構的棧;
  2. (作業系統):複雜資料型別存放到堆裡面
    一般由程式設計師分配釋放,儲存複雜資料型別(物件),
    若程式設計師不釋放,由垃圾回收機制回收。

Note:JavaScript中沒有堆疊的概念,通過堆疊的方式,可以更容易理解程式碼的一些執行方式,便於將來學習其他語言。

簡單型別與複雜型別的記憶體分配

  • 簡單資料型別
    • 值型別(簡單資料型別):string,number,boolean,undefined,null
    • 值型別變數的資料存放在變數(棧空間)中,在棧裡面,直接開闢一個空間,存放的是值。
  • 複雜資料型別
    • 引用型別(複雜資料型別):通過new關鍵字建立物件(系統物件、自定義物件),如:Object、Array、Date等。
    • 首先是在棧裡面存放地址,用十六進位制表示,然後這個地址指向堆裡面的資料。真正的物件例項存放到堆空間中。

簡單型別傳參

函式的形參也可以看作是一個變數,當我們把一個值型別變數作為引數傳給函式的形參時,其實是把變數在棧空間裡的值複製了一份給形參,形參在棧裡也開闢一個新的空間,那麼在方法內部堆形參做任何修改,都不會影響到外部變數。

複雜型別傳參

函式的形參也可以看作是一個變數,當我們把引用型別變數傳給形參時,其實時把變數在棧空間裡儲存的堆地址複製給了形參,形參和實參其實儲存的是同一個堆地址,所以操作的是同一個物件。

function Person(name){
  this.name=name;
}//這是一個建構函式
function f1(x){
  console.log(x.name);//2.劉德華
  x.name='張學友';
  console.log(x.name);//張學友
}
var p = new Person('劉德華');
console.log(p.name);//1.劉德華
f1(p);//x=p.x和p都是變數,p將自己的地址複製給x
console.log(p.name);//張學友

個人小結

今天完成了畢業設計的任務書,花了許多時間,晚上和舍友去學校北門外吃了烤魚,耽擱了一點時間,現在是1月16日的凌晨2點16分。慶幸JavaScript第一階段語法階段基本告一段落,也即將迎來JavaScript的第二階段Web APIs階段的學習。五天時間對我個人而言,這個學習強度還是挺大的,身體有些疲倦,知識有些遺忘,但還是堅持下來了。堅持每天一篇部落格,也看到了陌生人的鼓勵,對一個初學者來說,是莫大的鼓舞,還會繼續堅持還會繼續努力。學校裡已經沒有什麼人了,挺冷清,明天(就是今天16號)會全力完成開題報告的書寫,並且和女朋友約了哥老官火鍋,可能會停更一天。23分了,準備睡覺。