知识点(一)instanceof 不能判断字面量
instanceof 、 typeof 的o都是小写哦。
// 123叫字面量,没有变量指定给它
console.log(123 instanceof Number) // false
易忘点
- instanceof 、 typeof 的o都是小写哦。
- typeof 也能输出 ‘function’ 和 ‘symbol’ 哦。
- Object的原型是null,它的构造函数是Object()。
- typeof 和 Object的toString方法输出的首字母都是小写的,后面有空格的单词(toString)就大写
比如 [object Undefined]) - 箭头函数不是没有arguments、this什么的,要准确使用限定词,它没有自己的arguments、this
知识点(二)深浅拷贝
浅拷贝
Object.assign({}, obj)
相同的属性名会被覆盖- 或者直接
for in
进行赋值也行
let res = Array.isArray(obj) ? [] : {};
for(let key in obj){
res[key] = obj[key]
}
深拷贝
JSON.parse(JSON.stringfy())
- 递归写法
function gura(obj){
if(typeof obj === 'object'){
let res = Array.isArray(obj);
for(let key in obj){
res[key] = gura(obj[key])
}
return res;
} else {
return obj;
}
}
- 改进递归写法,使用数据字典,用map
- 但是用map又是强引用,刁钻一点的说这不行,内存泄露,行,那就weakMap,弱引用的。
知识点(三)console.log(0.1)为什么就对了
consolelog会二进制转十进制再转字符串,转换过程中发生了取近似值,所以变了。
知识点(四)js是单线程,为什么能执行异步任务
因为js通常在浏览器中运行,浏览器是多线程的,不仅仅是异步请求,包括事件监听、计时器都是交给WebAPI运行的。
浏览器有以下常驻线程:
- 渲染引擎线程
- js引擎线程
- 事件触发线程
- 定时触发器线程
- 异步http请求线程
顺便提一嘴,为什么js不设置成多线程的,因为设置成多线程的话,一个线程要修改DOM,另一个线程要伤处这个DOM,浏览器就不知所措了。