JS中的Math物件,陣列,和Date物件

weixin_34214500發表於2017-08-15

Math

Math物件是JS內建物件,提供了一些靜態的數學屬性和數學方法,使用時不用例項化。

  • 屬性:
    Math.E
    Math.LN2
    Math.LN10
    Math.LOG2E
    Math.LOG10E
    Math.PI
    Math.SQRT1_2
    Math.SQRT2
  • 方法:
  1. 四捨五入 round
    Math.round(0.1); //0
    Math.round(0.5); //1

對於 負值的運算結果不同,體現在對於.5的處理

    Math.round(-1.1);//-1
    Math.round(-1.5); //-1
  1. 絕對值abs,最大引數max,最小引數min
    abs方法返回引數值的絕對值
    Math.abs(1)//1
    Math.abs(-1) //1

max方法返回最大的引數,min方法返回最小的引數

    Math.max(1,2,3); //3
    Math.min(1,2,3); //1
  1. floor,ceil
    分別返回小於或者大於引數值的最大(小)整數
    Math.floor(3.999); //3
    Math.floor(-3.999); //-4

    Math.ceil(3.999); //4
    Math.ceil(-3.999); //-3
  1. pow,sqrt
    pow返回一個引數為底數,第二個引數為冪的指數值
    sqrt方法返回引數的平方根,如果引數為負值,返回NaN
    Math.pow(2,2); // 4
    Math.pow(2,3); // 8
    
    Math.sqrt(4); //2
    Math.sqrt(-4); //NaN
  1. random
    random方法返回0-1之間的一個偽隨機數,可能等於0,但是一定小於1
    通過組合使用random方法和floor或者ceil方法可以得到指定範圍內的隨機整數,示例:
    // 返回一個大於等於a,小於b之間的隨機整數
    function random(a,b) {
        return a + Math.floor(Math.random() * (b-a));
    }

利用定義得到的random()函式,可以實現輸出一些指定格式的結果:

    // 返回一個大於等於a,小於b之間的隨機整數
    function random(a,b) {
        return a + Math.floor(Math.random() * (b-a));
    }

    // 得到一個隨機的字串
    function randomStr(len) { //len為隨機字串的長度
        var dict = '0123456789abcdefgihijklmnopqrstuvwxyz'; // 建立一個字串,所有可能的字元取值
        var str = ''; // 要輸出的隨機字串
        for (var i = 0; i < len; i ++) {
            str += dict[random(0,dict.length)];
            // 利用上面定義的random函式,生成0到dict字串的長度的隨機整數,作為下標,對應的字元即為輸出的字元,賦給str
        }
        return str;
    }
    var str = randomStr(8);//指定8位的字串
    console.log(str);

    //得到一個隨機的IP地址 0.0.0.0 ~ 255.255.255.255
    function randomIP () {
        //同樣要利用定義好的random()
        var arr = [];
        for (var i = 0; i < 4; i ++) { //IP 4位,迴圈4次
            arr.push(random(0,256)); // 寫成255就不包括255了
        }
        return arr.join('.'); //返回.隔開的字串
    }
    var IP = randomIP();
    console.log(IP);

陣列

  • 陣列的建立的多種方式
    var arr = new Array();
    使用建構函式建立空陣列,一般不使用,而是用字面量建立陣列:
    var arr = [];
    在使用字面量建立陣列的時候:
    無論傳入幾個引數,都會把引數當做初始化內容而不是長度,例如var arr = [5];即建立的新陣列只有1項,為5。
    var arr = [5];
    console.log(arr.length); //1
    var arr2 = [5,6];
    console.log(arr2.length) //2

但是需要注意的是,進行陣列建立的時候,不要帶多餘的“,” 因為不同的瀏覽器解析結果不一致。例如:

    var arr = [1,2,3,]; //有多餘的,
    console.log(arr.length); // 現代瀏覽器上結果為3,但是在低版本的IE上是長度為4的陣列,最後一項為undefined
  • 陣列的索引
    陣列的值可以通過下標來進行訪問,下標可以是自然數也可以是變數或者表示式,例如:
    var arr =[1,2,3,4];
    console.log(arr[0]); //1
    var i =1;
    console.log(arr[i]);//2
    console.log(arr[++i]);//3

