JavaScript的前世今生

Stella981
• 阅读 427

JavaScript的前世今生

  和CSS一样,JavaScript在各浏览器下并非完全一致,它所带来的兼容性问题时常困扰着我们,以至于现在“能否处理流行浏览器的兼容性问题”成为了检验一个程序员是否合格的标准之一。了解JavaScript的前世今生或许能够帮助我们更好的理解和处理浏览器带来的兼容性问题。同时,初学者站在更高的地方去重新审视一下JavaScript,或许能够揭开它的神秘面纱,一旦它失去了神秘性而变得平易近人,学习起来就会更加轻松。

  前些天,我看了一本书《JavaScript核心概念及实践》,邱俊涛著。书中过半的内容列举了一些JavaScript的核心知识点,剩下接近一半的内容介绍了JavaScript解释引擎,包括但不局限在Web客户端。我慢慢有了一个想法,想重新学习一下JavaScript的前世今生,于是便有了这篇文章。

JavaScript的诞生

  众所周知,Brendan Eich在1995年5月用了10天时间创建了JavaScript语言,最早用于Netscape的Netscape Navigator2浏览器。

  JavaScript起初命名为“LiveScript”,为了赶在发布日期前完成LiveScript的开发,Netscape联合Sun公司建立了一个开发联盟,在Navigator2发布前夕,Netscape为了搭上媒体热炒Java的顺风车,临时把LiveScript改为JavaScript。JavaScript1.1伴随着Navigator3发布后,用户关注度屡创新高,Netscape把自己定位为市场领袖。

  为了与Netscape竞争,微软在IE3中加入JavaScript实现,为了避免授权纠纷命名为JScript。

过早的标准化

  浏览器大战前期,已经有三个不同的JavaScript版本共同存在:Navigator中的JavaScript,Internet Explorer中的JScript和ScriptEase中的CEnvi。业内人士饱受恶性竞争带来的不兼容痛苦,强烈呼吁制定一个语言标准。

  Netscape以Internet软件为全部收入来源,年收入3亿。而微软公司年收入80亿,Internet软件完全免费,不需要盈利。Netscape早已意识到形式的危急,为了奠定自己的地位,她以其JavaScript1.1为蓝本,向ECMA提交了标准化申请。最终由39号委员会(TC39),由来自Netscape,微软,Sun,及其它关注脚本语言发展的公司程序员组成,完成了ECMA-262——定义了一种名为ECMAScript(发音为“ek-ma-script”)的脚本语言标准。

  至今为止,已经有四个ECMA-262版本发表,代号“Harmony”版本正在工作中。发布与1999年的ECMAScript第三版(简称ES3)是目前被广泛支持的版本。C语言诞生于1972年,而首个标准颁布于1989年,历时接近20年。而JavaScript从发明到标准化只用了不到两年。“过早”的标准化有好处,自然也有坏处。

ECMAScript派生语言

  在JavaScript被标准化之后,事实上我们现在说的JavaScript的含义要宽泛的多。在浏览器中,一个完整的JavaScript应该有JavaScript Core(ECMAScript),DOM,BOM组成。JavaScript只是ECMAScript的一个派生语言。见下表(摘自维基百科):

  应用程序

方言

相应的ECMAScript版本

FireFox

JavaScript 1.8.1

ECMAScript-262 第五版

Chrom

JavaScript

ECMAScript-262 第五版

Internet Explorer

JScript 9.0

ECMAScript-262 第五版

Opera

ECMAScript

ECMAScript-262 第五版

Safari

JavaScript

ECMAScript-262 第三版

Microsoft .NET Framework

JScript .NET8.0

ECMAScript-262 第三版

Adobe Flash及Adobe Flex

ActionScript 3

ECMAScript-262 第三版

JS解释引擎

  通常来说,JavaScript是一门解释型的语言,特别是在浏览器中。然而这并非定则,在Rhino中,脚本可以被编译为Java字节码。Google的V8引擎则直接将JavaScript代码编译为本地代码,无需解释。

  任何平台都可以实现JavaScript,包括服务器端。不同平台实现的ECMAScript方言不同,解释引擎也不尽相同。历史上第一款JavaScript解释引擎名为SpiderMonkey,Brendan Eich在Netscape时使用C语言编写。

  主要网页浏览器的JavaScript引擎如下(摘自维基百科):

Mozilla:

SpiderMonkey,第一款JavaScript引擎,由Brendan Eich在Netscape Communications时编写,用于Mozilla Firefox。

TraceMonkey,基于实时编译的引擎,其中部分代码取自Tamarin引擎,用于Mozilla Firefox 3.5~3.6版本。

