引用类型、对象拷贝

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 条评论
登录 后参与评论

相关文章

来自专栏IMWeb前端团队

JavaScript强化教程——JavaScript 运算符

本文作者:IMWeb 王军 原文出处:IMWeb社区 未经同意,禁止转载 本文为 H5EDU 机构官方 HTML5培训 教程,主要介绍:JavaScr...

24360
来自专栏深度学习思考者

一文搞懂C/C++中指针那些事(上篇)

一 指针变量 1.间接存取        指针变量的值为地址;普通变量的值为数据;其中“*”为指针运算符。&是地址操作符,用来引用一个内存地址。通过在变量名...

224100
来自专栏Esofar 开发日记

JavaScript权威指南 - 对象

JavaScript对象可以看作是属性的无序集合,每个属性就是一个键值对,可增可删。 JavaScript中的所有事物都是对象:字符串、数字、数组、日期,等等...

9320
来自专栏Android Note

Kotlin —  lateinit vs lazy

12730
来自专栏IT可乐

Java关键字(四)——final

  对于Java中的 final 关键字,我们首先可以从字面意思上去理解,百度翻译显示如下:

10130
来自专栏Web行业观察

说说这个this啊

上述代码中foo()不带任何修饰函数引用进行调用的,因此只能使用默认绑定,无法应用其他规则。 像这种独立函数调用是最常见的方式。值得一提的是在严格模式下,全局对...

13390
来自专栏星回的实验室

js重修课[四]:函数

函数有两种定义方法:定义表达式如var f = function(){};和声明语句如function f(){}。须知在变量提前这一现象中,声明语句可被提前,...

13920
来自专栏破晓之歌

JAVA入门1 原

下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848...

15820
来自专栏Java帮帮-微信公众号-技术文章全总结

04.Java对象和类

04.Java对象和类 Java 对象和类 Java作为一种面向对象语言。支持以下基本概念: 多态 继承 封装 抽象 类 对象 实例 方法 重载 本节我们重点研...

46560
来自专栏用户2442861的专栏

Python补充11 序列的方法 正则表达式 (re包)

作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明。谢谢!

9610

扫码关注云+社区

领取腾讯云代金券