美文网首页
基本类型、引用类型

基本类型、引用类型

作者: yytyff | 来源:发表于2017-04-16 11:24 被阅读0次

    基本类型、引用类型

    基本类型值(数值、布尔值、null和undefined):指的是保存在栈内存中的简单数据段;
    引用类型值(对象、数组、函数、正则):指的是那些保存在堆内存中的对象,变量中保存的实际上
    只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象

    var a 
    var b 
    var c
    
    
    var a = 1
    var b = 2
    var c = {name:'yangtao'}
    
    
    // --1-- --2-- --0x0033--基本类型,引用类型|
    
    //找一个大的区域来存储,定位好坐标比如 0x0033 {name:'yangtao'}
    
    var aa = a 
    var bb = b
    var cc = c
    
    // --1-- --2-- --0x0033--
    //  aa     bb     cc    
    
    a = 100
    b = 200
    c.name = 'jirengu'
    
    console.log(aa)
    console.log(bb)
    console.log(cc)
    
    // --1-- --2-- --0x0033--
    //             {name:'jirengu'}
    
    
    c:{name:'饥人谷'}
    
    //0x0044 {name:'饥人谷'}
    
    
    console.log(cc)
    

    函数的参数传递

    function inc(n){
        // var n =a
        n++;
    }
    var a = 10;
    inc(a);
    console.log(a);
    
    function incObj(obj){
        //var obj = o //0x0001
        obj.n++;
    }
    
    var o = {n: 10};  //o = 0x0001
    incObj(o);
    console.log(o);
    
    
    function squireArr( arr ){
        //var arr = 0x0011
        for(var i = 0; i < arr.length; i++){
            arr[i] = arr[i] * arr[i];
        }
    }
    function squireArr2( arr ){
        var newArr = [];
        for(var i = 0; i < arr.length; i++){
            newArr[i] = arr[i] * arr[i];
        }
        return newArr;
    }
    
    var arr = [2,1,3,6]; //arr  0x0011
    squireArr(arr);
    console.log(arr); // [4,1,9,36]
    
    var arr2 = squireArr2(arr)
    console.log(arr2);
    

    对象浅拷贝和深拷贝

    var a = 1
    var b =1
    
    a =2
    b ==1
    
    var obj = {age:100}
    var obj2 = obj
    obj.age =200
    obj2.age ==200
    
    浅拷贝:只拷贝一层
    var a =1
    var b =a
    
    a =2
    b ==1
    
    var obj = {
        age:100,
        friend:{
            name:'yangtao'
            
        }
    }
    var obj2 = obj
    obj.age =200
    obj2.age ==200
    
    function shadowCopy(obj){
        var newObj = {}
        for (var key in obj){
            newObj[key] = obj[key]
        }
        return newObj
    }
    var obj3 = shadowCopy(obj)
    obj.age = 400
    console.log(obj3)
    

    用深拷贝来实现完全拷贝:用递归

    unction copy(obj){
    
        var newObj = {};
        for (var key in obj){
            if(obj.hasOwnProperty(key)){
                if(typeof obj[key] ==='number' || typeof obj[key] ==='boolean'|| typeof obj[key] ==='string'|| obj[key] === undefined|| obj[key] === null){
                newObj[key] = obj[key];
            }else{
                newObj[key] = copy(obj[key]);
            }
        }   
    }
        return newObj
    }
    var obj3 = copy(obj)
    //obj.age = 400
    //console.log(obj3)
    
    

    相关作业

    1.引用类型有哪些?非引用类型有哪些2.如下代码输出什么?为什么

    • 非引用类型:数值、布尔值、null和undefined
    • 引用类型值:对象、数组、函数、正则
    var obj1 = {a:1, b:2};
    var obj2 = {a:1, b:2};
    console.log(obj1 == obj2);//false ,这个是引用类型,虽然obj1和obj2里面的值是一样的,但是他们的栈内存空间是不一样的
    console.log(obj1 = obj2);//Object {a: 1, b: 2}
    console.log(obj1 == obj2);//true 经过上面的赋值后,obj1和obj2 指向的内存地址是一样的
    

    2.如下代码输出什么? 为什么

    var a = 1
    var b = 2
    var c = { name: '饥人谷', age: 2 }
    var d = [a, b, c]
    
    var aa = a
    var bb = b
    var cc = c
    var dd = d
    
    a = 11
    b = 22
    c.name = 'hello'
    d[2]['age'] = 3
    
    console.log(aa) //1 
    console.log(bb) //2
    console.log(cc)//Object {name: "hello", age: 3}
    console.log(dd)//[1,2,{name: "hello", age: 3}]
    
    
    1, 
     --1--  --2--   --0x0033--   --0x0044--
       a      b       c            d
      0x0033:{name:'饥人谷' age:2}
      0x0044:[1,2, {name:'饥人谷' age:2}]
    
    --1--   --2--  --0x0033--  --0x0044--
     aa      bb       cc           dd
    
    2,
     --11--   --22--   --0x0033-   --0x0044--
        a       b       c             d
     0x0033:{name:'hello' age:3}
     0x0044:[1,2, {name:'hello' age:3}]
    
    --1--   --2--  --0x0033--  --0x0044--
     aa      bb       cc           dd
    1、虽然a,b的值变了,但是aa和bb的值是不变的,还是1,2。
    2、c,d为引用类型,c和d里面的值随着所对应的地址里的值改变而改变。
    

    3.如下代码输出什么? 为什么

    var a = 1
    var c = { name: 'jirengu', age: 2 }
    
    function f1(n){
      ++n
    }
    function f2(obj){
      ++obj.age
    }
    
    f1(a) 
    f2(c) 
    f1(c.age) 
    console.log(a) //1 相当于有一个 var n = a,而a的值是1,所以结果是1
    console.log(c)//Object {name: "jirengu", age: 3} 相当于var obj = c //0x0001,而c中的age值执行了一次++obj.age,所以c //0x0001里面的age变成了3
    

    4.过滤如下数组,只保留正数,直接在原数组上操作

    var arr = [3,1,0,-1,-3,2,-5]
    function filter(arr){
       for (var i = 0; i < arr.length; i++){
          if ( arr[i] <= 0 ) {
            arr.splice(i, 1);
            filter(arr);
          }
      }
    }
    filter(arr)
    console.log(arr) // [3,1,2]
    

    5.过滤如下数组,只保留正数,原数组不变,生成新数组

    var arr = [3,1,0,-1,-3,2,-5]
    function filter(arr){
         var newArr = [];
         for (var i = 0; i < arr.length; i++){
             if ( arr[i] > 0 ) {
                  newArr.push(arr[i]);
             }
         }
        return newArr;
    }
    var arr2 = filter(arr)
    console.log(arr2) // [3,1,2]
    console.log(arr)  // [3,1,0,-1,-3,2,-5]
    

    6.写一个深拷贝函数,用两种方式实现

    第一种:
    function copy(obj){
        var newObj = {};
        for (var key in obj){
            if(obj.hasOwnProperty(key)){
                if(typeof obj[key] ==='number' || typeof obj[key] ==='boolean'
                            || typeof obj[key] ==='string'|| obj[key] === undefined||
                             obj[key] === null){
                newObj[key] = obj[key];
            }else{
                newObj[key] = copy(obj[key]);
            }
        }   
    }
        return newObj;
    }
    第二种:
    JSON.stringify(obj)
    JSON.parse()
    JSON.parse(JSON.stringify(obj))
    function copy(obj){
            var newObj = JSON.parse(JSON.stringify(obj));
            return newObj;
     }
    
    

    相关文章

      网友评论

          本文标题:基本类型、引用类型

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