高程第8章,和reduce详解

376 阅读4分钟

Day 8

对象,类和面向对象编程

  • 理解对象:

    • 创建自定义对象的方式:
      • 创建一个Object的一个新的实例,然后给他添加属性方法,
      • 通过字面量的形式
  • 属性的额类型:

    • 数据属性:包含一个保存数据值的位置 ,值会从这个位子读取,也会写入到这个位置

      • [[Configurable]] :表示属性是否可以通过 delete 删除并重新定义,是否可以修改它的特性,以及是否可以把 它改为访问器属性。默认情况下都是'true'

      • [[Enumberable]] :表示属性是否可以通过 for-in 循 环返回。默认情况下,所有直接定义在对象上的属性的这个特性都是 true ,

      • [[Writable]] :表示属性的值是否可以被修改。默认情 况下,所有直接定义在对象上的属性的这个特性都是 true

      • [[Value]] :包含属性实际的值。这就是前面提到的那个读取和写入属性值的位置。这个特性的默认值为undefined 。

    总结: 4种属性分别是:是否可被删除,是否可被循环,是否可被修改,实际值位置,

    • 例子1:

      let person = {}; 
      Object.defineProperty(person, "name", {
          configurable: false,
          value: "Nicholas" 
      }); 
      console.log(person.name); // "Nicholas"
      delete person.name;
      console.log(person.name); // "Nicholas"
      

      要修改对象的默认特性,就要使用Object.defineProperty() 方法,这个方法接受三个参数,对象,对象的属性,对象属性的数据属性,像上例,对象属性name的数据属性中的删除属性被禁用,所以删除操作无法进行

    • 访问器属性:访问器属性不包含数据值。相反,它们包含一个获取(getter)函 数和一个设置(setter)函数

对象解构

  • 例子1:

    // 不使用对象解构
    let person = { name: 'Matt', age: 27 };
    let personName = person.name, 
    personAge = person.age; 
    console.log(personName); // Matt 
    console.log(personAge); // 27
    // 使用对象解构
    let person = { name: 'Matt', age: 27 };
    let { name: personName, age: personAge } = person;
    console.log(personName); // Matt
    console.log(personAge); // 27
    

    属性名称一定要一 一对应,不对应的属性名称,会被解构成undefined

  • 部分解构,如果涉及多个属性的解构赋值,开始的赋值成功,后面的赋值出错,则整个解构只会完成一部分,未完成的部分会成为undefined,

  • 对象的迭代

    • 简单说就是循环对象,在JavaScript有史以来的大部分时间内,迭代对象属性都是一个难

      题,Object.values() 和 Object.entries() 接收一个对象,返回 它们内容的数组

  • Object.values() 返回对象值的数组,

    • Object.entries() 返回键/值对的数组

      const o = { foo: 'bar', baz: 1, qux: {} };
      console.log(Object.values(o));
      // ["bar", 1, {}] 
      console.log(Object.entries((o))); 
      // [["foo", "bar"], ["baz", 1], ["qux", {}]]
      
  • 继承和组合继承,里面涉及到原型链和构造器,单独分一章讲

  • 实例,原型和类成员:

reduce

  • reduce()方法接受一个函数作伪累加器,为数组中的每一个元素一次执行回调函数,接受4个参数:初始值,当前元素值,当前索引,原数组

    • previousValue (上一次调用回调返回的值,或者是提供的初始值(initialValue))

    • currentValue (数组中当前被处理的元素)

    • index (当前元素在数组中的索引)

    • array (调用的数组) initialValue (作为第一次调用 callback 的第一个参数)。

      例子1:累加

      let arr = [3,9,4,3,6,0,9]
      let sum = arr.reduce((pre, item) => {
          //pre是上一次调用的返回值,第一次就是你定义的初始值,item是当前循环到的这一项,
          console.log(pre)//0,3,11
          return pre + item
      }, 0)//初始值0
      console.log(sum) // 34
      

      例子2:求最大值

      var max = arr.reduce((prev, cur) => {
          return Math.max(prev,cur);
      });
      

      小结:等于就是利用reduce特性,能拿到上一次的结果,和这一次的结果,直接比较

      例子3:实现多维度,对象的数据叠加

      const scores = [
          { subject: 'math', score: 88 },
          { subject: 'chinese', score: 95 },
          { subject: 'english', score: 80 }
      ];
      const dis = {
          math: 0.5,
          chinese: 0.3,
          english: 0.2
      }
      const sum = scores.reduce((pre,item) => {
          console.log(item.subject)  //math,chinese,english
          console.log(dis[item.subject])//0.5,0.3,0.2
          return pre + item.score * dis[item.subject]
      },0)
      console.log(sum) // 88.5
      

      例子4:计算每个元素出现的次数

      let names = ['Alice', 'Bob', 'Tiff', 'Bruce', 'Alice'];
      
      let nameNum = names.reduce((pre,cur)=>{
        if(cur in pre){
          pre[cur]++
        }else{
          pre[cur] = 1 //这里等于是pre[Alice = 1]
        }
        return pre
      },{})
      console.log(nameNum); //{Alice: 2, Bob: 1, Tiff: 1, Bruce: 1}
      

本文使用 mdnice 排版