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方法继承属性赋值,父实例赋值给子构造函数原型继承原型。