Visual LabINTERACTIVE LEARNING
JavaScript 内核第 6 / 7 章

内置对象、线程与事件循环

从内置对象和异常处理延伸到进程、线程与浏览器事件循环。

this原型异步
进阶预计 65 分钟查看源文 ↗

内置对象

Array

构造函数

调用 Array() 时可以使用或不使用 new。两者都会创建一个新的 Array 实例

稀疏数组

某些方法对稀疏数组的处理是不一样的!

  • 不访问空槽的特殊处理

concat()copyWithin()every()filter()flat()flatMap()forEach()indexOf()lastIndexOf()map()reduce()reduceRight()reverse()slice()some()sort()splice()等较旧的方法,根本不会访问空槽

// [ 2, 3, <2 empty items>, 6 ]
const keys = Object.keys(arr); // [ '0', '1', '4' ] 跳过了空槽
for (const key in arr) {
  console.log(key);
 }
  // 输出:'0' '1' '4'
  
  
 // 在对象中使用展开,使用属性枚举,而不是数组的迭代器
 const objectSpread = { ...arr }; // { '0': 1, '1': 2, '4': 5 }
  • 将空槽合并为 undefined 元素,

方法有:entries()fill()find()findIndex()findLast()findLastIndex()includes()join()keys()toLocaleString()values()with()。 以及for ... of、展开运算符

使用数组默认迭代方法的都会合并成undiefined,如for...of , 展开运算符解构赋值promise.all

const a = [];
 a.length = 3; 
 // 获取数组的迭代器
  const iterator = a[Symbol.iterator](); 
  // 手动调用迭代器
   console.log(iterator.next()); // { value: undefined, done: false } 
   console.log(iterator.next()); // { value: undefined, done: false } 
   console.log(iterator.next()); // { value: undefined, done: false } 
   console.log(iterator.next()); // { value: undefined, done: true }

异常处理

错误抛出

  • 通过throw 抛出错误,throw下面的代码会中断执行,可以抛出多种数据类型
  • Error类是一个封装好的错误类,会包含message、stack、name
function bar(){
  // 基本类型 string/number/boolean/对象
  //throw '123'
  // throw 123
  // throw true
  // throw {message:'这是一个错误'}
  throw new Error('这是一个默认的错误')
}

try {
  bar()
} catch (error) {
// error是一个对象
  console.log('error.message', error.message)
}

错误捕获

  • 错误如果没有捕获,会沿着调用栈一层一层往上传递,最后到达浏览器层,每一层都会阻断后面的代码执行
function bar(){
  throw new Error('这是一个默认的错误')
  console.log('after bar') //不会执行
}

function foo() {
  bar()
  console.log('after foo')//不会执行
}

function outfoo() {
  foo()
  console.log('after outfoo')//不会执行
}

outfoo()
console.log('after outside')//不会执行
  • 捕获方式
try {
  //执行的代码
} catch (error) {
  //如有错误
}finally {
//最终都会执行
}

进程/线程

  1. 进程 计算机已运行的程序,是操作系统管理程序的一种方式
  2. 线程 操作系统能够运行运算调度的最小单位,通常包含在进程中

浏览器事件循环

js是单线程,浏览器是多进程管理的,每个tab都是一个单独的进程,每个进程里有多个线程,其中一个线程就是j专门执行avascript的线程,叫javascript线程

js是基于事件驱动的单线程-异步-非阻塞

基于宏微任务和事件循环模式实现的

一些特定的操作并非由javascript线程执行的,而是由浏览器执行的,如setTimeOut是由javascript执行,但是具体的计时是在其他线程来实现的

飞书画板

执行一个宏任务后,会先去清空微任务队列,才会切换到去执行下一个宏任务