(前端进阶一)调用堆栈

一、函数的值传递和引用传递

1. 函数的参数如果是基本的数据类型就会生成一个副本传到函数内部
2. 函数的参数如果是引用数据类型就把引用数据类型的内存地址传到函数内部

二、函数的arguments详解

1. 参数的分配都是从左到右的

多余的实参会被arguments接受

多余的形参都被当作undefined处理

总结:

1. 引用传递的参数,是传递引用对象的内存地址 函数内部修改会影响到传递参数的引用对象

2. 值传递的是一个值类型的副本函数内部并不影响外部传递的参数变量

深拷贝:
方法一: 
var xm = {
    age:18,
    score:4
}

function deepCopy(obj){
    var str,newobj = obj.constructor === 'Array'?[]:{}
    if(typeOf(obj) === 'Object’){
        return obj;
    }else if(window.JSON){
        str = JSON.stringify(obj);
        newobj = JSON.parse(str);
    }else{
        for(let i in obj){
            newobj[i] = typeOf(obj) === 'Object'?deepCopy(obj):obj[i]
        }
    }
    return newobj;
 }

var xh = deepCopy(xm);

Conosole.log(xh.age === xm.age);
Console.log(xh === xm);



方法二:Object.assign()
1. 当对象只有一级属性的时候没有二级属性的时候 此方法就是深拷贝 
2. 但是当对象中存在对象的时候此方法就被称为浅拷贝
var obj1 = { a: 10, b: 20, c: 30 };
var obj2 = Object.assign({}, obj1);
obj2.b = 100;
console.log(obj1);
// { a: 10, b: 20, c: 30 } <-- 沒被改到
console.log(obj2);
// { a: 10, b: 100, c: 30 }


方法三:通过jQuery的extend方法实现深拷贝
var array = [1,2,3,4]; var newArray = $.extend(true,[],array);


方法四:lodash很热门的函数库,提供了 lodash.cloneDeep()实现深拷贝

浅拷贝的案例:数组复制浅拷贝存在一定问题 
拷贝的和被拷贝的数组会相互影响

转载于:https://www.cnblogs.com/broad/p/9991776.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值