浅拷贝与深拷贝-闭包面试必刷题

83 阅读1分钟

1.浅拷贝与深拷贝区别在哪?

如果复制的是基本类型,无区别。如果复制的是引用类型,那么浅拷贝只复制变量的地址,深拷贝完全复制变量。
深拷贝,拷贝完成后两个变量无影响,并且深拷贝比较慢。

2.方法

浅拷贝方法:Object.assign()   Array.prototype.slice()    
var a=[1,3,5,3]; console.log(a.slice(1))
深拷贝方法:JSON.Stringfy() 复制引用类型。

3。闭包--我的面试被刷题 题1

var a=[];
for(i=0;i<3;i++){ a[i]=function(){
console.log(i) }}
a[0]();a[1]();a[2]();都是3

解决方法:data[i]返回一个函数,传参i,
for (var i = 0; i < 3; i++) {
 data[i] = (function (i) {
  return function(){
      console.log(i);    }})(i);}
data[0]();	// 0 data[1]();	// 1 data[2]();	// 2

解决方法2:立即执行函数

for (var i = 0; i < 3; i++) {
(function(num) {
    setTimeout(function() {
        console.log(num);
    }, 1000); })(i);}  
    data[0] //1,2,3
解决方法3:使用let,这时在不同的作用域里。
for (let i = 0; i < 3; i++) {data[i] = function () {
console.log(i); };}
data[0]();data[1]();data[2]()  //0,1,2

2.深入理解闭包
var scope="global";
function scopeTest(){console.log(scope);
var scope="local"  }
scopeTest(); //undefined


4.实现一个浅拷贝
//浅拷贝
function swallyclone(source)
{
 var obj={};
 for(key in source){  if(Object.prototype.hasOwnProperty.call(source,key))
 {
obj[key]=source[key] }}
 return obj}
var c={a:1,b:2}; var d=swallyclone(c); console.log(d)

Object.prototype.hasOwnProperty.call判断属性是否来源于原型链。

//深拷贝

function swallyclone(source)
{
 var obj={};
for(let key in source){
 if(Object.prototype.hasOwnProperty.call(source,key)){
 if(typeof source[key]==='object')
 {
    obj[key]=swallyclone(source[key])
 }
 else{
       obj[key]=source[key] 
 }}}
return obj}
深拷贝实际上等于浅拷贝加递归,如果属性类型对对象,那么就递归再复制。obj[key]=clone(source[key])