JS基本类型数据存储方式及Event Loop

基礎内容

var a = String('1122')
typeof(a)
"string"
var b = new String('1122')
typeof(b)
"object"
var c = '122121'
typeof(c)
"string"

栈内存 和 堆内存

1. JavaScript 中引用类型值的大小是不固定的,因此它们会被存储到 堆内存 中,由系统自动分配存储空间。
JavaScript 不允许直接访问堆内存中的位置,因此我们不能直接操作对象的堆内存空间,而是操作 对象的引用。

2. JavaScript 中的基础数据类型都有固定的大小,因此它们被存储到 栈内存 中。
我们可以直接操作保存在栈内存空间的值,因此基础数据类型都是 按值访问。此外,栈内存还会存储 对象的引用 (指针) 以及 函数执行时的运行空间。
不同存储类型

执行栈 和 任务队列

console.log('00000')
setTimeout(function(){
  console.log('2')
},1000)
console.log('11111')
setTimeout(function(){
  console.log('1')
},1000)
console.log('22222')
setTimeout(function(){
  console.log('3')
},1000)

结果:
VM347:1 00000
VM347:5 11111
VM347:9 22222

VM347:3 2
VM347:7 1
VM347:11 3

从上面的执行顺序可看出
1.系统会先执行 同步操作,同步操作是最先并速度比较快的
2.异步操作 会放置在 任务队列 里,先进先出(执行)

补充理解:
① 执行栈内 会先执行所有同步操作,同步任务执行完后,会检查任务队列中 是否还有(异步)任务,
② 有的话,便会把任务放置到执行栈中执行,并且,任务队列前面会有异步处理模块,待异步处理有结果才会被放到任务队列中。
③ 任务队列每次只处理一个任务,即当执行栈检查到任务队列不为空时,就取头一个任务放到执行栈,基于Event-loop事件循环机制,执行栈中处理完头一个异步任务后,便会再次查询任务队列,不为空则再从中取头一个,直至任务队列为空。

参考网文:

  1. js的基本数据类型有哪些?
  2. 最后一次搞懂 Event Loop

你可能感兴趣的:(JS基本类型数据存储方式及Event Loop)