111-ES5特性

31 阅读4分钟

目录

  • 递归
  • 面向对象
  • 克隆

一、递归

1.1 基础

  • 概念:递归本身是函数的一种编程技巧,函数调用自己。

  • 作用:

    • 解决部分的循环相关的问题,代码量更少
    • 提供一种新的编程逻辑问题的思路
  • 语法

function 函数名(){
    函数名();//递归
}
函数名();
  • 使用递归条件

    • 要解决的问题是带有循环特性的,会重复触发。
    • 要有明确递归结束的边界
let i =1;
function demo2(){
    console.log(i);
    if(i<100){//边界,不满足则退出递归
        i++;
        demo2();    
    }
}
demo2();
  • 递归要使用的数据作为参数传递进去

1.2 递归使用流程

  • 1.判断题目是否带有一定的规律
  • 2.是否有明确的边界。比如一定次数,从某个数到1结束
  • 3.满足前两个条件后就可以将规律用函数递归的方式来实现出来。

1.3 递归应用

  • 兔子问题
时间/日期第一个月第二个月第三个月第四个月第5个月第6个月
等于或超过三个月大的兔子001123
二个月大的兔子010112
一个月大的兔子101123
总数112358
  • 鸡哥问题
时间/日期7个村子后第7个村子时第6个第5个第4个第3个第2个第1个
剩余数量14102246
  • 规律:第n天和第n-1天的数量关系, f(n-1) =( f(n)+1)*2

二、Object

  • 前提:所有的对象都有一些通用的api可以使用。这些api都是由Object类来提供的。

2.1 object 简介

  • Object是JavaScript所有对象的祖先,可以理解为一个特殊 的数据结构(类),内部含有所有对象共用的api,方便开发者进行使用

2.2 常用api(第一部分)

名称说明
Object.create生成一个对象,可以指定祖先对象,可以设为null,表示没有组件。如果为null,那么Object所提供的通用api也不能用。api了解
Object.assign完成多个对象的合并,可以将一个对象的属性复制到另一个对象中。
Object.defineProperty修改或新增某个对象的指定属性,并可以设置该属性的读写特性

2.2.1 Object.create

  • 作用:用于创建一个新的对象。

  • 语法

    let obj = Object.create(null);
    
  • 区别

    • 通过object.create生成的对象可能不能使用通用api
    • 常规{}对象可以使用通用 api
  • 目前可以新增对象的方式

    • Object.crreate
    • {}
    • new Object()

2.2.2 Object.assign:合并对象,也可以用于复制

  • 作用:合并或复制对象

  • 语法

    Object.assign(target,source);
    1. 复制
    let obj = {name:"张三"};
    let newObj = {};
    Object.assign(newObj,obj);//将obj里的属性复制到obj中
    
    • target:目标对象,即要合并或复制的对象
    • source:源对象。用于合并或复制属性到target的对象,

2.2.3 Object.defineProperty

  • 目的:用于修改或新增某个对象的一个属性,并能够设置改属性是否可读写。即更细节的控制属性。

  • 语法

    Object.defineProperty(要操作的对象,"属性名",{
        value:'属性值',
        writable:true,//可写
    })
    

2.3 浅克隆和深克隆(浅拷贝和深拷贝)

  • 前提:目前 的对象复制只能复制基本类型的数据,而对象里的引用类型数据则不能直接复制。而将根据不同数据类型 的复制分为浅克隆和深克隆。

2.3.1 浅克隆

  • 概念:浅克隆是指复制一个对象,但只复制了源对象的基本类型的数据,而引用类型数据并没有复制,只是拷贝了数据的内存地址,并没有复制引用类型数据本身。

  • 实现 方式

    • 扩展运算符
    • Object.assign
  • 例子代码:

    let obj ={
        name:"cxk",
        age:23,
        habbits:['rap','ball','dance']
    };
    //完成对象的复制
    // let newObj ={...obj};
    let newObj = Object.assign({},obj);
    //修改obj的属性进行测试
    obj.name="鸡哥";
    obj.habbits.push("jump")
    console.log(newObj);
    

2.3.2 深克隆

  • 概念:针对一个引用类型数据的完全复制,包括对象里面的所有基本类型数据以及引用类型数据的复制。

  • 方式

    • 第一种:使用JSON.parse和JSON.stringify
    • 第二种:递归
  • 第一种

  • 第二种:递归

    • 对源数据进行forin遍历,如果遍历属性 的值是基本类型数据,则直接将同名属性以及数据赋值给新对象中。如果源对象某个属性是引用类型数据,那么就利用递归对该引用类型数据进行forin遍历处理。
    let obj ={
        name:"cxk",
        age:23,
        habbits:['rap','ball','dance'],
        address:{
            city:'南京',
            area:'江宁区'
        }
    };
    function copyObject(newObj,source){
        for (const key in source) {
            if(Array.isArray(source[key])){
                //要复制的是一个数组
                newObj[key]=[...source[key]];
            }else if(typeof source[key] =="object"){
                //属性值是对象类型
                newObj[key]={};
                copyObject(newObj[key],obj[key]);
            }else{
                //基本类型数据,直接复制
                newObj[key] = source[key]
            }
        }
    }
    let newObj = {};//新对象
    copyObject(newObj,obj);
    console.log(newObj);