美文网首页
JavaScript学习总结(1) —— 内置类型

JavaScript学习总结(1) —— 内置类型

作者: Frio_ | 来源:发表于2019-10-22 10:39 被阅读0次

    1. 内置类型

    JS 中分为七种内置类型,七种内置类型又分为两大类型:基本类型和对象(Object)。

    基本类型有六种:null,undefined,boolean,number,string,symbol

    其中 JS 的数字类型是浮点类型的,没有整型。并且浮点类型基于 IEEE 754 标准
    实现,在使用中会遇到某些 Bug。NaN 也属于 number 类型,并且 NaN 不等于自身。
    对于基本类型来说,如果使用字面量的方式,那么这个变量只是个字面量,只有在
    必要的时候才会转换为对应的类型

    let a = 111 // 这只是字面量,不是 number 类型
    a.toString() // 使用时候才会转换为对象类型
    对象(Object)是引用类型,在使用过程中会遇到浅拷贝和深拷贝的问题。


    1.1 浅拷贝和深拷贝问题

    如何区分深拷贝与浅拷贝,简单点来说,就是假设B复制了A,当修改A时,看B是否会发生变化,如果B也跟着变了,说明这是浅拷贝,拿人手短,如果B没变,那就是深拷贝,自食其力。

    浅拷贝例子:

    let a=[0,1,2,3,4],
        b=a;
    console.log(a===b);
    a[0]=1;
    console.log(a,b);
    
    输出结果

    会发现b会随着a变化,是因为当b=a进行拷贝时,其实复制的是a的引用地址,而并非堆里面的值。而当我们a[0]=1时进行数组修改时,由于a与b指向的是同一个地址,所以自然b也受了影响,这就是所谓的浅拷贝了。


    浅拷贝

    要实现深拷贝的话,就需要递归去复制所有层级属性。
    这么我们封装一个深拷贝的函数(PS:只是一个基本实现的展示,并非最佳实践)

    function deepClone(obj){
        let objClone = Array.isArray(obj)?[]:{};
        if(obj && typeof obj==="object"){
            for(key in obj){
                if(obj.hasOwnProperty(key)){
                    //判断ojb子元素是否为对象,如果是,递归复制
                    if(obj[key]&&typeof obj[key] ==="object"){
                        objClone[key] = deepClone(obj[key]);
                    }else{
                        //如果不是,简单复制
                        objClone[key] = obj[key];
                    }
                }
            }
        }
        return objClone;
    }    
    let a=[1,2,3,4],
        b=deepClone(a);
    a[0]=2;
    console.log(a,b);
    

    相关文章

      网友评论

          本文标题:JavaScript学习总结(1) —— 内置类型

          本文链接:https://www.haomeiwen.com/subject/fdofvctx.html