您现在的位置:首页 >> 前端 >> 内容

对象引用

时间:2017/5/25 9:37:00 点击:

  核心提示:实例一:var a = 5;var b = a;b += 3;alert(b);//8alert(a);//5/** * 建立一个变量 a,一个变量b,把 a 的值赋值给 b * b 的值改变不会影响...

实例一:

var a = 5;
var b = a;

b += 3;
alert(b);//8
alert(a);//5

/**
 * 建立一个变量 a,一个变量b,把 a 的值赋值给 b
 * b 的值改变不会影响 a 的值,这就是一个简单的赋值关系
 * 这种赋值关系主要存在于 基本类型中(比如说:String,Number,Boolean,Undefined,null)
 */

实例二:

var a = [1,2,3];
var b = a;

b.push(4);
alert(b);//1,2,3,4
alert(a);//1,2,3,4

/**
 * 在这种情况下不是复制的关系而是引用的关系,这就是对象的引用
 * 除了对象,函数也会有这个特点 
 */

实例三:

var a = [1,2,3];
var b = a;

//b这个时候在内存中重新占据了一块地址,这个时候它和 a 分离了
//这个时候你再修改b,就不会影响到 a 了
b = [1,2,3,4];

alert(b);//1,2,3,4
alert(a);//1,2,3

实例四:

var obj1 = {
    a : 10
}

var obj2 = obj1;

obj2.a = 20;

alert(obj1.a);//20
/**
 * 可以看到此时修改 obj2 的属性 影响了 obj1
 * 我们复制一个对象给另一个对象,那当你改另一个对象的时候
 * 会影响到之前的对象,这肯定是我们不希望看到的
 * 
 * 那我们要克隆或者是拷贝一个对象要怎么做呢?看下一个实例
 */

实例五(浅拷贝):

var obj1 = {
    a : 10
}

function copy(obj){//浅拷贝

    var newObj = {};

    for(var attr in obj){
        newObj[attr] = obj[attr];
    }

    return newObj;
}

var obj2 = copy(obj1);

obj2.a = 20;

alert(obj1.a);//10

实例六(深拷贝):

var obj1 = {
    a : {b : 10}
}

function deepCopy(obj){//深拷贝,我们使用递归的方法来实现

    //终止条件,即什么时候 obj 不是对象就可以返回了
    if(typeof obj != 'object'){
        return obj;
    }
    var newObj = {};

    for(var attr in obj){
        newObj[attr] = deepCopy(obj[attr]);
    }

    return newObj;
}

var obj2 = deepCopy(obj1);

obj2.a.b = 20;

alert(obj1.a.b);//10

Tags:对象 象引 引用   
作者:网络 来源:江南北