01_JS基础 - 邂逅JavaScript

103 阅读10分钟

邂逅JavaScript

编程语言 VS 计算机语言

计算机语言是人和计算机之间进行"沟通"的桥梁,是人和计算机进行交流的方式

计算机语言

计算机语言(computer language)指用于人与计算机之间通讯的语言。计算机语言是人与计算机之间传递信息的媒介。

计算机语言比编程语言更为的广泛,一门语言必然是计算机语言,但是其不一定是编程语言

例如HTML是一门标记语言,其必然是计算机语言,但是其并不是编程语言

HTML本质上就是为数据添加上了对应的标记,以方便浏览器对其结构进行解析,仅此而已

也就是说HTML本身并不是程序

编程语言

编程语言(英语:programming language),是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令,一种能够让程序员准确地定义计算机所需要使用数据的计算机语言,并精确地定义在不同情况下所应当采取的行动

也就是说编程语言必须具备如下特点:

  1. 数据和数据结构

    • 编程语言可以定义数据,并且存在不同数据类型及对应不同的存储结构
  2. 指令和流程控制

    • 编程语言可以向计算机发出指令,控制代码的执行
    • 所以一个编程语言会存在分支结构/循环结构/顺序结构
  3. 引用机制和重用机制

    • 为了减少代码的冗余性,提升代码的可维护性和可读性
    • 编程语言一般都有自己的重用行为 -- 在JavaScript中即为对象和函数
    • 引用机制表示为基本数据类型直接存值,复杂数据类型存储对应的引用地址
  4. 编程哲学

    • 编程语言会存在自己的设计思想
    • 如面向对象语言和函数式语言
    • 如强数据类型语言和弱数据类型语言
    • 如动态类型语言和非动态类型语言
    • 。。。

编译语言发展历史

Snipaste_2022-11-01_08-44-25.png

任何一门编程语言最终都需要由计算机来进行运行,所以任何一门编程语言都需要转换为0和1后,交给计算机的硬件去帮助我们进行代码的运行

所以早期的语言都比较接近于硬件,符合计算机的思维方式,但是计算机的思维和人的思维方式差异较大,所以现代的编程语言更符合于人的思维方式,但这也就意味着远离了硬件,对应的代码需要经过一定形式的编译和转换后,形成对应的机器语言,才可以交给计算机来进行运行

Snipaste_2022-11-01_08-45-35.png

机器语言

计算机的存储单元只有0和1两种状态,因此一串代码要让计算机“读懂”,这串代码只能由数字0和1组成

像这种由数字0和1按照一定的规律组成的代码就叫机器码,也叫二进制编码

一定长度的机器码组成了机器指令,用这些机器指令所编写的程序就称为机器语言

Snipaste_2022-11-01_10-03-35.png

◼优点

  • 代码能被计算机直接识别,不需要经过编译解析
  • 直接对硬件产生作用,程序的执行效率非常高

◼缺点

  • 程序全是些0和1的指令代码,可读性差,还容易出错,且编写不易

汇编语言

为了解决机器语言的缺陷,人们发明了另外一种语言——汇编语言

这种语言用符号(助记符)来代替冗长的、难以记忆的0、1代码。 (mov/push指令,经过汇编器,汇编代码再进一步转成0101)

◼优点

  • 像机器语言一样,可以直接访问、控制计算机的各种硬件设备
  • 占用内存少,执行速度快

◼缺点

  • 不同的机器有不同的汇编语言语法和编译器,代码缺乏可移植性

    也就是说,一个程序只能在一种机器上运行,换到其他机器上可能就不能运行

  • 符号非常多、难记

    即使是完成简单的功能也需要大量的汇编语言代码,很容易产生BUG,难于调试

  • 应用场景

    操作系统内核、驱动程序、单片机程序;

高级语言

人和人之间进行交流的语言被称之为自然语言,例如英语,中文等

而高级语言, 就是接近自然语言, 更符合人类的思维方式的编程语言

 ◼优点

  • 简单、易用、易于理解
  • 远离对硬件的直接操作,使得一般人经过学习之后都可以编程,而不用熟悉硬件知识;更利于人的开发和维护
  • 一个程序还可以在不同的机器上运行,具有可移植性

 ◼缺点

  • 程序不能直接被计算机识别,需要经编译器翻译成二进制指令后,才能运行到计算机上

  • 所以相比较于汇编语言,其性能上的开销会更大,性能会略低一点

  • 种类繁多: 如JavaScript 、 C语言、C++、C#、Java、Objective-C 、Python等

  • 不同领域的开发需要使用不同的编程语言,并没有一个统一的编程语言可以实现所有的功能

JavaScript

◼JavaScript(通常缩写为JS)是一种高级的、解释型的编程语言

  • JavaScript是一门基于原型、头等函数(函数是第一公民)的语言,是一门多范式的语言,它支持面向对象程序设计,指令式编程,以及函数式编 程

◼从上面的定义中, 我们会发现很多关键词:

  • 解释型语言? 原型? 头等函数? 多范式? 面向对象程序设计? 指令式编程? 函数式编程?

  • 这些改变往往会让人不知所云,需要我们完全掌握JavaScript再来回头看,每一个词语描述的都非常准确;

◼现在只需要知道,通俗的说法:

  • JavaScript是一门高级编程语言, 是前端开发的重要组成部分!

