17-引用类型、拷贝对象

1.引用类型有哪些?非引用类型有哪些?

(1)引用类型:指的是那些保存在堆内存中的对象,变量中保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象

  • 对象
  • 数组
  • 函数
  • 正则

(2)基本类型:指的是保存在栈内存中的简单数据段

  • 数值
  • 布尔值
  • null
  • undefined

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) //{ name: 'hello', age: 2 }
console.log(dd) //[1,2,{name: 'hello', age: 3}]

原因:

  • a,b都是基本类型,aa=a只是在内存中开辟了一块新空间,并不会相互影响,所以一开始aa的值就是1,和后面a重新赋值没有关系。b也同理。
  • 但是c和d不一样,数组和对象都是引用类型,原来的c中存储的是这个对象的指针,而c.name = ‘hello’ 是改变了指针所指内容的值,所以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
console.log(c) //{ name: 'jirengu', age: 3 }

原因:
f1(a)在执行的时候会变成

function f1(a){
    var n = a;
    ++n;
}

这时候a的值并没有改变。而c是引用类型,执行f2(c)。复制的是指针,所以要变化。c.age是基本类型,不会变化。


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

<script>
    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);
                i = i-1;
            }
        }
    }
    filter(arr)
    console.log(arr) // [3,1,2]
</script>

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

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

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

  • 第一种:JSON
<script>
 function deepCopy(obj){
    return JSON.parse(JSON.stringify(obj));
 }
</script>
  • 第二种:递归
<script>
 function deepCopy(obj){
    var newObj = {};
    for(var i in obj){
        if(typeof obj[i] === 'object' && obj[i] !== null){
            newObj[i] = deepCopy(obj[i]);
        }else{
            newObj[i] = obj[i];
        }
    }
    return newObj;
 }
</script>
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 11,298评论 6 13
  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,281评论 0 4
  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,839评论 18 399
  • 1.引用类型有哪些?非引用类型有哪些非引用类型值,即基本类型值(数值,布尔值,undefined,null):指保...
    青鸣阅读 424评论 0 0
  • 回顾 应该要继续强化边读书边思考的习惯。“短时间内把书读完”容易让人产生“读书快”的错觉,这是一种廉价又肤浅的快感...
    势从千里奔阅读 4,887评论 1 2