对象,JSON对象,Date对象,Math,Number,随机数


对象

概念

无序的数据集合,由若干个“键值对”(属性: 值)构成

        let obj = {
            name: 'Benson', //也可以这样写 "name": 'Benson'
            age: 5,
            sayHello: function () {
                console.log(`Hello ${this.name}`)
            }
        }

基本使用

        let obj = {
            name: 'RickeyGong',
            age: 5, 
            sayHello: function () {
                console.log(`Hello ${this.name}`)
            }
        }
        console.log("Test: "+ obj.name);
        console.log(obj["name"]);//这些写是不行的:obj[name]
        obj.sayHello();

        let key = 'age';
        console.log(obj[key]);//5
        console.log(obj.key);//undefined

        console.log(obj[key] === obj["age"]);//true

        obj.weight = "1Kg";//随时新增属性、修改属性

        for(let key in obj){
            //console.log(key);
            console.log(obj[key]);
        }

更多使用

let obj = {
    name: 'RickeyGong',
    age: 22,
    weight: '65Kg'
}       
//属性转数组
let test = Object.keys(obj);
test.forEach(key=>console.log(`${key}: ${obj[key]}`))

delete obj.age;//删除属性

JSON格式

是什么

一种用于数据交换的文本格式,在很多配置文件里能看到xxx.json

格式

  • 复合类型的值只能是数组或对象,不能是函数、正则表达式对象、日期对象
  • 简单类型的值只有四种:字符串、数值(必须以十进制表示)、布尔值和null(不能使用NaN, Infinity,-Infinity和undefined)
  • 字符串必须使用双引号表示,不能使用单引号
  • 对象的键名必须放在双引号里面
  • 数组或对象最后一个成员的后面,不能加逗号

范例

// 合法的 JSON格式
["one", "two", "three"];
{ "one": 1, "two": 2, "three": 3 };
{"names": ["张三", "李四"] };
[ { "name": "张三"}, {"name": "李四"} ];

// 非法的 JSON格式
{ name: "张三", 'age': 32 } // 属性名必须使用双引号
[32, 64, 128, 0xFFF] // 不能使用十六进制值
{ "name": "张三", "age": undefined } // 不能使用undefined

JSON.stringify

用于把一个值变成符合JSON格式的字符串

let obj = {a:1,b:2,c:3}
let str = JSON.stringify(obj);//'{"a":1,"b":2}'
let obj2 = JSON.parse(str);//{ a: 1, b: 2, c: 3 }

JSON.parse

用于把一个符合JSON格式的字符串还原对象

let obj = {a:1,b:2,c:3}
let str = JSON.stringify(obj);//'{"a":1,"b":2}'
let obj2 = JSON.parse(str);//{ a: 1, b: 2, c: 3 }

JS对象 VS JSON

JavaScript 对象的字面量写法只是长的像 JSON 格式数据,二者属于不同的范畴,JavaScript 对象中很多类型(函数、正则、Date) ,JSON 格式的规范并不支持,JavaScript对象的字面量写法更宽松

Date对象

几种时间表示方式

GMT

规定格林尼治标准时间的正午是在格林尼治上空最高点时间。由于地球每天的自转是不规则的,被原子钟报时的协调世界时(UTC)所取代

UTC

以原子时秒长为基础,接近GMT时间,但更精确

CST

北京时间,比世界协调时快八小时(即UTC+8)

常见用法

let d = new Date();
d.getTime();//返回实例对象距离1970年1月1日00:00:00对应的毫秒数
d.getDate;//返回实例对象对应每个月的几号(从1开始)
d.getDay();//返回星期,星期日为0,星期一为1,以此类推
d.getFullYear();//返回四位的年份
d.getMonth();//返回月份(0表示1月,11表示12月)
d.getHours();//返回小时(0~23)
d.getMilliseconds();//返回毫秒(0-999)
d.getMinutes();//返回分钟(0-59)
d.getSeconds();//返回秒(0-59)

