Skip to content

JavaScript

· 5 min

方法#

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。

执行过程:

样例#

null == 0 // false; null 在做相等判断时,不进行转型。

事件循环#

https://mp.weixin.qq.com/s/4nSLIH9MkzqZFQktGXDDSw

处理过程#

  1. 在所选 task queue (taskQueue)中约定必须包含一个可运行任务。如果没有此类 task queue,则跳转至下面 microtasks 步骤。
  2. 让 taskQueue 中最老的 task (oldestTask) 变成第一个可执行任务,然后从 taskQueue 中删掉它。
  3. 将上面 oldestTask 设置为 event loop 中正在运行的 task。
  4. 执行 oldestTask。
  5. 将 event loop 中正在运行的 task 设置为 null。
  6. 执行 microtasks 检查点(也就是执行 microtasks 队列中的任务)。
  7. 设置 hasARenderingOpportunity 为 false。
  8. 更新渲染。
  9. 如果当前是 window event loop 且 task queues 里没有 task 且 microtask queue 是空的,同时渲染时机变量 hasARenderingOpportunity 为 false ,去执行 idle period(requestIdleCallback)。
  10. 返回到第一步。

task#

microtask#

内存泄漏#

4种JavaScript内存泄漏浅析及如何用谷歌工具查内存泄露 - 心里有数 - 博客园 (cnblogs.com)

  1. 意外的全局变量
  2. 被遗忘的计时器或回调函数
  3. 脱离 DOM 的引用
  4. 闭包

箭头函数和普通函数的区别#

  1. 外形不同:箭头函数使用箭头定义,普通函数中没有。
  2. 箭头函数都是匿名函数
  3. 箭头函数中this的指向不同,箭头函数本身不创建this,this一旦被捕获,就不再发生变化。.call()/.apply()/.bind()无法改变箭头函数中this的指向
  4. 其他区别
    • 箭头函数不能Generator函数,不能使用yeild关键字。
    • 箭头函数不具有prototype原型对象。
    • 箭头函数不具有super。
    • 箭头函数不具有new.target。

EventLoop 事件循环#

  1. 一开始整段脚本作为第一个宏任务执行
  2. 执行过程中同步代码直接执行,宏任务进入宏任务队列,微任务进入微任务队列
  3. 当前宏任务执行完出队,检查微任务队列,如果有则依次执行,直到微任务队列为空
  4. 执行浏览器 UI 线程的渲染工作
  5. 检查是否有Web worker任务,有则执行
  6. 执行队首新的宏任务,回到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