引用类型、对象拷贝

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

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

2.代码练习

(1)如下代码输出什么?为什么

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);
// false     
// 因为对象比较的是两个地址,两个对象的地址不同
console.log(obj1 = obj2);
 // Object {a: 1, b: 2} 
// 因为把 obj2 的地址赋给了 obj1
console.log(obj1 == obj2);
// true
// 因为对象比较的是两个地址,前面把地址赋过了,地址相同

(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}]
        // 引用类型赋值完后互相关联,指向同一个对象

(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   
  //  因为函数的形参和实参(在这里n是形参,a是实参),是两个变量,如果传递进去的实参保存的是基本类型,形参和外面的变量保存的基本类型的值,互相独立,互不影响
  console.log(c)    
  //  输出 Object {name: 'jirengu', age: 3}
  //  因为函数的形参和实参,是两个变量,如果传递进去的实参保存的是引用类型,形参改变,外面的变量保存着的对象也随之改变

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

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
}
filter(arr)
console.log(arr) // [3,1,2]
-------------------------------
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]

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

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

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr){
}
var arr2 = filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-2,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,-2,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){
//对null不能用typeof检测会返回object
            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;
 }

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏烂笔头

Python标准库笔记(4) — collections模块

目录[-] 这个模块提供几个非常有用的Python容器类型 1.容器 名称 功能描述 OrderedDict 保持了key插入顺序的di...

3207
来自专栏数据结构与算法

08:字符替换

08:字符替换 总时间限制: 1000ms 内存限制: 65536kB描述 把一个字符串中特定的字符全部用给定的字符替换,得到一个新的字符串。 输入只有一...

3555
来自专栏前端知识分享

第191天:js---Array常用属性和方法总结

762
来自专栏python全栈布道师

2017年9月4日

3369
来自专栏Golang语言社区

转--Golang语言--复合数据

1、array 数组的类型格式为单个数据单元类型+长度构成,如 [2]int,其中 [2] 代表数组的长度,而 int 代表每个单元都是整形。 数组的元素操作也...

3195
来自专栏cs

python的函数

2574
来自专栏FSociety

Oracle中字符串大小比较以及数据隐式转化

首先我们得明白在数据库中单引号是用来字符串引用的,不管是数字还是时间,当你用单引号引用起来之后,数据库就会将他当成字符串来对待。

1082
来自专栏JAVA技术站

shell学习二数组 原

类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0。

381
来自专栏深度学习之tensorflow实战篇

mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改

mongodb11天之屠龙宝刀(九)js函数入门:MongoDB基于js的数据类型修改 Mongodb并不提供Alter table这样的语句或者工具修...

2944
来自专栏nnngu

算法05 五大查找之:顺序查找

这一篇要介绍的是算法中的查找算法。查找在我们生活中无处不在,比如查公交,查机票,查酒店等等。 首先看一下查找的分类。如下图: ? 那么这一篇要总结的是顺序表中的...

34311

扫码关注云+社区