引用类型、对象拷贝

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

相关文章

来自专栏java工会

Java基础第一阶段知识点,招实习的面试官都在问这些

a) 答:Java源文件被编译成字节码的形式,无论在什么系统环境下,只要有java虚

1101
来自专栏Android Note

Kotlin —  lateinit vs lazy

1053
来自专栏数据结构笔记

数据结构(四):栈的应用之表达式求值

用户从控制台输入一个数学表达式(所有输入均合法),数学表达式只包含四则运算,程序需输出表达式对应的结果,如:

702
来自专栏WebHub

说说这个this啊

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

1159
来自专栏星汉技术

原 荐 Scala的面向对象

----------目录--------------------------------------------------------- 1.Scala简介和...

30213
来自专栏IMWeb前端团队

JavaScript强化教程——JavaScript 运算符

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

1996
来自专栏IT可乐

Java关键字(四)——final

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

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

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

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

20010
来自专栏破晓之歌

JAVA入门1 原

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

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

04.Java对象和类

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

4346

扫码关注云+社区