let d2 = new Date();
d2.setDate(1);
d2.setFullYear(2020);

new Date();
let now = Date.now();
let date = new Date('2020-01-01 00:00:00');
let lastYear = new Date(Date.now());

案例1 获取一段代码的运行时间

    let start = Date.now();
    fib(34);
    let end = Date.now();
    console.log(`耗时${end - start}ms`);

    function getRuntime(handler) {
        let start = Date.now()
        handler()
        return Date.now() - start
    }

    getRuntime(() => { fib(40) });

    function fib(n) {
        if (n === 1 || n === 2) return 1
        return fib(n - 1) + fib(n - 2)
    }

案例2 距离国庆节还剩X天X时X分X秒

            function getLeftTime() {
                let targetDateTime = new Date('2020-10-01 00:00:00').getTime();
                let nowDateTime = Date.now();//当前时间

                let timeBetween = Math.abs(nowDateTime - targetDateTime);// 当前时间 - 国庆时间 绝对值

                //天
                let day = Math.floor(timeBetween / (24 * 60 * 60 * 1000));//取整,算毫秒。1秒 = 1000毫秒

                //小时
                let left = timeBetween%(24*60*60*1000);//1小时对应的毫秒数
                let hours = Math.floor(left/(60*60*1000));

                //分
                left = left%(3600*1000);
                let minute = Math.floor(left/(60*1000));

                //秒
                left = left%(60*1000);
                let second = Math.floor(left/1000);

                return {day , hours , minute , second};
            }

                let obj = getLeftTime();
                console.log(`距离国庆还有${obj.day}天${obj.hours}时${obj.minute}分
${obj.second}秒`)

案例3 格式化旧日期

刚刚,3分钟前,2小时前,10天前

    function formatTime(dateStr){
        let between = parseInt(((Date.now())-new Date(dateStr).getTime())/1000);
        if(between < 60){
            return `刚刚`;
        }else if(between < 3600){
            return `${parseInt(between / 60)}分钟前`
        }else if(between < 3600 * 24){
            return `${parseInt(between / 3600)}小时前`
        }else{
            return `${parseInt(between / (3600 * 24))}天前`
        }
    }
    console.log(formatTime('2020-8-27 00:00:00'));

Math

常见用法

    //向下取整
    console.log(Math.floor(3.15));//3
    console.log(Math.floor(3.75));//3
    console.log(Math.floor(-3.15));//-4
    //向上取整
    console.log(Math.ceil(3.15));//4
    console.log(Math.ceil(3.75));//4
    console.log(Math.ceil(-3.15));//-3
    //四舍五入
    console.log(Math.round(3.15));//3
    console.log(Math.round(3.75));//4
    //绝对值
    console.log(Math.abs(6-9));//3

    //最大最小值
    console.log(Math.max(1,2,3,4,5,100,120,133));//133
    console.log(Math.min(-8,5,9,30,6,0));//-8

    //写一个函数算出数据中的最大最小值
    const max = arr=>Math.max(...arr);
    const min = arr=>Math.min(...arr);
    let a = max([100,200,300,250]);
    let b = min([1,-3,4,5]);
    console.log(a);//300
    console.log(b);//-3

    //写一个函数算出数据中的最大最小值
    const max = arr=>Math.max(...arr);
    const min = arr=>Math.min(...arr);
    let a = max([100,200,300,250]);
    let b = min([1,-3,4,5]);
    console.log(a);//300
    console.log(b);//-3

    //随机数
    // Math.random() Return:[0,1)之间的一个伪随机数
    console.log(Math.random());

    //返回[0,100)的随机数
    const randNumber = ()=>Math.floor(Math.random()*100);
    console.log(randNumber());

    //返回长度为n的随机数字符,包含a-z,0-9
    function randStr(len){
        const dict = `qwertyuioplkjhgfdsazxcvbnm0123456789`;
        let res = ``;
        for(let i=0;i