前端基础学习

面向对象02(计算属性和assign,遍历操作与dom绘制,深拷

2020-04-27  本文已影响0人  小雪洁
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>11计算属性与assign使用</title>
    </head>
    <body>
    </body>
    <script>
        let user={}
        let name='title';
        user[name]="后盾人";
        console.log(user);
        //对象属性是通过计算动态组合成的
        let id=0;
        let hd={};
        hd[`id-${++id}`]=id;
        hd[`id-${++id}`]=id;
        hd[`id-${++id}`]=id;
        hd[`id-${++id}`]=id;
        console.log(hd);
        let lesson=[
            {name:"css",score:80},
            {name:'js', score:85},
            {name:'html',score:90}
        ];
//把lesson数组组成对象,每个元素取该元素的name的值为键名
        let obj={};
        let l=lesson.map((item,index,arr)=>{
            obj[item.name]=item;
        });
        console.log(obj);
        //console.log(JSON.stringify(obj,null,2));
//Object.assign()合并多个对象成为一个对象
    let hxj=Object.assign({name:'hxj'},{age:30});
    console.log(hxj);//{name: "hxj", age: 30}
//之前学习了使用展开语法合并参数
    function upload(params){
        let config={
            type:"*.jpg,*png",
            size:10000
        };
        //重点在这里,使用展开语法把接收到的参数和默认参数合并一下,后者放接收到的参数
        //config={...config,...params};
        //也可以使用Object.assign()来合并参数
        Object.assign(config,params);
        console.log(config);
    }
    upload()//{type: "*.jpg,*png", size: 10000}
    upload({size:99});//{type: "*.jpg,*png", size: 99}

    
    </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>遍历操作与dom绘制</title>
    </head>
    <body>
    </body>
    <script>
//遍历操作
        let user={
            name:'hxj',
            age:30
        };
        let arr=[{name:'hxj',age:30}];
        //获取对象所有属性,返回一个属性的数组
        console.log(Object.keys(user));//["name", "age"]
        //获取对象所有属性对应的值,返回一个值的数组
        console.log(Object.values(user));// ["hxj", 30]
        //获取对象所有键值对,返回一个键值对数组
        console.log(Object.entries(user));
        console.log(JSON.stringify(Object.entries(user),null,2));
        //循环for-in遍历对象属性
        for(const key in user){
            console.log(key);//对象属性
            console.log(user[key]);//属性对应的值
        }
        //循环for-of是遍历迭代器的值,普通对象没法使用,以下代码报错
        /* for(const value of user){
            console.log(value);
        } */
        //数组可以使用for-of,因为数组有迭代特性
        for(const value of arr){
            console.log(value);//{name: "hxj", age: 30}
        }
        //所以可以先使用Object.keys(user),获取到属性值的数组,再使用for-of遍历
        for(const value of Object.values(user)){
            console.log(value);
        }
        //使用解构特性遍历对象的键值对
        for(const [key,value] of Object.entries(user)){
            console.log(key,value);
        }
        let users=[
            {name:'hxj',age:30},
            {name:'ydc',age:30}
        ];
        let ul=document.createElement("ul");
        for(const user of users){
            let li=document.createElement("li");
            li.innerHTML=`姓名:${user.name},年龄${user.age}`;
            ul.appendChild(li);
        }
        document.body.appendChild(ul);
    </script>
</html>
<!DOCTYPE html>
<html>
   <head>
       <meta charset="utf-8">
       <title>13对象浅拷贝的多种操作方法</title>
   </head>
   <body>
   </body>
   <script>
//浅拷贝它会创建一个新对象,这个对象有着原始对象属性值的一份精确拷贝。
//如果属性是基本类型,拷贝的就是基本类型的值;如果属性是内存地址(引用类型),
//拷贝的就是内存地址 ,因此如果其中一个对象改变了这个地址,就会影响到另一个对象。
//即默认拷贝构造函数只是对对象进行浅拷贝复制(逐个成员依次拷贝),
//即只复制对象空间而不复制资源。
//浅拷贝的方式——for-in, Object.assign(), 展开语法
//这几种方法没法浅拷贝多层的对象
       let user={name:'hxj',age:30,};
       let a={
           name:user.name
       };
       a.name='ydc';
       console.log(a.name);//ydc
       console.log(user.name);//hxj
       //for-in
        let b={};
       for(const key in user){
           b[key]=user[key];
       }
       console.log(b);//{name: "hxj", age: 30}
       b.name='ydc';
       console.log(b);//{name: "ydc", age: 30}
       console.log(user);//{name: "hxj", age: 30}
       //Object.assign()
       let c=Object.assign({},user);
       console.log(c);//{name: "hxj", age: 30}
       c.name='ydc';
       console.log(c);//{name: "ydc", age: 30}
       console.log(user);//{name: "hxj", age: 30}
       //展开语法
       let d={...user};
       console.log(d);//{name: "hxj", age: 30}
       d.name='ydc';
       console.log(d);//{name: "ydc", age: 30}
       console.log(user);//{name: "hxj", age: 30}
       
   </script>
</html>
<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>深拷贝多层次分析</title>
    </head>
    <body>
    </body>
    <script>
//深拷贝会另外创造一个一模一样的对象,
//新对象跟原对象不共享内存,修改新对象不会改到原对象
    let user={
        name:'hxj',
        lesson:{
            js:80,
            css:85
        }
    };
    //上节中的浅拷贝
    /* let hxj={
        name:user.name,
        lesson:user.lesson
    }; */
    let hxj={};
    for(const key in user){
        hxj[key]=user[key];
    }
    console.log(hxj);
    hxj.lesson.html=90;
    hxj.name='郝雪洁';
    //console.log(JSON.stringify(hxj,null,2));
    //user中name还是hxj,但是lesson对象里也增加了html键值对
    //console.log(JSON.stringify(user,null,2));
//如果原版中里面有多层对象,浅拷贝出来的副本,并不独立于原版,还是共用内层对象的引用地址
//因此引出深拷贝来解决该问题,而深拷贝的核心就是把原版里内层对象一层层剥到基本类型
//彻底的赋值一份资源出来和原版完全独立,互不影响。  
    function copy(obj){
        let a={};
        for(const key in obj){
            a[key]=typeof obj[key]=='object'?copy(obj[key]):obj[key];
        }
        return a;
    }
    let b=copy(user);
    //console.log(JSON.stringify(b,null,2));
    b.lesson.html=89;
    //console.log(JSON.stringify(b,null,2));//b里lesson的"html": 89
    //console.log(JSON.stringify(user,null,2));//user里lesson的"html": 90
//看一种对象里不但是多层,而且有些属性值是数组的情况
    let data={
        name:'hxj',
        lesson:{
            js:80,
            css:85
        },
        arr:['工作','业余']
    };
    //如果仍然使用上述copy()方法,会把arr复制成对象类型;
    //console.log(copy(data));//arr:{}
//copy()方法改进
    function newcopy(obj){
        //每次递归迭代的时候我们先看看传进来的这个obj是数组还是对象,
        //是数组就用数组接,是对象就用对象接,
        let a=obj instanceof Array?[]:{};
        /* for(const key in obj){
            a[key]=typeof obj[key]==='object'?newcopy(obj[key]):obj[key];
        } */
        for(const[k,v] of Object.entries(obj)){
            a[k]=typeof v==='object'?newcopy(v):v;
        }
        return a;
    }
    let copydata=newcopy(data);
    console.log(copydata);
    copydata.arr.push('兴趣');
    console.log(copydata);
    console.log(data);
    </script>
</html>
上一篇 下一篇

猜你喜欢

热点阅读