陣列也是物件,是一個特殊的物件,key為數值的物件。

  • 陣列的基本操作
    var a = [1,2,3];
    a[3] = 4; // 增加新元素
    console.log(a); //[1,2,3,4]
    //使用delete刪除陣列元素
    delete a[2];
    console.log(a[2]); //undefined  跟給a[2]賦值undefined相似,陣列長度不會改變,也不會影響其他資料。
    console.log(a.length); //4 陣列長度不會改變
  • 棧方法pop()和push()
    var arr = [3,4,5];
    arr.push(100); //push裡面傳參
    console.log(arr); //3,4,5,100
    arr.pop(); //pop不需要傳參
    console.log(arr); //3,4,5
  • 佇列方法 shift()和unshift()
    var arr =[1,2,3];
    arr.unshift(4);
    console.log(arr); //[4,1,2,3]
    arr.shift();
    console.log(arr);//[1,2,3]
  • 終極神器splice()
    splice方法可以一次性解決陣列新增,刪除。傳入三個引數
    第一個引數為開始的位置, 第二個引數為想要刪除的長度,第三個引數為想要新增的專案,也可以寫多個:
    var arr = [3,5,8,10];
    arr.splice(2,1);  // 刪除第2個元素
    console.log(arr); //[3,5,10]
    var arr1 = [3,5,8,10];
    arr1.splice(1,1,7,8,9); //在第2位開始,刪除1項,然後增加7,8,9三項
    console.log(arr1);//[3, 7, 8, 9, 8, 10]
    var arr2 = [3,5,8,10];
    arr2.splice(3,0,9); // 在第3項位置刪除0項,即不刪除,然後插入9的一項
    console.log(arr2);//[3, 5, 8, 9, 10]
  • join方法
    將陣列連線成字串,可以選擇使用什麼字元隔開每一項
    var arr = [1,2,3,4,5,6];
    //轉化為字串
    var str1 = arr.join('|');
    console.log(str1); //1|2|3|4|5|6
    var str2 = arr.join(''); 
    console.log(str2); // 123456

陣列跟字串使用join("")和split("")可以互相轉換,使用對方的方法

  • concat() 連線陣列,會生成一個新陣列,不會影響原陣列
    var a = [1,2,3];
    var b = [4,5];
    console.log(a.concat(b)); //[1, 2, 3, 4, 5]
    console.log(a); // [1, 2, 3] 原陣列不受影響
    console.log(b); //[4, 5]
  • reverse()方法用於將陣列逆序,會修改原陣列
   var arr = [1,2,3,4,5];
   arr.reverse();
   console.log(arr); //  [5, 4, 3, 2, 1] 會修改原陣列
  • sort()
    sort方法在沒有引數的時候,會按照字母表升序排序,有undefined放到最後,對於物件呼叫toString方法。
    一般需要自定義一個排序方式,傳入一個比較函式作為sort方法的引數,sort也會改變原陣列。
    // 採用預設排序法時出現的問題
    var arr = [7,8,9,10,11];
    arr.sort();
    console.log(arr); //[10, 11, 7, 8, 9] 並沒有按照意料中的方式排序
    // 所以需要定義一個自定義的函式,作為sort方法的引數進行排序
    var arr2 = [-4,1,18,22,3,9];
    function compare (a,b) {
        return a - b; //根據a-b的正負來排序
    }
    arr2.sort(compare);
    console.log(arr2);//[-4, 1, 3, 9, 18, 22]  寫成b-a會降序
    //針對物件的屬性的數值進行排序
    var student = [
        {
            name: 'a',
            age: 10
        },
        {
            name: 'c',
            age: 30
        },
        {
            name: 'b',
            age: 20
        },
    ];
    student.sort(function(stu1,stu2) {
        return stu1.age - stu2.age;
    })
    console.log(student); //{name: "a", age: 10} {name: "b", age: 20} {name: "c", age: 30} 按照物件的age屬性排序

