1、类型分类
(1)值类型,存在栈中(栈,从上到下)
- Number
- String
- Boolean
- undefined
- Symbol(es6新增)
(2)引用类型,存在堆中(堆,从下到上)
- Object
- Array
- Function(特殊的引用类型,不能存储数据,所有没有复制、拷贝函数一说)
- null(特殊的引用类型,指向一个空地址)
2、typeof(返回的是字符串)
能识别所有的值类型 识别函数 判断是否是引用类型(不可再细分,细分用instanceof;instanceof原理实际就是查找目标对象的原型链)
3、深浅拷贝(答案放在最后)
let obj1={
name:'zhangsan',
age:18,
likes:['001','002','003'],
have:{
x:{
y:{
z:'hi boy!'
}
}
},
say:'hello,我是张三'
}
// 手写深拷贝
function deepClone(obj={}){
// obj是null或者不是数组或对象
if(typeof obj !== 'object' || obj == null){
return obj
}
// 初始化结果
let result
if(obj instanceof Array){
result=[]
}else{
result={}
}
// 遍历、递归***
for(let key in obj){
result[key]=deepClone(obj[key])
}
// 返回结果
return result
}
/**
* 浅拷贝
* obj1直接复制给obj2
* obj2执行obj1的内存地址
* 修改obj2影响obj1
*/
let obj2=obj1
obj2.say="hello,我是赵四"
console.log('浅拷贝,修改副本,影响原件',obj1.say);
/**
* 深拷贝
* 递归是重点
* 修改obj3不影响obj1
*/
let obj3=deepClone(obj1)
obj3.say='hello,我是王五'
console.log('深拷贝,修改副本,不影响原件',obj1.say);
4、类型转换
字符串拼接 ==(除了==null外,其他一律用===;==null相当于===null||===undefined) if语句和逻辑运算(truly变量,两步非运算后等于true的变量;falsely变量,两步非运算后等于false的变量)( && 返回第一个falsely变量; || 返回第一个truly变量;! )
5、面试题
0.1+0.2=0.3? 0.2+0.3=0.5? 思路: a,b都转为二级制进行计算,得到的结果c取52位尾数位后,再转为十进制 c1取52位尾数位后,转成的十进制数不等于0.3了 c2取52位尾数位后(52位尾数位恰巧都是0),转成的十进制数等于0.5
console.log(0.1) 思路: 0.1转成二进制,再转成十进制,再转成字符串(转换的过程中取了近似值),所以打印出来的还是0.1