1. 一、对象概述<br />1.1 什么是对象<br />对象就是一组"键值对"(key-value)的集合,是一种无序的复合数据集合。<br />![图片.png](https://cdn.nlark.com/yuque/0/2021/png/12577337/1634113037474-56309be1-399a-4490-9467-024f7def217e.png#clientId=u73158b39-a877-4&from=paste&height=193&id=u7d278217&margin=%5Bobject%20Object%5D&name=%E5%9B%BE%E7%89%87.png&originHeight=234&originWidth=536&originalType=binary&ratio=1&size=66963&status=done&style=none&taskId=u2a0f59e6-1961-4a27-91b1-2ed90596643&width=442)<br />1、大括号:定义一个对象;<br />2、person:定义的对象被赋值给person,则person将指向这个对象;<br />3、name : 'henry':键值对(key : value),键值之间用 :隔开;<br />4、age : 18 :键值对(key : value);<br />5、一个对象中可以包含多个键值对,每个键值对之间用 , 隔开,最后一个键值对后可以加 , ,也可以不加。

    1.1.1 键名
    对象的键名基本都是字符串,键名加不加引号是一样的:
    图片.png
    1.1.2 方法
    对象的每一个键名又称为”属性”(property),它的”键值”可以是任何数据类型,当它是函数的时候,我们把这个属性称为”方法”,它可以像函数那样调用
    图片.png
    1.2 对象的创建
    除了上面提到的”字面量”方法,我们还可以通过构造函数创建新对象。
    1.2.1 使用构造函数创建对象,我们需要两步走
    1、创建一个构造函数,构造函数的名称常根据大驼峰命名法命名;
    2、通过new创建对象实例;
    其中,构造函数可以声明对象的名称、属性和方法
    大驼峰命名法:当变量名或函数名是由一个或多个单词连结在一起,而构成的唯一识别字时,所有单词的首字母均需大写。
    例子:
    图片.png
    注意,构造函数People中的this是函数运行时,在函数体内部自动生成的一个对象,只能在函数体内部使用。this就是函数运行时所在的环境对象。

    二、自定义对象的属性操作
    2.1 属性的读取
    javaScript 中有两种方法读取一个对象的属性:点运算符和方括号运算符。
    例子:
    图片.png
    这两种写法的效果是一样的,都能够读取对应属性的值,但是方括号运算符的方括号中可以是一个变量。
    图片.png
    我们已经知道,对象中属性的值可以是任何数据类型,那如果某个属性的值是对象,该怎么读取这个键值对象中的属性呢?
    我们还是用点运算符或者方括号运算符:
    图片.png
    像person.parents.papa 或 person[‘parents’][‘name’]这样的写法被称为”链式引用”
    2.2 属性的赋值
    属性的赋值和读取一样,可以通过点运算符和方括号运算符完成:
    图片.png
    2.3 属性的查看
    查看一个对象本身的所有属性,可以使用Object.keys方法:
    图片.png
    Object.keys(person)返回的是一个数组,这个数组由person对象的所有属性名构成。

    2.4 属性的删除和增加
    删除对象中某个属性,可以使用delete命令
    图片.png
    增加一个属性
    图片.png
    三、遍历对象属性
    在javaScript 中可以用for. . .in 或借助 Object.keys 来实现
    3.1 用for . . .in 遍历对象中的各个属性:
    图片.png
    3.2 借助 Object.keys 遍历属性
    Object.keys 方法返回的是一个由对象所有属性名组成的数组。
    图片.png
    四、对象的继承
    Object 是 JavaScript 提供的基本对象,JavaScript 的所有其他对象都继承 Object 对象,即那些对象都是Object 的实例。keys 是 Object 对象的一个静态方法。
    就是说,我们之前学习的”自定义对象”,其实就是继承自JavaScript 提供的 Object 对象的。
    除了用”字面量”和自定义的构造方法创建对象外,我们还可以用JavaScript 提供的构造函数 Object() 或者”继承”来创建对象。
    图片.png
    4.1 原型
    原型其实也是 JavaScript 中的一个对象。为什么要提出原型的概念,为了找对象继承的上一级对象
    o1继承自 Object,Object就是o1的原型
    o4继承自 o1,o1 就是 o4的原型。
    4.2 属性是否存在:in
    我们可以用in运算符来判断对象是否拥有某个属性
    图片.png
    toString 是 Object 对象的属性。person 继承自 Object 所以也有这个属性
    由于继承的存在,一个对象中的属性分成了两类:继承属性和自身属性
    之前的 Object.keys 方法返回的属性就包括了这两种属性

    4.3 自身属性是否存在:hasOwnProperty
    图片.png
    4.4 Object 与 JSON、Map 的区别
    4.4.1 JSON
    JSON 是一种轻量级的文本数据交换格式,它用 JavaScript 的语法书写,但独立于这种语言,可以认为这是编程语言间用于传递数据而约定的数据格式。

    4.4.2 JSON 格式和 JavaScript 对象的转换
    1、JSON.parse():JSON 格式 => JavaScript 对象
    // 一个 JSON 字符串
    const jsonStr = ‘{“sites”:[{“name”:”Runoob”, “url”:”www.runoob.com”}{“name”:”Google”, “url”:”www.google.com”},{“name”:”Taobao”, “url”:”www.taobao.com”}]}’;
    // 转成 JavaScript 对象
    const obj = JSON.parse(jsonStr);

    2、JSON.stringify():JavaScript 对象 => JSON 格式
    const jsonStr2 = JSON.stringify(obj);

    4.4.3 Map
    Map 和 Object,都可以保存键值对,但是他们仍有些重要的区别:
    1、一个Object 的键通常是字符串,但一个Map的键可以是任意值,包括函数、对象、基本类型,因此Map 会方便很多;
    2、Map 中的键值是有序的,而添加到对象中的键则不是
    3、Map 的键值对个数可以直接获取,Object 则要借助 Object.keys() 等计算得到。
    4、Map 可直接进行迭代,Object 则要借助 Object.keys()等;
    5、Map 不存在键名和原型键名冲突问题,可以直接覆盖,Object 则不行。
    从某种程度上来说,Map 比 Object更灵活方便,但是考虑到Map 不能直接转为 JSON 格式进行通讯,所以我们可以把Map 作为Object 的补充来使用。

    五、内置对象——Math、Storage
    5.1 Math 对象
    5.1.1 常量
    图片.png
    5.1.2 静态方法
    图片.png
    注意:以上方法除了 Math.random()都需要传入合适的参数,即需要处理的数字
    图片.png
    5.2 Storage 对象
    Storage 接口用于脚本在浏览器保存数据。两个对象部署了这个接口:window.sessionStorage 和window.localStorage
    图片.png
    我们主要看一下 Window.localStorage 的用法
    5.2.1 数据的存入:setItem
    window.localStorage.setItem(‘myLocalStorage’, ‘storage Value’);
    window.localStorage.setItem(‘key’, ‘value’) 方法接受两个参数
    1、key:键名
    2、value:键值
    两个参数都是字符串,不是字符串的参数会被转换成字符串后再存入浏览器。
    图片.png
    图片.png
    5.2.2 读取数据:getItem
    写法:window.localStorage.getItem(‘myLocalStorage’);
    window.localStorage.getItem(‘key’) 接受一个参数,即键名

    5.2.3 清除缓存:clear
    写法:window.localStorage.clear();
    这个方法可清除所有保存的数据

    六、内置对象——String
    JavaScript 原生提供的三个包装对象之一就是String(另外两个是Number、Boolean)。
    包装对象:原生对象可以把原始类型的值变成(包装成)对象。
    let v2 = new String(‘abc’);
    包装对象的最大目的:1、使得 JavaScript 的对象涵盖所有的值;2、使得原始类型的值可以方便地调用某些方法。

    6.1 字符串长度:length
    let len = ‘here is an apple’.length;

    6.2 查找字符:indexOf()
    从字符串中查找某个字符串是否存在:
    let str = ‘here is an apple’;
    const index = str.indexOf(‘an’);
    console.log(index);
    当str 中存在子字符串an 时,返回的值为an 中的a 所在的下标(下标从0开始计),即8。
    当str 中不存在子字符串an时,返回的值为-1.

    6.3 去掉两端空格:trim()
    图片.png
    图片.png
    6.4 截取字符串:substring/substr
    图片.png
    1、substring(start, end):start——要截取的字符串的开始下标 end——要截取的字符串的结束下标。
    2、substr(start, len):start——要截取的字符串的开始下标 len——要截取的字符串的长度。
    注意:substring 和 substr 的第二个参数不写的时候,会一直截取到字符串结束为止。它们和trim 一样都不会改变原字符串,而是返回处理后的字符串。

    6.5 分割字符串:split
    split 方法按照给定规则分割字符串,返回一个由分割出来的子字符串组成的数组。
    const splitedStr = ‘a|b|c’.split(‘|’);
    console.log(splitedStr);
    注意:split 也不会改变原字符串,而是返回一个由分割出来的子字符串组成的数组。

    6.6 小结
    图片.png
    七、内置对象——Array
    Array 是 JavaScript 的原生对象之一
    7.1 连接数组:join()
    join() 方法以指定参数作为分隔符,将所有数组成员连接为一个字符串返回。如果不提供参数,默认用逗号分隔:
    图片.png
    这个方法和字符串里的 split 方法正好是一对作用相反的方法:
    图片.png
    7.2 倒序排列:reverse()
    reverse 方法用于颠倒排列数组元素,返回改变后的数组。
    图片.png
    注意:该方法将改变原数组。
    这个方法对原本有序的数组用起来很方便,比如原来是按时间顺序排列,现在要倒序,直接使用reverse() 即可。

    7.3 排序:sort()
    sort 方法对数组成员进行排序,默认是按照字典顺序。如果想让sort 方法按照自定义方式排序,可以传入一个函数作为参数。
    图片.png
    这里我们传入了一个函数,这个函数有两个参数,即进行比较的两个数组成员,原数组中a排在b之前。
    这个函数有个返回值,当返回值大于0时,表示第一个成员应该排在第二个成员之后,否则排在第二个成员之前。

    7.4 遍历:map/forEach
    7.4.1 有返回值的遍历:map
    它接受一个函数,然后将数组的所有成员依次传入这个参数函数,最后把每一次的执行结果组成一个新数组返回:
    图片.png
    map 方法的参数函数可以有三个参数:elem, index, a。
    1、elem:表示依次传入的数组成员
    2、index:表示依次传入的新数组成员所对应的下标
    3、a:表示整个数组
    注意:map方法的返回值是一个由return 后的内容elem.name 组成的数组

    7.4.2 无返回值的遍历:forEach
    forEach 的用法和map 基本一致,不过forEach 没有返回值:
    图片.png
    注意,当你在 map 和 forEach 之前难以选择时,可以想一下你是否需要返回值,map 会返回操作后的数组,forEach 则没有返回值。

    7.5 小结
    图片.png
    八、内置对象——Date
    JavaScript 提供一个原生的时间库:Date 对象。
    它以国际标准时间(UTC)1970 年 1 月 1日 00:00:00 作为时间的零点。

    8.1 获取当前时间:new Date()
    我们可以把Date 作为一个构造函数,用new 命令生成一个时间对象的实例。在不加参数的情况下,返回的是当前时间:
    let now = new Date();
    console.log(now);

    如果给构造函数传入一些参数的话,就能够生成特定的时间对象了,这里可以传入数字、字符串、毫秒数:
    //传入表示“年 月日 时 分秒”的数字
    let dt1 = new Date(2020, 0, 6, 0, 0, 0);
    console.log(dt1);
    // 传入日期字符串
    let dt2 = new Date(“2020-1-6”);
    console.log(dt2);
    //传入距离国际标准时间的毫秒数
    let dt3 = new Date(15798392849);
    console.log(dt3);
    注意:传入表示”年月日时分秒”的数学时,1、如果只传入一个数字,会被认为传入的是毫秒数;2、月份的范围是0-11.而不是1-12。

    8.2 日期运算
    时间差:毫秒数
    两个时间对象是可以直接相减的,返回值为两者的毫秒数差:
    let dt1 = new Date(2020, 2, 1);
    let dt2 = new Date(2020, 3, 1);
    //求差值
    let diff = dt2 - dt1;
    let ms = 24 60 60 * 1000;
    console.log(diff / ms);

    早晚比较:大小于符号
    如果要比较两个时间的早晚,可以直接使用 > 或者 <;

    8.3 解析日期字符串:Date.parse()
    返回该时间距离时间零点(1970 年 1 月 1 日 00:00:00)的毫秒数
    let dt = Date.parse(“2020-1-6”);
    console.log(dt); // 15782400000000

    8.4 时间对象转时间字符串:to 方法
    to 方法有很多,我们来看其中的toJSON() 方法;
    let dt = new Date();
    let dtStr = dt.toJSON();
    console.log(dtStr); // 2020-01-03T09:44:18.220Z

    8.5 获取时间对象的年/月/日:get 方法
    let dt = new Date(); dt.getTime(); // 返回实例距离1970年1月1日00:00:00的毫秒数。
    dt.getDate(); // 返回实例对象对应每个月的几号(从1开始)。
    dt.getDay(); // 返回星期几,星期日为0,星期一为1,以此类推。
    dt.getFullYear(); // 返回四位的年份。
    dt.getMonth(); // 返回月份(0表示1月,11表示12月)。
    dt.getHours(); // 返回小时(0-23)。
    dt.getMilliseconds(); // 返回毫秒(0-999)。
    dt.getMinutes(); // 返回分钟(0-59)。
    dt.getSeconds(); // 返回秒(0-59)。
    图片.png
    8.5 设置时间对象的年/月/日:set方法
    let dt = new Date(); dt.setTime(ms); // 设置实例距离1970年1月1日00:00:00的毫秒数。 dt.setDate(date); // 设置实例对象对应每个月的几号(从1开始)。
    dt.setFullYear(year); // 设置四位的年份。
    dt.setMonth(month); // 设置月份(0表示1月,11表示12月)。
    dt.setHours(hour); // 设置小时(0-23)。
    dt.setMilliseconds(ms); // 设置毫秒(0-999)。
    dt.setMinutes(min); // 设置分钟(0-59)。
    dt.setSeconds(sec); // 设置秒(0-59)。

    set 方法没有setDay方法,因为星期几是计算得到的。

    8.6 小结

    图片.png