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,垃圾回收机制

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

待续……

1,谷歌浏览器同时支持冒泡和捕获,如何给body元素设置捕获,而给页面中嵌套两个元素设置冒泡,那么点击嵌套的内部元素时候,首先执行body上的事件,也就是捕获,而后到了事件对象元素在进行冒泡事件。

2,对象的继承:对象的继承的最理想模式是寄生组合式继承,常用的是组合式继承,组合式继承利用的是call方法继承属性赋值,父实例赋值给子构造函数原型继承原型。