Web19.引用类型&对象拷贝

2017-11-09  本文已影响11人  FiredEarthMusic

基本类型 引用类型

基本类型值(数值 布尔值 null和undefined) 指的是保存在栈内存中的简单数据段

引用类型值(对象 数组 函数 正则) 指的是保存在堆内存中的对象 变量中保存的
实际上只是一个指针,指针执行内存中的另一个位置,由该位置保存对象
可以理解为存的是地址

<script>
    var a
    var b
    var c
    
    var a = 1
    var b = 2
    var c = {name: 'ruoyu'}  //0x0033

    var aa = a
    var bb = b
    var cc = c

    a = 100
    b = 200
    c.name = 'jirengu'

    console.log(aa)  //1
    console.log(bb)  //2
    console.log(cc)  //Object {name: "jirengu"}

    //c = {name: 'fem'}  //0x0044
</script>
//函数的参数传递

function inc(n){
   //var n = a
    n++;
}
var a = 10;
inc(a);
console.log(a);  //10



function incObj(obj){
    //var obj = o
   obj.n++;
}
var o = {n: 10};
incObj(o);
console.log(o);   //11
var arr = [3, 4, 5]  //0x0088

function squireArr(arr){
   //相当于 var arr = 0x0088
    for(var i = 0; i < arr.length; i++){
        arr[i] = arr[i] * arr[i]
    }
}
squireArr(arr)
console.log(arr)




function squireArr2(arr){
    var newArr = []
    for(var i = 0; i < arr.length; i++){
        newArr[i] = arr[i] * arr[i];
    }
    return newArr;
}

var arr2 = squireArr2(arr)
console.log(arr2);
浅拷贝

var obj = {
    age: 100,
    friend: {
        name: 'ruoyu',
        sex: 'male'
    }
}


function shadowCopy(obj){
    var newObj = {}
    for(var key in obj){
        newObj[key] = obj[key]
    }
    return newObj
}
var obj3 = shadowCopy(obj)
obj.age = 400
console.log(obj3)
//深拷贝
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){
                newObj[key] === obj[key]
            }else{
                newObj[key] = copy(obj[key])  
            }
        }
    }
    return newObj

}
var obj3 = copy(obj)

题目1:引用类型有哪些?非引用类型有哪些2.如下代码输出什么?为什么

1.png
基本类型值(数值 布尔值 null和undefined) 指的是保存在栈内存中的简单数据段
引用类型值(对象 数组 函数 正则) 指的是那些保存在堆内存中的对象,变量中
保存的实际上只是一个指针,这个指针执行内存中的另一个位置,由该位置保存对象  可以理解为存的是地址

console.log(obj1 == obj2)
//false  由于obj1与obj2所存储的位置不同,所以false
console.log(obj1=obj2)
//{a:1, b:2}  把obj2赋值给obj1  输出Object {a:1, b:2}
console.log(obj1 == obj2)
//把obj2赋值给obj1  所以obj2与obj1存储的位置是一样的  所以为true

题目2:如下代码输出什么? 为什么

2.png
console.log(aa)
//1   值传递   a aa b bb都会开辟一个属于自己的栈空间
console.log(bb)
//2    值传递
console.log(cc)
//{name: 'hello', age: 3}        对象的赋值是引用传递  cc和c都是指向同一块堆内存
console.log(dd)
//[1, 2, [name: 'hello', age: 3]    数组的赋值也是引用传递

题目3:如下代码输出什么? 为什么

3.png
f1(a)
//a = 1   有赋值动作  var n = a, ++n, a依然不变
f2(c)
//c = {name: 'jirengu', age: 3}
f1(c.age)
//取出c.age = 3 默认执行 var n = 3   不影响c.age
console.log(a)
//1
console.log(c)
//{name: 'jirengu',age:3}

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

4.png

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

5.png

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

上一篇下一篇

猜你喜欢

热点阅读