1、值类型和引用类型
1.1、值类型
let a = 13;
let b = a;
b = 14;
console.log(a);
//13
当我们定义一个变量的时候是直接放在了栈里面,每一个key对应一个value
常见的值类型数据
let a; //undefined
let b = “hello”;//String
let c = 666;//number
let d = true;//boolen
let f = Symble(‘kk’);
1.2、引用类型
let a = {age:18};
let b = a;
b.age = 19;
console.log(a.age);
//19
这里我们发现,理论上是不会改变a的,但是这里吧a也给变了,原因是,在存储的时候,会把引用类型的数据放在堆里面,他的key值是一个内存地址,然后在栈里面存一个key是这个变量名,value是这个内存地址。
所以当我们吧a给b的时候,实际上是吧a的内存地址给了b,所以我们修改b的时候,a也会变
常见的引用类型
let a = {x:100};
let b = [];
let c = null; //特殊的引用类型,指针指向空地址
let d = function fn(){}; //特殊的引用类型,不存数据,所以没有深拷贝,复制函数这说法
2、typeof 运算符
typeof可以判断所有的值类型
也可以判断函数类型
能识别引用类型,只能识别为object,不能判断是数组还是对象
typeof null //object
3、深拷贝
let Obj = {
name:'potkiss',
age:90,
frineds:['aa','bb','cc'],
school:{
name:'dd'
},
day:null
}
//如果这里不用深拷贝的话,后面的就会影响
let b = deepClone(Obj);
b.school.name = 'll';
console.log(Obj)
/**
* 深拷贝
*/
function deepClone(obj){
if(typeof obj != 'object' || obj == null){
return obj
}
//初始化返回结果
let result
if(obj instanceof Array){
result = []
}else{
result = {}
}
for (const key in obj) {
//保证key不是原型的属性
if (obj.hasOwnProperty(key)) {
result[key] = deepClone(obj[key])
}
}
return result
}
4、变量计算-类型转换
4.1、什么时候用==,什么时候用===
除过判断一个值是否是null的时候用==,其他情况都用===。
因为这个情况的==,相当于xx === null || xx === undefined
4.2、if语句和条件判断
falsely变量:两次取反还是false的是falsely变量
常见的falsey变量----0、NAN、‘’、null、undefined、false
truely变量:两次取反后是true的是truely变量