JavaScript起源、发展历史及设计的缺陷
1.1 起源
1.2 简史
1.3 内容
1.4 设计缺陷
1.1 起源
JavaScript诞生于1995年,它的出现主要是用于处理网页中的前端验证。
所谓的前端验证,就是指检查用户输入的内容是否符合一定的规则。比如:用户名的长度,密码的长度,邮箱的格式等。
JavaScript(通常缩写为JS)是一种解释性脚本语言(代码不进行预编译),主要用来向HTML页面添加交互行为。它已经由ECMA(欧洲电脑制造商协会)通过ECMAScript实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari、Opera)支持。
1.2 简史
JavaScript是由网景(Netscape)公司发明,起初命名为LiveScript,后来由于SUN公司的介入更名为JavaScript。
1996年微软公司在其最新的IE3浏览器中引入了自己对JavaScript的实现JScript。
于是在市面上存在两个版本的JavaScript,分别是网景公司的JavaScript和微软的JScript。
为了确保不同的浏览器上运行的JavaScript标准一致,所以几个公司共同制定了JS的标准命名为ECMAScript。
1995年,Brendan·Eich(布兰登·艾克,JS之父)进入网景公司,在公司“看上去与Java足够相似,但是比Java简单,使得非专业的网页作者也能很快上手”的要求下,用10天确定了设计思路并为其浏览器开发了JS功能,以下为设计思路:
(1)借鉴C语言的基本语法;
(2)借鉴Java语言的数据类型和内存管理;
(3)借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;
(4)借鉴Self语言,使用基于原型(prototype)的继承机制。
值得一提的是,Brendan本人并不喜欢自己的这个作品,虽然当时很多人都十分喜欢Java语言,但Brendan却不是其中一员,因此即使JavaScript在后来成为互联网第一大语言,全世界有几百万学习者,但Brendan仍然不喜这个以Java为设计原型的作品,他将其称为“C语言和Self语言一夜情的产物”。
1.3 内容
一般来说,完整的JavaScript包括以下几个部分:
ECMAScript,描述了该语言的语法和基本对象(ECMAScript是纸上标准,JavaScript是浏览器的实现,纸上标准一般落后于浏览器);
文档对象模型(DOM),描述处理网页内容的方法和接口;
浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口。
(1)JavaScript被设计出来后最初命名为Mocha,1995年9月在Netscape Navigator 2.0的Beta版中改名为LiveScript,同年12月,Netscape Navigator 2.0 Beta 3中部署时被重命名为JavaScript;
(2)1996年8月IE 3发布,支持JScript(微软实现的JS);
(3)1996年11月,网景向ECMA提交语言标准,由于版权问题,JS语言标准不叫JavaScript,叫 ECMAScript;
(4)1997年6月,第一版ECMAScript发布;
(5)1999年12月,第三版ECMAScript发布,这个版本使用最广(第四版没有发行成功)
(6)2006年,jQuery 发布,它是目前最长寿的JS库;
(7)2009年12月,第五版ECMAScript发布,增加了一些功能;
(8)2009年,Ryan 基于V8(Chrome的JS引擎叫做V8)创建了Node.js
(9)2010年,Isaac基于node.js写出了npm;
(10)2015年6月,第六版ECMAScript发布,新浏览器都支持这一版(之后每年发布一版,版本号以年份命名)。
(11)2016年,yarn发布,极大地弥补了npm的缺陷。
JavaScript是一门解释型语言,所谓解释型语言不需要被编译为机器码执行,而是直接执行。但是由于少了编译这一步骤,所以解释型语言开发起来尤为轻松,但是解释型语言运行较慢也是它的劣势。不过解释型语言中使用了JIT技术,使得运行速度得以改善。
JavaScript是一门动态语言,所谓的动态语言可以暂时理解为在语言中的一切内容都是不确定的。比如一个变量,这一时刻是个整型,下一时刻可能会变成字符串了。
动态语言相比静态语言性能上要差一些,不过由于JavaScript中应用的JIT技术,所以JS可能是运行速度最快的动态语言了。
1.4 设计缺陷
由于JavaScript的设计阶段过于仓促,而且它结合了函数式编程和面向对象编程的特点,是历史上的第一例,没有先例可以参考。同时JavaScript在推出一年半之后,国际标准就问世了,过早的标准化使JavaScript的规格还没来及调整就固化了,因此导致了JavaScript的设计不够完善,有很多失误。
如果遵守良好的编程规范,加上第三方函数库的帮助,JavaScript的缺陷大部分可以回避,JavaScript目前是网页编程的唯一语言,会跟随着互联网不断发展,同时只要发布新版本的语言标准,就可以弥补这些设计缺陷。
以下为列举的10个缺陷:
(1)不适合开发大型程序
JavaScript没有名称空间(namespace),很难模块化;没有如何将代码分布在多个文件的规范;允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载。目前已经引入模块化的开发方式。
(2)非常小的标准库
JavaScript提供的标准函数库非常小,只能完成一些基本操作,很多功能都不具备。
(3)null和undefined易混淆,但是含义完全不同
null属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义。在编程实践中,null几乎没用。
(4)全局变量难以控制
JavaScript的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。目前基本使用const和let声明变量。
(5)自动插入行尾分号
JavaScript的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。
目前开发项目时,均已经规定了代码书写的规范,必须遵循代码风格。
(6)加号运算符
+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。这样的设计,不必要地加剧了运算的复杂性。
(7)无需设计NaN
NaN是一种数字,表示超出了解释器的极限,去掉NAN更有利于简化程序。
(8)数组和对象的区分
由于JavaScript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。
(9)== 和 ===
“==”用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。因此,推荐任何时候都使用“===”(精确判断)。
(10)基本类型的包装对象
JavaScript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。与基本数据类型对应的对象类型,作用很小,造成的混淆却很大。
JavaScript起源、发展历史及设计的缺陷相关推荐
- JavaScript的发展历史
JavaScript的发展历史 JavaScript的发展历史 JavaScript与Java的关系 JavaScript的版本 JavaScript的发展历史 JavaScript的诞生 JavaS ...
- 第一讲 《javascript 浏览器发展历史》
javascript 浏览器发展历史 web 发展历史: mosaic (马萨克) 是互联网历史上第一个普遍使用 和 能够显示图片 的 网页浏览器 1993年问 ...
- Linux 的发展历史,设计哲学和一些常用的术语介绍
1991 年,Linus Torvalds 还是芬兰赫尔辛基的一名学生,当时他开始了一个项目:编写自己的操作系统内核. 他还收集和开发了构建以他的内核为中心的整个操作系统所需的其他基本要素. 不久之后 ...
- JavaScript 的发展历史
目录 1.1995 年:JavaScript 的诞生 2.1996 年:JavaScript 与 Java 3.1997 年:ECMAScript 作为 JavaScript 标准诞生 4.2009 ...
- JavaScript起源及发展
文章目录 JavaScript发展历史(JS) 一 JavaScript的起源 二 JavaScript的发展 JavaScript发展历史(JS) 一 JavaScript的起源 JavaScrip ...
- JavaScript发展历史(JS)
JavaScript发展历史(JS) 1.1994年, 网景公司(Netscape)发布了Navigator浏览器0.9版,这是世界上第一款比较成熟的网络浏览器,轰动一时.但是这是一款名副其实的浏览器 ...
- 广州优漫动游公司:UI设计起源及发展,UI设计为何重要?
良好的UI设计被日益视为增加用户参与度和创建有用和视觉体验的重要工具.用户界面(UI)设计是多元化,多学科且富有创意的领域.对于那些想要进入UI设计领域的人来说,当然不乏需要学习的东西!下面优漫教育小 ...
- CMOS模拟集成电路发展历史、设计特点、设计流程
集成电路发展历史: 20世纪50年代,小规模集成电路,small scale Intergrated circuits,集成度个元件 20世纪60年代,中规模集成电路,medium scale Int ...
- eBPF 的发展历史和核心设计
前言 本文翻译自 2016 年 Daniel Borkman 在 NetdevConf 大会上的一篇文章:On getting tc classifier fully programmable wit ...
最新文章
- 现在的编译器还需要手动展开循环吗_性能 - 如果有的话,循环展开仍然有用吗?...
- python编程语言零基础入门-程序员大佬,给Python零基础入门书籍教程的一些建议!...
- XSS中JavaScript加密以及Filter bypass
- android设置系统横屏方案
- input-text
- 自编码器及其相关模型
- linux mysql ibd_MySQL:如何从ibd文件中恢复数据
- [安全模型][Cambria Math][A][]敌手A-> 怎么打出来?
- 为什么 那么多 前端开发者都想学 Vue.js
- JDK 18 / Java 18 GA 发布
- mysql procedure prepare_mysql prepare 存储过程使用
- R+markdown+LaTeX 中文编译解决方案
- python3.8安装pygame_Python3.8安装Pygame很难?新萌也能轻松搞定安装并运行游戏
- python自带的帮助文档
- 冒泡排序时间复杂度计算和优化
- DB2 SQLCODE 异常大全编辑(三)
- 成都传智播客,学生老师共同举杯庆祝初战高胜!
- 人机交互知识 理论篇1
- Android页面监听虚拟键盘弹出、收起
- 一文看懂BDTC 2018:探秘大数据新应用(附PPT下载)