HTML和CSS也是前端开发的重要组成部分, 而JavaScript是前端开发的灵魂;

发展历程

1994年,网景公司(Netscape)发布了Navigator浏览器0.9版

  • 这是历史上第一个比较成熟的网络浏览器,轰动一时
  • 但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力
  • 网景公司急需一种网页脚本语言,使得用户可以与网页互动

网景公司急需一种网页脚本语言,使得浏览器可以与网页互动

  • 采用现有的语言,比如Perl、Python、Tcl、Scheme等等, 允许它们直接嵌入网页
  • 1995年网景公司招募了程序员Brendan Eich,希望将Scheme语言作为网页脚本语言的可能性
  • 同年,Sun公司将Oak语言改名为Java,正式向市场推出
  • 因为Java的“write once run anywhere“,也就是跨平台特性,网景公司动了心,决定与Sun公司结成联盟,希望将Java嵌入到网页中来运行
  • Brendan Eich本人非常热衷于Scheme,但是管理层那个时候有点倾向于Java,希望可以简化Java来适应网页脚本的需求;

但是Brendan Eich对此并不感兴趣,他用10天时间设计出来了JavaScript

  • 最初这门语言的名字是Mocha(摩卡)
  • 在Navigator2.0 beta版本更名为LiveScript
  • 在Navigator2.0 beta 3版本正式重命名为JavaScript,当时是为了给这门语言搭上Java这个热词

JavaScript使用10天设计出来,导致JavaScript当时更像是一个多种语言的大杂烩

  • 借鉴C语言的基本语法
  • 借鉴Java语言的数据类型和内存管理
  • 借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位
  • 借鉴Self语言,使用基于原型(prototype)的继承机制

Brendan Eich曾经这样描述过JavaScript:

  • 与其说我爱Javascript,不如说我恨它,它是C语言和Self语言一夜情的产物;
  • 十八世纪英国文学家约翰逊博士说得好:'它的优秀之处并非原创,它的原创之处并不优秀。’
  • (the part that is good is not original, and the part that is original is not good.)

微软公司于1995年首次推出Internet Explorer,从而引发了与Netscape的浏览器大战

  • 微软对Netscape Navigator解释器进行了逆向工程,创建了JScript,以与处于市场领导地位的网景产品同台竞争
  • 但这对于开发者来说是一场噩耗,因为需要针对不同的浏览器进行不同的适配

1996年11月,网景正式向ECMA(欧洲计算机制造商协会)提交语言标准

  • 1997年6月,ECMA以JavaScript语言为基础制定了ECMAScript标准规范ECMA-262(也被称之为ECMAScript)
  • JavaScript成为了ECMAScript最著名的实现之一
  • 除此之外,ActionScriptJScript也都是ECMAScript规范的实现语言

所以说,ECMAScript是一种规范,而JavaScript是这种规范的一种实现

JS的组成

ECMAScript是JavaScript的标准,描述了该语言的语法和基本对象

  • JavaScript是ECMAScript的语言层面的实现,但只是最核心最基本的语法实现
  • 因为除了语言规范之外,JavaScript还需要对页面和浏览器进行各种操作
  • 所以JavaScript还提供了BOM和DOM
组成部分说明
ECMAScript基本核心语法
DOM用于操作文档(网页界面)的API
BOM用于操作浏览器的API

JavaScript引擎

事实上,我们经常说的浏览器内核指的是浏览器的排版引擎,也称为浏览器引擎(browser engine)、页面渲染引擎(rendering engine)或样版引擎

而JavaScript的解析和执行是通过JavaScript引擎的

JavaScript是一门高级语言,而高级的编程语言都是需要转成最终的机器指令来执行的

事实上我们编写的JavaScript无论你交给浏览器或者Node执行,都会先加载到内存中,最后都是需要被CPU执行的,也就是说最后还是需要交给硬件来帮助我们进行执行

但是CPU只认识自己的指令集,也就是只有机器语言,才能被CPU所执行

所以我们需要JavaScript引擎帮助我们将JavaScript代码翻译成CPU指令来执行

简单来说,JavaScript引擎的作用是将JS代码转换为0101格式的机器指令并交给计算机硬件来进行执行

引擎说明
SpiderMonkey一款JavaScript引擎,由Brendan Eich开发
ChakraIE的JS引擎,现在基本不使用
JavaScriptCoreWebKit中的JavaScript引擎,Apple公司开发 在移动端使用较多,如APP中解析网页的时候使用的webview组件,其解析JS使用的就是JSCore 在小程序中,解析网页使用的也是webview,所以其解析JS使用的也是JSCore
V8Google开发的强大JavaScript引擎 Chrome的JS引擎

浏览器内核和JS引擎的关系

浏览器内核 = 渲染引擎 + JS引擎

例如: Webkit = WebCore(负责HTML解析、布局、渲染等等相关的工作) + JSCore(解析、执行JavaScript代码)

著名的Atwood定律

Stack Overflow的创立者之一的 Jeff Atwood 在2007年提出了著名的 Atwood定律:

Any application that can be written in JavaScript, will eventually be written in JavaScript.

任何可以使用JavaScript来实现的应用都最终都会使用JavaScript实现。

Snipaste_2022-11-01_09-16-20.png