最新公告
  • 欢迎您光临起源地模板网,本站秉承服务宗旨 履行“站长”责任,销售只是起点 服务永无止境!立即加入钻石VIP
  • JavaScript对象的底层数据结构是什么

    正文概述 掘金(四点水的点滴记录)   2021-06-14   554

    上一篇文章归纳了javascript的数据类型,归根到底数据类型就分为两类,一种是基础类型,一种是引用类型。如果还没有看的同学这里附上超链接《JavaScript规定了几种语言类型》

    基本类型

    • 内容:StringNumberBooleanUndefinedNullSymbolBigInt
    • 特点:值不可变,无属性无方法,保存在栈内存中、值比较。

    String是一个特殊的基本类型,可以被当成引用类型使用

    let a = 'strObject';
    a = a.substring(3,9);
    console.log(a); // Object
    

    引用类型

    • 内容:除了上面的 7 种基本数据类型外,剩下的就是引用类型,统称为Object类型
    • 特点:引用类型的值同时保存在栈内存和堆内存中的对象。栈区内存保存变量标识符,堆内存存储对象的地址

    ps:差异:基本类型的值是不可变的,比较是值的比较,引用类型的值是可变的,比较是引用的比较;

    const a = '我是a';
    let b = a;
    console.log(a===b); // true
    b = '我现在改了';
    console.log(a); // 我是a
    console.log(b); // 我现在改了
    console.log(a===b); // false
    /** =================== **/
    const c = {
    	name: '张三'
    }
    const d = c;
    const e = {name: '李四'}
    d.name = '李四';
    console.log(c); // {name: "李四"},引用类型的赋值其实是对象保存在栈区地址指针的赋值,因此两个变量指向同一个对象,任何的操作都会相互影响。
    console.log(d); // {name: "李四"}
    console.log(e); // {name: "李四"}
    console.log(c===d); // true
    console.log(d===e); // false,虽然看起来相同,但是两个对象存在堆内存的地址是不相同的,所以返回的是false;
    

    现在我们来了解下什么是堆,什么又是栈。

    堆(heap)

    • 堆内存的简称,动态分配内存,内存大小不一,不是自动释放。
    • 队列优先,先进先出,方便存储和开辟内存空间。

    栈(stack)

    • 栈内存的简称,自动分配相对固定大小的内存空间,并由系统自动释放。基本类型存储在栈内存的好处就是,内存可以及时的得到回收。
    • 线性结构,后进先出,便于管理。

    ps:看完堆和栈的简单介绍,我们再来看下对于数据结构相关的一个问题浅拷贝和深拷贝

    浅拷贝

    只复制了第一层属性,复制对象是基本类型。

    // 浅拷贝的方法
    const a = {
    	name: '张三'
    }
    // Object.assign或=
    const b = Object.assign(a);// {name: '张三'}
    b.name = '李四';
    console.log(a.name); // 李四
    const c = b;
    c.name = '王五'
    console.log(a.name); // 王五
    console.log(b.name); // 王五
    

    深拷贝

    对属性中所有引用类型的值,遍历到是基本类型的值为止,利用递归来实现深拷贝。

    // Object.assign和扩展符针对对象值都是基本类型
    const a = {
    	name: '张三';
    }
    const b = Object.assign({}, a); // 或者{...a}
    b.name = '李四';
    console.log(a.name);// 张三
    // 递归循环
    function clone(obj){
        let _obj = Array.isArray(obj) ? [] : {};
        if(obj && typeof obj === "object"){
            for(key in obj){
                if(obj.hasOwnProperty(key)){
                    // 判断obj子元素是否为对象,如果是,递归复制
                    if(obj[key] && typeof obj[key] === "object"){
                        _obj[key] = clone(obj[key]);
                    } else {
                        // 如果不是,简单复制
                        _obj[key] = obj[key];
                    }
                }
            }
        }
        return _obj;
    };
    const c = clone(a);
    c.name = '王五';
    console.log(a.name); // 张三
    

    结尾附上一个有趣的问题typeof(null),打印出来的是object,原因JavaScript中的数据在底层是以二进制存储,比如null所有存储值都是0,但是底层的判断机制,只要前三位为0,就会判定为object

    ps:文末附上汇总文章链接《一名【合格】前端工程师的自检清单【持续更新】》


    起源地下载网 » JavaScript对象的底层数据结构是什么

    常见问题FAQ

    免费下载或者VIP会员专享资源能否直接商用?
    本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。更多说明请参考 VIP介绍。
    提示下载完但解压或打开不了?
    最常见的情况是下载不完整: 可对比下载完压缩包的与网盘上的容量,若小于网盘提示的容量则是这个原因。这是浏览器下载的bug,建议用百度网盘软件或迅雷下载。若排除这种情况,可在对应资源底部留言,或 联络我们.。
    找不到素材资源介绍文章里的示例图片?
    对于PPT,KEY,Mockups,APP,网页模版等类型的素材,文章内用于介绍的图片通常并不包含在对应可供下载素材包内。这些相关商业图片需另外购买,且本站不负责(也没有办法)找到出处。 同样地一些字体文件也是这种情况,但部分素材会在素材包内有一份字体下载链接清单。
    模板不会安装或需要功能定制以及二次开发?
    请QQ联系我们

    发表评论

    还没有评论,快来抢沙发吧!

    如需帝国cms功能定制以及二次开发请联系我们

    联系作者

    请选择支付方式

    ×
    迅虎支付宝
    迅虎微信
    支付宝当面付
    余额支付
    ×
    微信扫码支付 0 元