ES5 陣列擴充套件了一些功能

  • Array.isArray(obj)
    Array物件的一個靜態函式,判斷一個物件是不是陣列
    var a = [123];
    var b = new Date();
    console.log(Array.isArray(a)); //true
    console.log(Array.isArray(b)); //false
  • .indexOf(element)/.lastIndexOf(element)
    用於查詢陣列內指定的元素的位置,沒找到返回-1,找到返回下標
  • .forEach(element,index,array)
    遍歷一個陣列,引數為一個回撥函式,回撥函式有三個引數
    1,當前元素 2,當前元素索引值 3,整個陣列
    var arr = [1,2,3,4,5,6];
    arr.forEach(function (e,i,array) {
        array[i] = e + 1; //每項都加1
    });
    console.log(arr);//[2, 3, 4, 5, 6, 7]
    //forEach代替了通常用for迴圈遍歷陣列
  • every(function (element,index,array))/some(function (element,index,array))
    every和some類似於一種邏輯判定,回撥函式返回一個布林值
    every是所有函式的每個回撥函式都返回true的時候才返回true,有false的時候就終止執行,返回false
    some是存在著有一個回撥函式返回true時就終止執行返回true,否則返回false
    對於空陣列,every返回true,some返回false
    var arr = [1,2,3,-2,3];
    // 判斷陣列中每一項是否都為正值
    var resultEvery = arr.every(function (value) { // 只判斷是不是整數,所以引數只用到value,寫一個value就好
        return value > 0;
    });
    console.log(resultEvery);  //false
    // 判斷陣列中每一項是否存在正值
    var resultSome = arr.some(function (value){
        return  value > 0;
    });
    console.log(resultSome);  //true
  • map(function(element))
    和forEach類似,遍歷陣列,回撥函式返回值組成一個新陣列返回,新陣列索引和原陣列一致,原陣列不變
    var arr = [1,2,3,4,5];
    var arr2 = arr.map(function (element) { //遍歷陣列,返回一個新陣列,每項是原陣列的平方
        return  Math.pow(element,2);
    })
    console.log(arr); //[1, 2, 3, 4, 5]  原陣列不發生改變
    console.log(arr2); //[1, 4, 9, 16, 25]

    //上述需求也可以利用forEach實現 為:
    var arr3 = [];
    arr.forEach(function (e,i,array) {
        arr3.push(Math.pow(e,2)); // 利用forEach來達到同樣的效果,要提前建立一個新陣列,將得到的平方值依次push進去
    })
    console.log(arr3); // [1, 4, 9, 16, 25]
    console.log(arr); //[1, 2, 3, 4, 5]
  • filter(function(element)) 過濾
    返回陣列的一個子集,回撥函式用於邏輯判斷是否返回,返回true則把當前元素加到返回陣列中,false則不加
    新陣列只包含返回true的值,索引缺失的不包括,原陣列保持不變
    var arr = [1,2,3,4,5];
    console.log(arr.filter(function (e) {
        return e % 2 == 0; //返回偶數
    })); //[2, 4]
    console.log(arr); // [1, 2, 3, 4, 5] 原陣列不變


    //針對物件進行過濾
    var student = [
        {
            username: 'aa',
            age: 20,
        },
        {
            username: 'bb',
            age: 30,
        },
        {
            username: 'ac',
            age: 25,
        },
    ];
    //要過濾出student中username包含a字元的項
    var result = student.filter(function (e) {
       return e.username.indexOf('a') > -1; //使用indexOf可以判斷是否包含a字元
    });
    console.log(result);// {username: "aa", age: 20} {username: "ac", age: 25}
  • reduce(function(v1,v2),value)/.reduceRight(function(v1,v2),value)
    遍歷陣列,呼叫回撥函式,將陣列元素組合成一個值,reduce從索引最小值開始,reduceRight反向,方法有2個引數, 1,回撥函式,把兩個值合為一個,返回結果 2,value,一個初始值,可選
    var arr = [1,2,3,4,5];
    var arr1 = arr.reduce(function(v1,v2) {
        console.log('本次v1為:'+v1 ,'本次v2為:' + v2);
        return  v1  + v2;
    });
    console.log(arr1); //15

Date

Date物件是JS提供的日期和時間的操作介面
Date物件有幾個靜態方法

  • Date.now()
    now方法返回當前距離 1970年1月1日00:00:00的毫秒數
    Date.now();//1502771978564
  • Date.parse()
    解析字串,返回距離 1970年1月1日00:00:00的毫秒數,解析失敗返回NaN
    console.log(Date.parse('2017-1-1')); //1483200000000
  • Date.UTC()
    預設返回當前時區的時間,接收年月日等變數作為引數,返回距離 1970年1月1日00:00:00的毫秒數
    Date.UTC(2015,0,1,2,3,4,567);//1420077784567
  • Date()
    Date函式可以直接呼叫,返回當前時間
  • get
    var d = new Date();
    console.log(d.getTime()); //返回距離1970年1月1日00:00:00的毫秒數
    console.log(d.getDate());//返回例項物件對應每個月的幾號(從1開始)
    console.log(d.getDay());//周幾,週日為0,週一為1
    console.log(d.getFullYear());//返回四位數的年份
    console.log(d.getMonth());//月份,0為1月
    console.log(d.getHours());//小時 0-23
    console.log(d.getMilliseconds());//毫秒 0-999
    console.log(d.getMinutes());//分鐘 0-59
    console.log(d.getSeconds());//秒 0-59
    console.log(d.getTimezoneOffset());//時區差異

另外get還有對應的set方法

  • Date物件的應用距離
    // 寫一個函式getChIntv, 獲取從當前時間到指定日期的間隔時間

    function getChIntv(dateStr) {
        var targetDate = new Date(dateStr);// 傳入目標引數,建立目標時間的date物件
        var currentDate = new Date();//表示現在時間
        var interval = targetDate - currentDate; // 可以直接相減,預設呼叫valueOf函式生成毫秒數
        if (interval > 0) {
            //生成的interval為毫秒數,我們轉換為秒數並且取整
            var totalSeconds = Math.floor(interval/1000); //換算成秒數並且取整的值
            var seconds = totalSeconds%60; //得到餘下來的秒數,為我們最終顯示的秒數,前面的可以整除的換算為分鐘小時和天

            var totalMinutes = Math.floor(totalSeconds/60); //為總共的分鐘數 這裡用Math.floor取整
            var minutes = (totalMinutes%60); //同樣,可以整除的去換算為小時和天數,餘下來的分鐘用於最終顯示,

            var totalHours = Math.floor(totalMinutes/60); //總共的小時數 這裡用Math.floor取整
            var hours = (totalHours%24); //餘下來的小時數作為最終顯示,可以整除的去換算成天數

            var totalDays = Math.floor(totalHours/24); //總共的天數,不用換算成年了,所以直接換算成天數就好
            console.log('距離目標日期還有:'+ totalDays + '天' + hours + '小時' + minutes + '分鐘' + seconds + '秒');
        }
        else {
            console.log('目標日期已經過了');
        }
    }
    getChIntv('2017-1-1');

相關文章