基本数据类型
- 基本数据类型放在栈中(值不可变,但是可以重新赋值)
var str = "abc";
str[1]='f'
console.log(str); // abc
var str = "abc";
str = 'f'
console.log(str); // f
- 基本数据类型的'='是传值 开辟新的栈
var a = 10;
var b = a;
a ++ ;
console.log(a); // 11
console.log(b); // 10
- 基本类型比较是值的比较
var a = 1;
var b = 1;
console.log(a === b);//true
引用类型(对象,数组,函数,等)
- 引用类型放到堆中(值可以变)
var a = [1,2,3];
a[1] = 5;
console.log(a[1]); // 5
-引用类型的比较是引用的比较(堆的空间)
var a = [1,2,3];
var b = [1,2,3];
console.log(a === b); // false
- 引用类型的'='是传址(共同使用同一块堆中的地址)
var a = {}; // a保存了一个空对象的实例
var b = a; // a和b都指向了这个空对象
a.name = 'jozo';
console.log(a.name); // 'jozo'
console.log(b.name); // 'jozo'
b.age = 22;
console.log(b.age);// 22
console.log(a.age);// 22
console.log(a == b);// true
'='是引用和浅拷贝的区别
- 浅拷贝 也创建一个新对象 开辟了堆的空间 只复制一层对象的属性,并不包括对象里面的为引用类型的数据
var obj1 = {
'name' : 'zhangsan',
'age' : '18',
'language' : [1,[2,3],[4,5]],
};
var obj2 = obj1;
var obj3 = shallowCopy(obj1);
function shallowCopy(src) {
var dst = {};
for (var prop in src) {
if (src.hasOwnProperty(prop)) {
dst[prop] = src[prop];
}
}
return dst;
}
obj2.name = "lisi";
obj3.age = "20";
obj2.language[1] = ["二","三"];
obj3.language[2] = ["四","五"];
console.log(obj1);
//obj1 = {
// 'name' : 'lisi',
// 'age' : '18',
// 'language' : [1,["二","三"],["四","五"]],
//};
console.log(obj2);
//obj2 = {
// 'name' : 'lisi',
// 'age' : '18',
// 'language' : [1,["二","三"],["四","五"]],
//};
console.log(obj3);
//obj3 = {
// 'name' : 'zhangsan',
// 'age' : '20',
// 'language' : [1,["二","三"],["四","五"]],
//};
- 深拷贝 是对对象以及对象的所有子对象进行拷贝 完全独立出来把所有全部拷贝出来。
- JSON.parse(JSON.stringify()) new Date()将变成字符串,正则将变成空对象
const obj = {
arr: [111, 222],
obj: {key: '对象'},
a: () => {console.log('函数')},
date: new Date(),
reg: /正则/ig
}
image.png
- for in 和递归的方法 无法拷贝函数,date,reg类型的对象;
function isObj(obj) {
return (typeof obj === 'object' || typeof obj === 'function') && obj !== null
}
function deepCopy(obj) {
let tempObj = Array.isArray(obj) ? [] : {}
for(let key in obj) {
tempObj[key] = isObj(obj[key]) ? deepCopy(obj[key]) : obj[key]
}
return tempObj
}
网友评论