js基础面试题

本文深入探讨了JavaScript中变量的类型,包括常见的值类型和引用类型,以及ES6新增的类型。详细解释了栈内存和堆内存的区别,并通过实例展示了它们在赋值和拷贝过程中的行为差异。最后,提供了一个实现深拷贝的函数,确保对象在拷贝后不会互相影响。

变量的类型
常见的值类型:
undefined | string | number | boolean | Symbol
常见的引用类型:
object | Array | unll(空指针) | function
ES6新增类型:
map | set | weekMap | weekSet

值类型:把key(变量名)和value(值)皆存储在栈内存中,值类型的赋值的时候,相互之间不影响。
引用类型:把key(变量名)和value(内存地址)存储在栈中,在堆内存中key是内存地址,value是真正的值。
栈内存图示:

var a = 100;
var b = a;
b = 200;
console.log(a); //100
console.log(b); //200

在这里插入图片描述
堆内存图示:

var a = {age:100};
var b = a;
b.age = 200;
console.log(a.age); //200
console.log(b.age); //200

在这里插入图片描述
typeof能够判断哪些数据类型:


var a = undefined;
console.log(typeof a);//undefined
var b = 12;
console.log(typeof b);//number
var c = true;
console.log(typeof c);//boolean
var d = "love";
console.log(typeof d);//string
var e = Symbol("e");
console.log(typeof e);//Symbol
//typeof 能够准确的判断值类型
var f = {name:"zjh"};
var g = [1,2,3];
var h = null;
var i = function(){};
console.log(f);//object
console.log(g);//object
console.log(h);//object
console.log(i);//function
//typeof 能判断对象是否为引用类型但是不精确
//typeof 能准确判断出数据是一个函数

如何实现对象的深拷贝:
何为深拷贝:就是复制obj1得到obj2,改变obj1或者obj2的属性值,两者互不影响;


var obj1 = {    
  name:"zjh",    
  age:18,    
  address:{        
    province:"hn",        
    city:"ay",    
  },    
  arr:["a","b","c"];}
var obj2 = obj1;
//这种简单的赋值当obj2的属性值改变时obj1的属性值也发生了改变
//显然达不到深拷贝的要求

//浅拷贝//通过forIn 遍历一遍对象
var obj2 = {};
for(let k in obj1){    
  obj2[k] = obj1[k];
}
//这种方法实现浅拷贝 浅拷贝只能在第一层做到互不影响即name或者age的改变互不影响,但是address.province改变还是相关联的。
//深拷贝
function deepcopy(obj){    
//如果对象是数值类型或者null则直接返回    
//如果是引用类型,开始执行拷贝    
//如果是数组返回数组 如果是对象返回对象    
  if(typeof obj !== 'object'||obj===null){        
    return obj;    
  }    
  var result;    
  if(obj instanceof Array){        
    result = [];    
  }else{        
    result = {};    
  }    
  //对象的值不能够是继承来自于父辈的,只拷贝来自自身的属性   
  for(let key in obj){        
    if(obj.hasOwnProperty(key)){            
      result[key] = deepcopy(obj[key])        
    }    
  }    
return result;
}
var obj2 = deepcopy(obj1);
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值