作一个好前端必需要知道的事——JS语言

编程语言按各类方法能够分为各类类型,如今让咱们来看看JS属于什么类型语言

解释型语言

按编译执行过程,能够分为编译型语言和解释型语言。好比css

  • c 语言,必须先通过编译生成目标文件,而后连接各个目标文件和库文件,生成可执行文件。
  • Java、scala 则是先编译成字节码,而后解释执行字节码(能够理解为编译型语言也能够理解为解释型语言)。准确的理解,java 是编译型语言,源代码整个编译成字节码,java 字节码,是解释型语言。
  • Python 是解释型语言,不过也能够先进行编译,编译成 python 的字节码。
  • Javascript 是解释型语言。目前貌似尚未直接将 js 整个编译而后才执行(有说法是 js 动态性太强,先总体编译难度太大,执行性能不如解释执行高)。

⚠️注意:解释型语言也是须要编译的。区分编译型语言和解释型语言,是看源代码是否整个编译成目标代码而后执行仍是编译一段执行一段。
对于传统编译型语言来讲,编译步骤分为:词法分析、语法分析、语义检查、代码优化和字节生成。
但对于解释型语言来讲,经过词法分析和语法分析获得语法树后,就能够开始解释执行了(根据语法树和符号表生成机器码)。
这也就解释了为何都说 js 是解释执行的,读一句执行一句,可是实际上 js 中还没执行到的代码语法错误致使整个 js 不会执行的问题。例如:html

console.log('不会被console出来');
= // 这里的语法错误致使了上面的代码也不会执行

其实js变量提高的现象也很明显的证实了js是先编译然后执行的
在浏览器中,多个<script>标签中的 js 代码,是分段编译的(因此,某一个<script>标签中的语法错误不会致使另外一个<script>中的代码不执行)可是全局对象是共享的。java

动态语言

按语言按变量的类型在编译时肯定仍是运行时肯定能够分为静态语言和动态语言。好比python

  • java,String s = null; 变量 s 的类型在编译时就能够肯定为字符串类型。
  • python,变量不须要声明,变量的类型在第一次赋值时由值的类型肯定。
  • js,let val;let = ‘1’; 变量 val 在运行 val=’1’时才能肯定为字符串类型。

弱类型语言

按变量的类型是否在运行时能够改变分为强类型语言和弱类型语言。好比git

  • Java、scala 是强类型语言,变量一旦声明,它的类型之后不能被改变。
  • Python 是强类型语言。
  • Js 是弱类型语言。好比 let v = ‘1’;v=1;v=true;这在 js 中是合法的。

很是灵活的语言

按语言范式能够分为声明式、命令式、函数式语言。github

  • 声明式编程,告诉计算机我要作什么,而不是如何作。在更高层面写代码,更关心的是目标,而不是底层算法实现的过程。例如 css, 正则表达式,sql 语句,html, xml…
  • 命令式编程,告诉计算机如何作,而无论我想要作什么。解决某一问题的具体算法实现。例如 java、c。
  • 函数式编程,将计算机运算看作是数学中函数的计算,而且避免了状态以及变量的概念。

不少语言并非单纯的支持某一种范式,像 java8 也添加了部分对函数式的支持。
js 是一个很是灵活的语言,支持命令式和函数式编程。正则表达式

各类类型语言的优缺点

  • 通常编译型语言性能比解释型语言高。可是因为编译型语言须要先进行编译。
  • 解释型语言的好处是,部署到线上的是源代码,能够直接修改线上环境的代码,解决一些 bug。好比咱们有时候直接修改线上的 js 代码。
  • 编译型语言一般会用 xml 作配置文件,由于咱们一般不会改编译后的字节码。解释型语言的配置,直接写在源代码里更方便,用 xml 作配置就显得多余。
  • 静态语言,有利于编译时检查。好比 java、在 ide 中为对象的一个不存在的属性赋值能在编译时检查出错误。
  • Js 是动态语言。对象的某个属性是否存在,在编译时没法肯定。这致使某些错误要到运行时才可能发现。因此通常 js 程序的正确性,更须要单元测试保证
  • 强类型语言因为类型在声明以后不容许改变,因此能实现编译时类型检查。动态语言和弱类型语言,则更灵活,实现相同功能的代码量一般更少或者更容易实现复杂功能。固然可读性可维护性方面不如静态语言和强类型语言。
此文整理自前同事 @zhoujiaping的分享
相关文章
相关标签/搜索