《聊聊JavaScript 的诞生》

257 阅读9分钟

引言:对于很多前端来说,JavaScript 与他们的关系可以说是互相成全,相互成就。

关于JS的史前时期

出生~

JavaScript(通常缩写为JS)是一种高级的、解释型的编程语言。JavaScript是一门基于原型、头等函数的语言,是一门多范式的语言,它支持面向对象程序设计,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。

一些具体细节

  • 1993年,国家超级电脑应用中心(NCSA)发表了NCSA Mosaic,这是最早流行的图形接口网页浏览器,它在万维网的普及上发挥了重要作用。

  • 1994年,Mosaic的主要开发人员随即创立了Netscape公司,并雇用了许多原来的NCSA Mosaic开发者用来开发Netscape Navigator,该公司的目标是取代NCSA Mosaic成为世界第一的网页浏览器。

  • 在四个月内,已经占据了四分之三的浏览器市场,并成为1990年代互联网的主要浏览器。

  • 网景预见到网络需要变得更动态。公司的创始人马克·安德森认为HTML需要一种胶水语言,让网页设计师和兼职程序员可以很容易地使用它来组装图片和插件之类的组件,且代码可以直接编写在网页标记中。

  • 1995年,网景招募了布兰登·艾克,目标是把Scheme语言嵌入到Netscape Navigator浏览器当中。网景决定发明一种与Java搭配使用的辅助脚本语言并且语法上有些类似,这个决策导致排除了采用现有的语言,例如Perl、Python、Tcl或Scheme。为了在其他竞争提案中捍卫JavaScript这个想法,公司需要有一个可以运作的原型。艾克在1995年5月仅花了十天时间就把原型设计出来了。

10天写的语言?择百家之长的大胆尝试

34岁的系统程序员Brendan Eich 根本对JAVA语言不感兴趣,Brendan Eich的主要方向和兴趣是函数式编程,网景公司招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性。Brendan Eich本人也是这样想的,以为进入新公司后,会主要与Scheme语言打交道。所以基本上Brendan Eich就是按照下面的思路随便写了写

(1)借鉴C语言的基本语法;

(2)借鉴Java语言的数据类型和内存管理;

(3)借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;

(4)借鉴Self语言,使用基于原型(prototype)的继承机制。

随便写写的问题就是有点不太行

  • 后面有阮老师总结了10个设计缺陷,这里我简单列举下

1. 不适合开发大型程序

Javascript没有名称空间(namespace),很难模块化;没有如何将代码分布在多个文件的规范;允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载。

2. 非常小的标准库

Javascript提供的标准函数库非常小,只能完成一些基本操作,很多功能都不具备。

3. null和undefined

4. 全局变量难以控制

Javascript的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。

5. 自动插入行尾分号

Javascript的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。

6. 加号运算符

+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。

7. NaN

NaN是一种数字,表示超出了解释器的极限。它有一些很奇怪的特性:

8. 数组和对象的区分

由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。

9. == 和 ===

==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。

10. 基本类型的包装对象

Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。

就这么随意的语言,怎么能变成现在这么火的样子呢?

一言以蔽之: “站在风口上,猪都能飞上天”

JS到底抓住了什么风口?

  • 首先是把我的语言进行了“标准化备案也就是说当我把自己变成一个标准,就实现了批量复制我的可能

1996年11月,网景正式向ECMA(欧洲计算机制造商协会)提交语言标准。1997年6月,ECMA以JavaScript语言为基础制定了ECMAScript标准规范ECMA-262。JavaScript成为了ECMAScript最著名的实现之一。除此之外,ActionScript和JScript也都是ECMAScript规范的实现语言。尽管JavaScript作为给非程序人员的脚本语言,而非作为给程序人员的脚本语言来推广和宣传,但是JavaScript具有非常丰富的特性。

  • 接着Gmail让浏览器不仅仅可以在线刷网页

2004年愚人节,谷歌发布Gmail。Gmail是谷歌开发的一款具有发送接收邮件功能的在线网页。在Gmail出现以前,所有人都认为浏览器只能用于浏览阅读。但是Gmail让用户重新认识了浏览器的功能。

2005年,Jesse将谷歌实现Gmail的技术命名为AJAX。从此前端技术正式出现。

2006年,JQuery发布,JQuery是最长寿的JS库,其主要是兼容IE,但随着IE的落寞,JQuery也逐渐淡出前端开发者的视野。

  • 然后在大势所趋的移动端风靡之时,展现了良好的轻量适配

2010年iPhone4发布,宣告智能手机时代来临。但是无论是IOS系统(Safari),还是Android系统(chrome)都不支持IE浏览器。与此同时,也开始在移动端和PC端做了一些分化。

举个例子乔布斯在创造苹果手机的时候就表示:“IOS系统不支持Flash”,这导致Flash在移动端的市场基本只能够靠安卓,但是在安卓系统的表现也差强人意。最终在2020年宣告停服。这个故事告诉我们,只能在PC端跑服务已经不是广大网民的需求,移动端的方便快捷已经实现了“用户养成”。

微软见此情况和Nokia联合起来,但最终还是Nokia在手机行业宣告失败,手机业务被微软收购。可以认为,手机上基本见不到IE了。

至此,前端开发者可以不再需要考虑IE用户的需求,摆脱了被IE支配的日子,前端从此极速发展。

  • 最后就是Node.js真正拓宽了前端工程师的边界

2009年,Ryan基于V8,创建了Node.js;2010年Issac基于Node.js写出了npm。有了node.js,前端工程师实现了在浏览器之外执行JS。

2010年,TJ受Sinatra的启发,发布了Express.js。Node.js与Express.js让前端工程师可以完成后端的内容。虽然还比不上Java,但是至少也具备了手段。

你说的标准是什么标准?

ECMAScript标准

  • 1997年6月,第一版ECMAScript发布。

  • 1999年12月,第三版ECMAScript发布,这也是应用最广泛的ECMAScript版本。

  • 第四版流产

  • 第三版发布后,经过了10年,20019年12月第五版ECMAScript才发布,(为这段时间IE 6浏览器正如日中天)

  • Chrome的崛起,这些新的浏览器的JS引擎都根据ECMAScript标准进行实现所以除了IE,其他浏览器与浏览器之间的兼容性得到大大提高。

  • 15年6月,ECMAScript第六版(ES6)发布。并在之后每一年都发布一版。可见JS地位在不断提高。

  • vaScript与ECMAScript的区别在于,ECMAScript是标准,JavaScript是实现(实际上JavaScript是由ECMAScript,DOM和BOM三者组成的),实现的功能不一定会出现在标准里面,不同的浏览器也有自己独特的JS实现。(先有实现再考虑要不要把这个实现加入标准)

能不能给我看看这个标准具体长啥样?

行!!!

一般来说,完整的JavaScript包括以下几个部分:

  • ECMAScript,描述了该语言的语法和基本对象
  • 文档对象模型(DOM),描述处理网页内容的方法和接口
  • 浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口

JavaScript的基本特点如下:

  • 是一种解释性脚本语言(代码不进行预编译)。
  • 主要用来向HTML页面添加交互行为
  • 可以直接嵌入HTML页面,但写成单独的js文件有利于结构和行为的分离。

JavaScript常用来完成以下任务:

  • 嵌入动态文本于HTML页面
  • 对浏览器事件作出响应
  • 读写HTML元素
  • 在数据被提交到服务器之前验证数据
  • 检测访客的浏览器信息
  • 控制cookie,包括创建和修改等