方法#
Object#
hasOwnProperty#
Object.hasOwnProperty(“val”); 指示对象自身属性中是否具有指定的属性
类型转换#
ToNumber#
true: 1、false: 0、undefined: NaN、null: 0。
等于 隐式转换#
抽象相等#
非常规:NaN != NaN、+0 == -0
字符串和数字:ToNumber(字符串);
ToPrimitive(input, preferedType?)#
input: 要转换的对象
preferedType: 期望转换的基本类型
preferedType 省略时,日期会被认为是字符串,而其他值会被当做 number。
执行过程:
- 转换的类型是 number
- input 是原始值,直接返回这各值;
- 否则,input 是对象,调用 input.valueOf(),如果结果是原始值,返回结果;
- 否则,调用 input.toString() 。如果结果是原始值,返回结果。
- 否则,抛出错误。
- 转换的类型是 string,步骤2 和 步骤3 交换执行,即先执行 toString() 。
样例#
null == 0 // false; null 在做相等判断时,不进行转型。
事件循环#
https://mp.weixin.qq.com/s/4nSLIH9MkzqZFQktGXDDSw
处理过程#
- 在所选 task queue (taskQueue)中约定必须包含一个可运行任务。如果没有此类 task queue,则跳转至下面 microtasks 步骤。
- 让 taskQueue 中最老的 task (oldestTask) 变成第一个可执行任务,然后从 taskQueue 中删掉它。
- 将上面 oldestTask 设置为 event loop 中正在运行的 task。
- 执行 oldestTask。
- 将 event loop 中正在运行的 task 设置为 null。
- 执行 microtasks 检查点(也就是执行 microtasks 队列中的任务)。
- 设置 hasARenderingOpportunity 为 false。
- 更新渲染。
- 如果当前是
window event loop
且 task queues 里没有 task 且 microtask queue 是空的,同时渲染时机变量 hasARenderingOpportunity 为 false ,去执行 idle period(requestIdleCallback
)。 - 返回到第一步。
task#
- DOM 操作任务源,比如一个元素以非阻塞的方式插入文档
- 用户交互任务源,用户操作(比如 click)事件
- 网络任务源,网络 I/O 响应回调
- history traversal 任务源,比如 history.back()
- Timers (
setTimeout
、setInterval
等) - IndexDB 操作
microtask#
- promises
- MutationObserver
- Object.observe
- process.nextTick (这个东西是 Node.js 的 API,暂且不讨论)
内存泄漏#
4种JavaScript内存泄漏浅析及如何用谷歌工具查内存泄露 - 心里有数 - 博客园 (cnblogs.com)
- 意外的全局变量
- 被遗忘的计时器或回调函数
- 脱离 DOM 的引用
- 闭包
箭头函数和普通函数的区别#
- 外形不同:箭头函数使用箭头定义,普通函数中没有。
- 箭头函数都是匿名函数
- 箭头函数中this的指向不同,箭头函数本身不创建this,this一旦被捕获,就不再发生变化。.call()/.apply()/.bind()无法改变箭头函数中this的指向
- 其他区别
- 箭头函数不能Generator函数,不能使用yeild关键字。
- 箭头函数不具有prototype原型对象。
- 箭头函数不具有super。
- 箭头函数不具有new.target。
EventLoop 事件循环#
- 一开始整段脚本作为第一个宏任务执行
- 执行过程中同步代码直接执行,宏任务进入宏任务队列,微任务进入微任务队列
- 当前宏任务执行完出队,检查微任务队列,如果有则依次执行,直到微任务队列为空
- 执行浏览器 UI 线程的渲染工作
- 检查是否有Web worker任务,有则执行
- 执行队首新的宏任务,回到2,依此循环,直到宏任务和微任务队列都为空
语法#
with#
不推荐使用,严格模式下 with 也是被禁用
with (console) { // 执行时,先在 console 里查找, 查不到则冒泡向上查找 log('I dont need the "console." part anymore!');}
往上下文注入了 console 对象,而 console.log 这个属性就被注册到了这个 Scope 里。
function getAverage(min, max) { with (Math) { // 此时 min 和 max 分别为 Math.min 和 Math.max return round((min + max) / 2); }}
getAverage(1, 5); // return NaN