JavaScript的本来面貌之默认结构

1,事件队列(异步和同步,异步的宏任务和微任务)
由于JavaScript底层的单线程,异步是必然。
异步是主线程对一些特殊任务的处理方式,比如settimeout、Promise。事件队列,英文event loop是专门处理特殊任务的。
异步又分宏任务和微任务,前者比如settimeout后者比如Promise。
一般微任务先于宏任务执行。

2,字面量和构造函数的变量区别
使用typeof操作符,变量为构造函数声明的值均为object
而直接字变量是分字符串、数字和布尔类型的。

3,变量的存储
基本数据类型的值直接在栈内存中存储;变量的值是独立的。
对象(引用数据类型)是保存到堆内存中的,每创建一个新的对象,就会在堆内存中开辟一个新的空间;而变量保存的是对象的内存地址(对象的引用),如果两个变量保存的是同一个对象引用,当一个变量修改属性是,另一个也会受到影响。

4,var声明变量和function声明函数的提升
var 声明变量会发生提升,提升到当前作用域的最前面。function也会提升。
同样名称的变量和函数,如果变量未被初始化,则function优先。

5,let的声明变量和const声明变量
let的变量有块级作用域,const的也有;const如果为对象,可以改变内部属性的值。

6,数值转换
if条件会自动进行布尔类型值转换
关系操作符:
如果一个数值和字符串比较,先将字符串强制转为数值
如果都是字符串,按照字符串编码比较
如果是对象先用valueOf,后可用toString
相等操作符:
字符串和数值比较,先转字符串为数值
对象和非对象,对象先用valueOf,然后是toString

7,闭包
闭包是作用域链的保持。

8,原型继承的原理
所有的数值,不管是基础类型和引用类型的都有一个私有属性,__proto__连接其上层对象,最终为null。
构造函数的实例没有原型,但是实例有__proto__,__proto__是连接属性,连接每层的prototype。prototype呈现了JavaScript的内部结构。上面有constructor等属性,实例是构造函数的一份拷贝。
实例基于构造函数创建,连接靠的还是__proto__。__proto__连接的是原型。

9,new 操作符发生了什么
1)首先创建一个空对象
2)将空对象的赋值给当前作用域的this
3)执行构造函数逻辑
4)返回这个对象

10,垃圾回收机制
主要关注引用计数。然后人为去除引用,下次回收时候回收变量,节省内存。

待续……