JS是一门什么样的语言?有什么特点
JS是运行在浏览器中的脚本语言,不需要编译就可以由解释器直接运行的,变量松散定义,属于弱语言类型。
说几条JS的基本规范
- 不要在同一行声明多个变量;
- 用 === 代替 ==;
- Switch语句要有default分支
- 构造函数首字母大写,常量用大写字母
- 使用对象字面量代替new Function(){}
数据类型及存储方式
基本数据类型:Null Undefined String Boolean Number(Symbol)
引用类型:Object
基本数据类型,占用内存小,大小固定,且频繁使用,存放在栈中。
引用类型占用内存大,大小不固定存放在堆中。
堆内存和栈内存的区别
栈内存存放基本数据类型和执行环境
堆内存存放复杂的引用类型(数组就是数组,方法是代码字符串)
Typeof instanceof
Typeof检测数据类型的方法,返回字符串
Instanceof检测一个对象是否是某个对象的实例(确定某个值是哪种引用类型)
数组方法
Pop push Shift unshift reserve sort
Concat链接 slice截取 splice插入
Indexof lastindexof
Every:每一项都返回true,则返回true
Some:任一项返回true,则返回true
Map:结果组成的数组
Filter:返回true的项的数组
Foreach:没有返回值
闭包
闭包最常见的创建方式是在一个函数内创建另一个函数。他的作用是为了记住变量和作用域,形成一个不销毁的栈内存,方便后面调取使用。
作用域(链)
闭包有这种能力我认为得益于作用域链,作用域链揭示了变量和函数的搜索路径。
当一个函数被创建时,会创建一个预先包含全局变量对象的作用域链,存放在scope属性中,当这个函数执行时,会创建一个执行环境并通过复制scope属性中的作用域链创建起执行环境的作用域链,此后,又会有一个活动对象被推入执行环境的作用域的前端。
一般来讲,当函数执行完毕后会将局部函数销毁,只留下全局作用域,但闭包不同,闭包中存着包含函数的作用域,只有当闭包销毁后,他的包含函数才能被销毁。这就是为什么他能保存变量和作用域的原因。也因为这个,他会占更多的内存,最好在我们需要的时候使用。
垃圾回收
标记清除
引用记数
New
- 创建一个新的对象
- 这个新的对象会被执行prototype链接
- This指向这个新的对象
- 如果函数没有返回其他对象,那么表达式中的函数会自动返回这个新对象
This
- this在函数被调用时发生绑定,他指向什么取决于在哪被调用
- 四种绑定方式:默认绑定、
隐式绑定(obj.foo())、
显式绑定:call(参数列)、apply(参数数组)、bind(对象,...)
New绑定
变量提升
变量在被提升到作用域前面进行声明,所以变量可以先使用后声明。
JS运行机制
Js是单线程的,优先同步任务,后执行异步任务。遇到异步任务需要挂起。
事件循环:1.所有的同步任务都在主线程上执行,形成一个执行栈。
2.主线程之外还存在着一个任务队列,只要异步操作执行完成,就到任务队列中排队
3.当执行栈中所有任务执行完毕,系统会按次序读取消息队列中的异步任务,开始执行。
4.主线程会不断重复上一步。
由于主线程不断重复获得事件,执行事件,再获得事件,执行事件称为事件循环。