简单聊一下 JavaScript 语言特点

JS.jpeg

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第2天,点击查看活动详情

最近决定以博客形式重温前端技能树,就从 重学 JavaScript 系列开始吧。

如有舛误,还望各位大佬不吝指教。

本文配图部分来自于网络,若涉及版权问题,请及时联系作者删除!


伴生缺陷

总所周知,JavaScript 是 Brendan Eich 大佬花 10 天时间弄出来的。时间仓促,对于一门语言来说,自然会有很多缺陷及考虑不周的地方。

例如,同时设计了 undefinednull 来表示 “无” 的意义;===== 均可判断两个值是否相等,但 == 会有数据类型转换的问题。这都是设计不合理的地方,其他的就不过多赘述。

虽然 JS 有这样那样的缺陷,但架不住 JS 很早就被标准化,甚至许多程序就是利用某些缺陷特性来开发的,于是在语言的迭代过程中,也没有去修复它们。


解释型语言

从计算机底层来看,机器只能识别和执行二进制代码,所以所有用高级程序设计语言编写的代码都需要经过翻译才能交给机器去执行。

代码编译.png

翻译的方式有两种:编译解释
对应两种程序语言:

  • 编译型语言:C 语言、C++、...
    • 由编译器将代码预先通篇翻译后,生成编译结果,机器最终执行的是这个结果文件
    • 优点:由于已经翻译好了,直接执行,速度快,适合开发底层的东西(比如:操作系统)
    • 缺点:具体的编译结果,难以适应于各种环境(跨平台障碍),移植性差
graph LR
源代码 --> id1((编译器)) --> 目标代码 --> 程序执行 --> output
input --> 程序执行
复制代码
  • 解释型语言:JavaScrip、PHP、...
    • 不需要预编译,机器直接执行程序文件,看一行,翻译一行,执行一行
    • 优点:代码可跨平台,无需针对不同平台开发多套代码
    • 缺点:执行速度稍慢与编译型语言【V8 引擎弥补了 JS 在速度方面的缺点】
graph LR
源代码 --> id1((解释器)) --> 程序执行 --> output
input --> id1((解释器))
复制代码

从源码到机器码,中间还要转换为汇编语言,整个详细的转换过程本文不作讨论。

Java、C# 语言严格意义上讲,既不属于编译型也不属于解释型语言,因为它们都是先把代码翻译成一种中间状态,再通过技术手段在具体平台上二次翻译执行。


弱类型语言

编程语言还分弱类型强类型两种。

  • 弱类型语言(如 JS、PHP)

    • 存放的数据,类型可变,它不需要去考虑某个内存空间放的数据是什么类型。
    • 优点:灵活、易上手
    • 缺点:不严谨
    • 不指定数据类型会在开发大型应用程序的时候出很多问题,所以 JS 本身不具备开发大型应用程序的条件,但随着速度的提高,和很多补充插件、语言(TS)的出现,现在它有条件了
  • 强类型语言(如 Java、C 语言)

    • 它存放的数据类型就不可变,要预先规划指定
    • 优点:严谨
    • 缺点:不易上手

通常我们习惯将弱类型的解释型语言称为脚本语言


单线程

浏览器多线程:
当一个浏览器进程注入内存时,同时会伴有多个线程常驻其中。
包括但不限于:JS 引擎线程、GUI 线程、http 网络请求线程、定时器触发线程、浏览器事件监听线程、…
(个中细节,日后讨论)

虽然浏览器是多线程的,但其中的 JS 引擎线程(负责运行 JavaScript 程序)则是单线程运行的。

为什么 JS 引擎是单线程的 ?
主要原因是 JS 建立之初的用途是作为浏览器脚本语言完成用户交互,为避免用户短时多次连续触发,多线程同时运行而引起的结果不可预测,便将 JS 引擎设计成单线程架构。

H5 出现的 Web Worker 允许 JavaScript 创建新线程,不过由于其种种使用限制,并没有改变 JS 单线程本质。
(个中细节,日后讨论)

这意味着,对某个 JS 程序而言,前面的代码没有运行完,后面的代码必须等待,形成阻塞(页面卡顿的原因之一),所以 JS 是单线程的。

单线程语言因为有阻塞,所以执行效率可能没有多线程语言高,但是由于其简单,所以方便管理和控制程序行为。
多线程语言使用多个线程同时执行任务,虽然效率提升了,但程序复杂度也大大提升。

为提高代码的执行效率,JS 允许异步地操作代码。不改变单线程本质,JS 引擎主线程依旧是阻塞的,只不过会在执行到某些任务时将其扔到不妨碍主线程执行的单独的任务队列,当主线程空闲时再将其纳入主线程执行。

如此往复循环,通过时间片轮询的方式执行 JS 代码。

要深究其中细节,涉及到事件循环、同步任务、异步任务、事件队列、宏任务、微任务等概念,这个咱们日后再讨论。


写在最后

One day you'll leave this world behind.So live a life you will remember! --- Avicii

我是暮星,一枚有志于在前端领域证道的攻城狮。

优质前端内容持续输出中......,欢迎点赞 + 关注

点赞.jpeg

猜你喜欢

转载自juejin.im/post/7126817994948214792