js部分
js 基础
基本类型
- 原始类型(值传递)
- string
- number
- null
- undefined
- boolean
- symbol
- 对象(地址传递)
- 函数(地址传递)
- 原始类型(值传递)
类型判断
- typeOf
- 除了 null 其他都能是正确类型
- 除原始类型以及函数外都是 object
- instanceOf
- 不能正确处理原始类型
- 原型连
- 不能准确判断类型
- typeOf
类型转换
- 转换布尔值
- 除 null undefined 空窜 0 false NaN 都是 true
- 转换数字
- 空数组 0 数组只有一个数值 转换为数值
- 空字符串 0
- 对象 转化为 NaN
- “1”–> 1 Object –> NaN true –> 1 false –> 0 Null –> 0 “any”–> NaN
- 转换字符串
- Object –> [Object Object] Array –> Array.join(‘,’)
- 对象转换为 原始类型
- 判断 valueOf() 是否转化为原始类型 如果不是调用 toString() 方法
- 所以 空数组转换为 0 情况
- 加法转换
- 如果一方为字符串 另一方也会转换为字符串
- 如果不是字符串或则数值会通过 转化为原始类型顺序处理
- 比较转换
- === 基础类型不进行转换 直接比较,任意一个条件不满足就是不同
- == 进行以下转换(转换为相同类型再进行比较)
- 都是对象则地址比较
- 一方为原始类型则另一方转换为原始类型比较
- 编码比较 unicode
- 转换布尔值
this
- 指向调用函数
- 指向apply函数
- 指向bind函数(只能绑定一次)返回闭包
闭包
- 一个函数可访问另一函数作用域内的局部变量
拷贝
- 深拷贝
JSON处理
- 因为转换成字符串,所以 undefined function symbol 无法复制 循环引用处理不来
MessageChannel 可以处理不包含函数的 对象深拷贝
1
2
3
4
5
6
7
8
function deepClone(obj){
return new Promise((resolve)=>{
const {port1, port2} = new MessageChanel()
port1.onmessage = msg=> resolve(msg.data)
port2.postMessage(obj)
})
}deepCopy
- 浅拷贝(只拷贝一层)
- Object.assign() 展开符
- Array.slice()
- 深拷贝
原型链
- 多个对象通过__proto__ 链接起来
- child.proto = 构造函数.prototype = 原型;原型.proto = 父级原型;原型.constructor = 构造函数
- 原型的 constructor 属性指向构造函数,构造函数又通过 prototype 属性指回原型
- Function.proto.constructor === Function === Function.prototype
- 对象里有_proto_这个属性。它指向原型,由它连接对象和原型组成原型链,同时原型里又有prototype属性,该属性里有一个constructor又指向回对象的构造函数形成一个闭环
模块化
- 优点
- 解决命名冲突
- 提高复用性
- 提高可维护性
- amd
- 依赖前置
- 先加载所有模块
- cmd
- 依赖后置
- 需要时引用
- CommonJS
- module.exports === exports
- exports 是module.exports的引用,不可直接赋值
- 优点
setInterval通常来说不
- 建议使用 setInterval。第一,它和 setTimeout 一样,不能保证在预期的时间执行任务。第二,它存在执行累积的问题,请看以下伪代码
事件循环
- macroTask(jobs)
- 宏任务 script , setTimeout ,setInterval ,setImmediate ,I/O ,UI rendering
- microTask(task)
- 微任务 process.nextTick ,promise ,MutationObserver
- 6个阶段
- timer 执行 setTimeout 与 setInterval
- io 执行 I/O 操作
- idle, prepare
- poll
- 回到 timer 阶段执行回调
- 执行 I/O 回调
- macroTask(jobs)
手写bind
1
2
3
4
5
6
7
8
9
10function bind(){
const _this = this
const args = Array.from(arguments).slice()
return function F(){
if(this instanceOf F){
return new _this(...args, ...arguments)
}
_this.apply(args.shift(), args.concat(arguments))
}
}