JS中的Math对象,数组,和Date对象

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');
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 202,056评论 5 474
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 84,842评论 2 378
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 148,938评论 0 335
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,296评论 1 272
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,292评论 5 363
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,413评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,824评论 3 393
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,493评论 0 256
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,686评论 1 295
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,502评论 2 318
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,553评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,281评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,820评论 3 305
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,873评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,109评论 1 258
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,699评论 2 348
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,257评论 2 341

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 10,843评论 6 13
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 作者:鱼笑川 时间:20170511 兄弟 前夜长眠身未起 今晨须臾魂飞去 兄弟 同岁同属同班级 无声无息无踪迹 ...
    鱼笑川阅读 187评论 0 3
  • 近期被各种虐童事件冲击三观,是你的善良所想象不到的黑暗。 1、为何会一次次出现类似事件?跟个别人的素质有关,更跟体...
    石榴lady阅读 225评论 0 0