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])