美文网首页
引用类型和对象拷贝

引用类型和对象拷贝

作者: 白柏更好 | 来源:发表于2017-08-12 22:10 被阅读0次

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

  • 基本类型
    Number、String、Boolean、Null、Undefined
  • 引用类型
    Array、Function、Object、RegExp

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

var obj1 = {a:1, b:2};
var obj2 = {a:1, b:2};
console.log(obj1 == obj2);  //false,两个操作数都是对象,但它们指向的不是同一个对象
console.log(obj1 = obj2);  //a:1,b:2,两个变量相互复制引用类型时,指针会指向同一对象
console.log(obj1 == obj2);  //true, 由于两个变量引用的都是同一个对象,所以返回真

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

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)   //aa=1 , 非引用类型,只复制操作数的值而非地址
console.log(bb)   //bb=2 , 非引用类型,只复制操作数的值而非地址
console.log(cc)   //name:'hello',age: 3 , c是引用类型,所以cc与c指向同一个对象,从而改变对象属性后,另一个也发生相应变化。
console.log(dd)  //a=1 b=2 name:'hello' age=3 , d也是引用类型,在下面重新对a,b赋值之前d已经完成了对a,b变量值的复制,所以之后的赋值对d不造成影响;由于c是引用类型,所以数组中的c与变量c所指的对象为同一对象(指向同一地址),改变会同时发生。

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

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)   //a=1, a是基本类型,调用函数f1时,a作为参数,只是将变量值复制给n,所以n++对其无影响
console.log(c)   //name: 'jirengu',age: 3 , c是引用类型,调用函数f2时,将整个c对象当做参数复制过去,使得函数中的参数与c指向同一个对象,所以对其age属性加一操作会改变变量c对象的age属性值;而调用函数f1时只是将对象中的age属性作为参数复制过去,函数体中的操作对原来对象的age属性不造成影响

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

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

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

var arr = [3,1,0,-1,-3,2,-5]
function filter(arr) {
    var newarr = []
    var n=0
     for( var i in arr) {
        if(arr[i]>0){
            newarr[n++] =arr[i]
        }
    }
    return newarr
}
var arr2=filter(arr)
console.log(arr2) // [3,1,2]
console.log(arr)  // [3,1,0,-1,-2,2,-5]

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

//第一种方式
function copy(obj) {
    var newObj ={}
    for(var key in obj) {
        if(obj.hasOwnProperty(key)) {
            if(typeof obj[key] ==='number' || typeof obj[key] ==='string' || typeof obj[key] ==='boolean' || obj[key] === null || obj[key] === undefined) {
            newObj[key] = obj[key]
            } else {
                    newObj[key] = copy(obj[key]) 
               }
       } 
    }
} 

//第二种方式

function deepCopy() {
    var newObj = {};
    newObj = JASON.parse(JASON.stringify(oldObj));
    return newObj;
}
var obj2=deepCopy(oldObj);
console.log(obj2)

相关文章

  • Java深拷贝和浅拷贝

    定义 浅拷贝 基本数据类型 拷贝数值 引用类型 拷贝对象引用 深拷贝 基本数据类型 拷贝数值 引用类型 拷贝引用所...

  • 深拷贝和浅拷贝

    深拷贝和浅拷贝主要是针对对象的属性是对象(引用类型) 一、基本类型和引用类型的区别1、先了解内存任何编程语言的内存...

  • 引用类型和对象拷贝

    1.引用类型有哪些?非引用类型有哪些 引用类型:对象、数组、函数、正则表达式,指保存在堆内存中的对象,变量中保存的...

  • 引用类型和对象拷贝

    1.引用类型有哪些?非引用类型有哪些? 数值、字符串、布尔值、null和undefined为基本类型值,这些都是保...

  • 引用类型和对象拷贝

    引用类型:Array,Function,Object,Regex.指的是那些保存在堆内存中的对象,变量中保存的实际...

  • 引用类型和对象拷贝

    引用类型有哪些?非引用类型? 基本类型Number、String、Boolean、Null、Undefined 引...

  • 引用类型和对象拷贝

    引用类型有哪些?非引用类型有哪些2.如下代码输出什么?为什么 引用类型有对象、数组、函数、正则,非引用类型有数值、...

  • 引用类型和对象拷贝

    一、引用类型有哪些?非引用类型有哪些 JS 中分基本类型和引用类型。 基本类型值(数值、布尔值、字符串、null和...

  • 引用类型和对象拷贝

    1. 引用类型有哪些,非引用类型有哪些? 基本类型(非引用类型):Number, String, Boolean,...

  • 引用类型和对象拷贝

    1. 引用类型有哪些,非引用类型有哪些? 基本类型(非引用类型):Number, String, Boolean,...

网友评论

      本文标题:引用类型和对象拷贝

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