1.值类型
存储在栈区的数据,无法添加、删除属性,如果直接赋值给另一个变量,两个变量互不影响,修改其中任意一个变量的值,都对另一个变量的值无影响。
var num = 1;
var ab = num.toFixed(2);
var str = '1111';
var un = undefined;
console.log(ab)
console.log(toString.call(num));
console.log(toString.call(str));
console.log(toString.call(un));
console.log(toString.call(true));
2.引用类型
引用类型的值储存再堆区,再栈区数据的引用地址。如果直接赋值给另一个变量,其实是把数据的存放地址拷贝给了另一个变量, 共享一个地址,共用一份数据,任何一方更改数据,都会导致另一方数据发生改变
var arr = [];
var data = {};
var nul = null;
function Product(){}
var product = new Product();
console.log(toString.call(product));
var num = new Number(10);
console.log(toString.call(num));
3.引用类型的深拷贝和浅拷贝
<script>
/*浅拷贝*/
var a = {
name : "xiaoming",
data :{
age:2,
sex:"男"
}
}
var b = {};
qian(a,b);
function qian(a,b){
for(var i in a){
b[i] = a[i];
}
}
console.log(b.name);
console.log(b.data.age);
a.name="xiaohua";
a.data.age=3;
console.log(b.name);
console.log(b.data.age);
console.log("---------------------------------------")
/*深拷贝*/
var c = {
name : "xiaoming",
data :{
age:2,
sex:"男"
}
}
var d = {};
shen(c,d);
function shen(c,d){
for(var i in c){
if(toString.call(c[i])=="object Object"){
shen(c[i],d[i]);
}else {
d[i]=c[i];
}
}
}
console.log(d.name);
console.log(d.data.age);
a.name="xiaohua";
a.data.age=3;
console.log(d.name);
console.log(d.data.age);
</script>
4.关于引用类型赋值题
<script>
var a = {"x": 1};
var b = a;
a.x = 2;
console.log(b.x); //2
/*解析*/
/*将a赋值给b b中保存的只是地址,也就是a变量,b变量指向同一个对象*/
/*修改a.x 同时也修改了b.x - 以为修改的都是同一块内存区域*/
a = {"x":3};
console.log(b.x);
/*解析*/
/*这里又定义了一个新的对象,重新分配内存空间,这个时候a变量中存储的是新地址,而b还是指向老对象*/
/*所以这里b.x还是2*/
a.x = 4;
console.log(b.x);
/*解析*/
/*a b这个时候分别指向不同的对象,所以修改a不会影响b*/
/*所以这里b.x还是2*/
</script>
网友评论