写在开头:本篇文章主要涉及一些极为基础的概念知识点,但是如果能够透彻的理解对于实际工作当中应该也还是有一定的作用的。ps:所有内容均个人总结,只能作为借鉴,不能保证百分之百的正确————一个八个月大的前端
语言类型
在代码的世界里面,代码语言也是有类别区分的,而区分的依据则是根据不听代码语言的特性所致。作为目前前端的绝对主宰语言JavaScript,他当然也有自己的类型及特性。
- 动态类型类型:即在运行期间代码可以根据某些条件改变自身结构。优点很是明显,代码编译自由度极高。缺点也很是明显,不执行就检测不出错误。
- 弱类型语言:即能进行隐式类型转换,例如无需定义类型即可进行赋值操作。注:==也会进行隐式类型转换。优点:代码灵活度高。缺点:由于涉及到隐式类型转换,需要谨慎注意。ps:目前typeScript已经被大部分前端代码工程师所接受,算JavaScript的超级,支持类型定义,但就根本上来说仍然不算强类型语言,只是从编译时就能检测错误。
- 解释型语言:即在运行程序的时候才逐行翻译,优点:跨平台较容易,通俗点来说就是生存能力强。缺点:效率较低,不能脱离解释器独立运行。
进程与线程
相信每一个前端代码工程师都对一句话了熟于心,那就是:JavaScript是单线程运行的。那么这里就出现了一个有意思的名词——线程。什么是线程,他和操作系统中的另一概念进程有什么关系吗?有了单线程,是否就意味着还有多线程?这些问题,我们都是可以去思考的。
进程是指操作系统中已运行的程序,线程则是指操作系统能够进行运算调度的最小单位。被包含在进程之中,是进程中的实际运作单位,也可以看作是程序中的子程序。
简单来说,如果把进程比作一个已经打开的浏览器,那么进程就是浏览器中不同的便签窗口。或者可以比作一个充满了各类货物的仓库。一辆辆运输卡车运送着不同类别的货物,虽然他们都是属于卡车,但他们运输的东西不同,且在同一时间只能做一件事情,也就是不同的进程。
现在我们再回过头来看JavaScript是单线程运行的这句话:这时我们就可以很简单性的理解为,JavaScript作为一类代码语言,在同一时间只能由唯一的执行环境来执行,从而实现其要做的事情。
当明白了单线程的定义之后,自然就可以明白有单线程自然就会有多线程,相对于单线程执行,多线程显然具有更高的执行效率。毕竟人多力量大嘛。只是为什么JavaScript在设计之初,走上了单线程运行的不归路呢?
原因其实也很简单,作为JavaScript的主战场——浏览器,他必须要具有人机之间纯粹简单而又直接的交互特性。而想要保持这一特性,我们就必须要在尽可能的避免操作冲突的基础上,去迎合JavaScript代码特性即代码高度自由化。于是单线程运行模式也就应运而生了。
内存
简单来说,操作系统中所有程序的运行都是在内存中进行的。既然我们讲到了JavaScript是单线程运行,那么对于JavaScript运行环境的内存分配也是应该有一定的了解的。
对于一些底层语言(C语言)一般都有底层的内存管理接口,用于开辟及释放内存空间,但是对于JavaScript来说,为了不让程序员费心分配内存,JavaScript在定义变量时就已经完成了内存分配。并且在不再使用它们时“自动”释放,即垃圾回收机制。但这种回收机制也是存在一定的局限性的。这里不多赘述,本篇文章主要是补充是来补充基础的。
和其他代码语言相似,JavaScript中也是分为栈内存和堆内存。只是没有C/C++那般严格意义的区分罢了。
栈内存当中一般被认为用来存储两类数据。
- 基础数据类型:number、string、null、undefined、boolean、Symbol
- 函数以及复杂数据类型对应的指针地址(也可以理解为复杂数据类型的调用接口)
堆内存则是用来存放一些“代价”较大,内存存储空间不明的数据(存储空间不明,是因为JavaScript的动态语言特性)。即复杂类型的数据:对象(数组及类数组、日期、键控集、JSON等等)
对于栈内存存储的数据总结下来有以下特性:
- 空间小,运行效率高
- 内存占用固定,是由系统自主分配的。
- 主要是用来执行存放在此的函数的。
而对于堆内存中存储的数据特性如下:
- 内存占用空间较大(代价高)。
- 可动态调整,是由程序员通过代码进行分配,
- 主要用来存放对象
最后说两句:这是我第一次发表文章,以前总认为看了记了运行了,就代表着自己懂了会了,可实际只有在总结表达的时候,才能够明白。只有你真的能将这些写成字,梳理成知识点,才能够勉强说明自己开始掌握了。本篇文章极为基础,但应该还是有些许的实用价值的。