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

编程言语按种种要领能够分为种种范例,如今让我们来看看JS属于什么范例言语

诠释型言语

按编译实行历程,能够分为编译型言语和诠释型言语。比方

  • c 言语,必须先经由编译天生目的文件,然后链接各个目的文件和库文件,天生可实行文件。
  • Java、scala 则是先编译成字节码,然后诠释实行字节码(能够明白为编译型言语也能够明白为诠释型言语)。正确的明白,java 是编译型言语,源代码全部编译成字节码,java 字节码,是诠释型言语。
  • Python 是诠释型言语,不过也能够先举行编译,编译成 python 的字节码。
  • Javascript 是诠释型言语。现在貌似还没有直接将 js 全部编译然后才实行(有说法是 js 动态性太强,先团体编译难度太大,实行机能不如诠释实行高)。

⚠️注重:诠释型言语也是须要编译的。辨别编译型言语和诠释型言语,是看源代码是不是全部编译成目的代码然后实行照样编译一段实行一段。
关于传统编译型言语来讲,编译步骤分为:词法剖析、语法剖析、语义搜检、代码优化和字节天生。
但关于诠释型言语来讲,经由过程词法剖析和语法剖析获得语法树后,就能够最先诠释实行了(依据语法树和符号表天生机器码)。
这也就诠释了为何都说 js 是诠释实行的,读一句实行一句,然则实际上 js 中还没实行到的代码语法毛病致使全部 js 不会实行的题目。比方:

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

实在js变量提拔的征象也很明显的证明了js是先编译然后实行的
在浏览器中,多个<script>标签中的 js 代码,是分段编译的(所以,某一个<script>标签中的语法毛病不会致使另一个<script>中的代码不实行)然则全局对象是同享的。

动态言语

按言语按变量的范例在编译时肯定照样运转时肯定能够分为静态言语和动态言语。比方

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

弱范例言语

按变量的范例是不是在运转时能够转变分为强范例言语和弱范例言语。比方

  • Java、scala 是强范例言语,变量一旦声明,它的范例今后不能被转变。
  • Python 是强范例言语。
  • Js 是弱范例言语。比方 let v = ‘1’;v=1;v=true;这在 js 中是正当的。

异常天真的言语

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

  • 声明式编程,通知盘算机我要做什么,而不是如何做。在更高层面写代码,更体贴的是目的,而不是底层算法完成的历程。比方 css, 正则表达式,sql 语句,html, xml…
  • 敕令式编程,通知盘算机如何做,而不论我想要做什么。处理某一题目的详细算法完成。比方 java、c。
  • 函数式编程,将盘算机运算看作是数学中函数的盘算,而且避免了状况以及变量的观点。

许多言语并非纯真的支撑某一种范式,像 java8 也添加了部分对函数式的支撑。
js 是一个异常天真的言语,支撑敕令式和函数式编程。

种种范例言语的优缺点

  • 平常编译型言语机能比诠释型言语高。然则由于编译型言语须要先举行编译。
  • 诠释型言语的优点是,布置到线上的是源代码,能够直接修正线上环境的代码,处理一些 bug。比方我们有时候直接修正线上的 js 代码。
  • 编译型言语一般会用 xml 做设置文件,由于我们一般不会改编译后的字节码。诠释型言语的设置,直接写在源代码里更轻易,用 xml 做设置就显得过剩。
  • 静态言语,有利于编译时搜检。比方 java、在 ide 中为对象的一个不存在的属性赋值能在编译时搜检出毛病。
  • Js 是动态言语。对象的某个属性是不是存在,在编译时没法肯定。这致使某些毛病要到运转时才能够发明。所以平常 js 顺序的正确性,更须要单元测试保证
  • 强范例言语由于范例在声明以后不允许转变,所以能完成编译时范例搜检。动态言语和弱范例言语,则更天真,完成雷同功用的代码量一般更少或许更轻易完成庞杂功用。固然可读性可维护性方面不如静态言语和强范例言语。

此文整顿自前同事
@zhoujiaping的分享

    原文作者:Gauch
    原文地址: https://segmentfault.com/a/1190000017148547
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