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

被折叠的 条评论
为什么被折叠?



