首页 > 其他 > 详细

(前端进阶一)调用堆栈

时间:2018-11-20 22:16:38      阅读:170      评论:0      收藏:0      [点我收藏+]

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

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

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!