美文网首页
js堆栈以及数据类型

js堆栈以及数据类型

作者: _theFeng | 来源:发表于2019-04-25 11:26 被阅读0次

    基本数据类型

    • 基本数据类型放在栈中(值不可变,但是可以重新赋值)
    var str = "abc";
        str[1]='f'
        console.log(str);   // abc
    
    var str = "abc";
        str = 'f'
        console.log(str);  // f
    
    • 基本数据类型的'='是传值 开辟新的栈
    var a = 10;
    var b = a;
    a ++ ;
    console.log(a); // 11
    console.log(b); // 10
    
    • 基本类型比较是值的比较
       var a = 1;
       var b = 1;
       console.log(a === b);//true
    

    引用类型(对象,数组,函数,等)

    • 引用类型放到堆中(值可以变)
        var a = [1,2,3];
        a[1] = 5;
        console.log(a[1]); // 5
    

    -引用类型的比较是引用的比较(堆的空间)

        var a = [1,2,3];
        var b = [1,2,3];
        console.log(a === b); // false
    
    • 引用类型的'='是传址(共同使用同一块堆中的地址)
    var a = {}; // a保存了一个空对象的实例
    var b = a;  // a和b都指向了这个空对象
    
    a.name = 'jozo';
    console.log(a.name); // 'jozo'
    console.log(b.name); // 'jozo'
    
    b.age = 22;
    console.log(b.age);// 22
    console.log(a.age);// 22
    
    console.log(a == b);// true
    

    '='是引用和浅拷贝的区别

    • 浅拷贝 也创建一个新对象 开辟了堆的空间 只复制一层对象的属性,并不包括对象里面的为引用类型的数据
        var obj1 = {
            'name' : 'zhangsan',
            'age' :  '18',
            'language' : [1,[2,3],[4,5]],
        };
    
        var obj2 = obj1;
    
    
        var obj3 = shallowCopy(obj1);
        function shallowCopy(src) {
            var dst = {};
            for (var prop in src) {
                if (src.hasOwnProperty(prop)) {
                    dst[prop] = src[prop];
                }
            }
            return dst;
        }
    
        obj2.name = "lisi";
        obj3.age = "20";
    
        obj2.language[1] = ["二","三"];
        obj3.language[2] = ["四","五"];
    
        console.log(obj1);  
        //obj1 = {
        //    'name' : 'lisi',
        //    'age' :  '18',
        //    'language' : [1,["二","三"],["四","五"]],
        //};
    
        console.log(obj2);
        //obj2 = {
        //    'name' : 'lisi',
        //    'age' :  '18',
        //    'language' : [1,["二","三"],["四","五"]],
        //};
    
        console.log(obj3);
        //obj3 = {
        //    'name' : 'zhangsan',
        //    'age' :  '20',
        //    'language' : [1,["二","三"],["四","五"]],
        //};
    
    • 深拷贝 是对对象以及对象的所有子对象进行拷贝 完全独立出来把所有全部拷贝出来。
    1. JSON.parse(JSON.stringify()) new Date()将变成字符串,正则将变成空对象
    
    const obj = {
        arr: [111, 222],
        obj: {key: '对象'},
        a: () => {console.log('函数')},
        date: new Date(),
        reg: /正则/ig
    }
    
    image.png
    1. for in 和递归的方法 无法拷贝函数,date,reg类型的对象;
    
    function isObj(obj) {
        return (typeof obj === 'object' || typeof obj === 'function') && obj !== null
    }
    function deepCopy(obj) {
        let tempObj = Array.isArray(obj) ? [] : {}
        for(let key in obj) {
            tempObj[key] = isObj(obj[key]) ? deepCopy(obj[key]) : obj[key]
        }
        return tempObj
    }
    
    

    未完待续 深拷贝的方法和坑

    相关文章

      网友评论

          本文标题:js堆栈以及数据类型

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