JaegerMonkey,德文Jäger原意为猎人,结合追踪和组合码技术大幅提高性能,部分技术借凿了V8、JavaScriptCore、WebKit,用于Mozilla Firefox 4.0~11版本。

IonMonkey,可以对JavaScript编译后的结果进行最优化,用于Mozilla Firefox 18.0以上版本。

OdinMonkey,可以对asm.js进行最优化,用于Mozilla Firefox 22.0以上版本。

Rhino,由Mozilla基金会管理,开放源代码,完全以Java编写。

Google:

V8,使用C++编写,开放源代码,由Google丹麦开发,是Google Chrome的一部分。

微软:

Chakra (JScript引擎),中文译名为查克拉,用于Internet Explorer 9的32位版本及Internet Explorer 10。

Opera:

Linear A,用于Opera 4.0~6.1版本。

Linear B,用于Opera 7.0~9.2版本。

Futhark,用于Opera 9.5~10.2版本。

Carakan,用于Opera 10.50~14版本。

  而在服务器端,例如node.js是一个基于Google V8 JavaScript引擎的框架。

总结

  JavaSctipt引擎种类繁多,无独有偶,在网页浏览器中,HTML排版引擎(也称为浏览器内核)同样是百家争鸣,各放异彩。

  现时主要的四大排版引擎为:Trident(应用于IE);Gecko(应用于FF);Blink(应用于Chrome和Opera);WebKit (应用于Safari和早期版本的Chrome)。

  此外,还有一些正在开发的排版引擎。

Servo是一个实验性网页浏览器排版引擎,由Mozilla所开发,三星集团移植到Android系统和ARM处理器。

EdgeHTML引擎是Trident的一个分支,将被用于Microsoft Edge浏览器(研发代号为Project Spartan,经常简写为 Spartan)。该浏览器将在 Windows 10 和 Windows 10移动版中取代IE成为默认浏览器。

  在前端开发中,CSS的兼容性问问往往是浏览器的排版引擎导致,而JavaScript兼容性问题则是由浏览器的JavaScript解释引擎不同而形成。JavaScript的兼容问题多出现在DOM和BOM中,不同的排版引擎和JS解释引擎的执行效率也是完全不一致的,甚至可以差到十倍以上。更有甚者,JavaScript解释引擎本身也存在Bug,这也需要程序员去注意和避免。

  了解了JavaScript的前世今生,才发现原来自己正在学习的JavaScript是一个怎样的一门语言——20年前没人可以预料它会变得如此伟大。再次面对兼容性问题时,希望我们都能够有的放矢,不要抱怨。

  JavaScript:学会它,你只需要片刻,掌握它,你需要数年。

(完)

点赞
收藏
评论区
推荐文章
blmius blmius
2年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Karen110 Karen110
2年前
一篇文章带你了解JavaScript日期
日期对象允许您使用日期(年、月、日、小时、分钟、秒和毫秒)。一、JavaScript的日期格式一个JavaScript日期可以写为一个字符串:ThuFeb02201909:59:51GMT0800(中国标准时间)或者是一个数字:1486000791164写数字的日期,指定的毫秒数自1970年1月1日00:00:00到现在。1\.显示日期使用
Easter79 Easter79
2年前
swap空间的增减方法
(1)增大swap空间去激活swap交换区:swapoff v /dev/vg00/lvswap扩展交换lv:lvextend L 10G /dev/vg00/lvswap重新生成swap交换区:mkswap /dev/vg00/lvswap激活新生成的交换区:swapon v /dev/vg00/lvswap
Jacquelyn38 Jacquelyn38
2年前
2020年前端实用代码段,为你的工作保驾护航
有空的时候,自己总结了几个代码段,在开发中也经常使用,谢谢。1、使用解构获取json数据let jsonData  id: 1,status: "OK",data: 'a', 'b';let  id, status, data: number   jsonData;console.log(id, status, number )
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
2年前
Java获得今日零时零分零秒的时间(Date型)
publicDatezeroTime()throwsParseException{    DatetimenewDate();    SimpleDateFormatsimpnewSimpleDateFormat("yyyyMMdd00:00:00");    SimpleDateFormatsimp2newS
Wesley13 Wesley13
2年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
2年前
00:Java简单了解
浅谈Java之概述Java是SUN(StanfordUniversityNetwork),斯坦福大学网络公司)1995年推出的一门高级编程语言。Java是一种面向Internet的编程语言。随着Java技术在web方面的不断成熟,已经成为Web应用程序的首选开发语言。Java是简单易学,完全面向对象,安全可靠,与平台无关的编程语言。
Stella981 Stella981
2年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Wesley13 Wesley13
2年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
Python进阶者 Python进阶者
3个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这