JavaScript(通常缩写为JS)是一种高级的、解释型的编程语言。JavaScript是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。
虽然JavaScript与Java在名字上和语法上有很多相似,但二者从被设计之初就有很大不同。JavaScript的语言设计来自Self(一种基于原型的编程语言)和Scheme(一门函数式编程语言),而在语法结构上,JavaScript与C语言有很大相似性。
在客户端,JavaScript在传统意义上被实现为一种解释语言,但在最近,它已经可以被即时编译(JIT)执行。随着最新的HTML5和CSS3语言标准的推行它还可用于游戏、桌面和移动应用程序的开发和在服务器端网络环境运行,如Node.js。
诞生
JavaScript诞生于1995年,由布兰登·艾克(Brendan Eich)在网景公司(Netscape)任职期间发明。
在1994年,网景发布了历史上第一个比较成熟的网络浏览器,但仅可以用来浏览,不能实现与访问者互动,急需一种脚本语言实现浏览器与网页互动。
采用何种语言成为问题,一种是直接将Perl、Python、Tcl、Scheme等现有语言嵌入网页,另一种是开发新的语言,二者各有利弊。在当时,Sun公司推出了Java,网景与Sun进行合作,考虑用Java作为脚本语言,但最终因为会使HTML变动很复杂而放弃。
网景决定发明一种与Java搭配使用的辅助脚本语言并且语法上有些类似,比Java简单,使得非专业的网页作者也能很快上手。1995年5月,Brendan Eich为了应付公司安排,用了10天就把Javascript设计出来了。他的设计思路是:
- 借鉴C语言的语法
- 借鉴Java的数据类型和内存管理
- 借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位
- 借鉴Self语言,使用基于原型(prototype)的继承机制
因此,JavaScript语言实际上是两种语言风格的混合产物——(简化的)函数式编程+(简化的)面向对象编程。这是由Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定的。
1996年11月,网景正式向ECMA(欧洲计算机制造商协会)提交语言标准。1997年6月,ECMA以JavaScript语言为基础制定了ECMAScript标准规范ECMA-262。
概论
JavaScript包括3块内容:
- ECMAScript,描述了该语言的语法和基本对象
- 文档对象模型(DOM),描述处理网页内容的方法和接口
- 浏览器对象模型(BOM),描述与浏览器进行交互的方法和接口
JavaScript特点:
- 解释性脚本语言(代码不进行预编译)
- 主要用于向HTMl添加交互行为
- 可嵌入HTML,但单独成文件
JavaScript常用来完成以下任务:
- 嵌入动态文本于HTML页面
- 对浏览器事件作出响应
- 读写HTML元素
- 在数据被提交到服务器之前验证数据
- 检测访客的浏览器信息
- 控制cookies,包括创建和修改等
设计缺陷
阮一峰的博客罗列了JS的10个设计缺陷,例如:
- 允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载
- JS的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性
- 在编程实践中,null几乎没用,根本不应该设计它
- JS的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦
- ==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉
- 基本类型的包装对象,与基本数据类型对应的对象类型,作用很小,造成的混淆却很大
阮一峰在博客最后写道,“最后,只要发布新版本的语言标准(比如 ECMAscript 5),就可以弥补这些设计缺陷。当然,标准的发布和标准的实现是两回事,上述的很多缺陷也许会一直伴随到Javascript存在的最后一天。”