阅读更多

35顶
16踩

Web前端

翻译新闻 JavaScript2.0 :抢先尝鲜

2009-08-18 09:40 by 见习记者 hite 评论(48) 有22432人浏览
JavaScript2.0 :抢先尝鲜

作者 Rob Gravelle

作为一个开发者和作家,我的一部分工作就是跟随web世界最新发展潮流——不管是关于公司合并、在线购物潮流、或者是编程技巧。我承认如今很难跟上业界里发生的所有事情,但是有个四处流传的小道消息却吸引了许多的目光:JavaScript2.0提案。作为新的JavaScript2.0\EMCAScript 4.0计划于2009年终稿,但是日前已经做了很多的工作-包括好的、不好的。今天,我们来看看这份提案规范的一部分,看下他们是在改进这门语言还是狗尾续貂。

JavaScript的历史

为了更好的理解JavaScript标准是如何实现的,让我们简要的看下这门语言的历史吧

JavaScript是ECMAScript脚本语言的一个分支。ECMAScript 是Ecma国际组织标准化的,这门语言的另外2个分支是ActionScript(macroMedia,Adobe)和JScript(微软)。JavaScript是有Netscape的Brendan Eich开发的,最初叫Mocha而后是LiveScript,最后改为JavaScript。1993.3月,Sun公司发布了支持JavaScript的Navigator2.0(译者:我感觉这是错误的,可查看原文)。鉴于JavaScript作为客户端脚本语言取得广泛流行,微软制定了自己的脚本语言JScript,发布于1996.8月的ie3.0中。Netscape公司在日内瓦提交了JavaScript给Ecma国际标准化组织,申请成为标准。

Ecma国际标准化组织是个管理信息、通信系统的、基于成员制度,非营利性国际机构 。这个机构起初是为了标准化欧洲的计算而于1991年成立,在它成立后的40年间,Ecma总共出台了370封标准和90个科技报告,其中包括了CD-ROM卷和文件系统,c++语言规范和他们的开放xml格式。第一版的ECMAScript(Ecma-262)于1997在Ecma全员大会上通过。不管JavaScript还是JScript他们都是兼容ECMAScript的,同时也提供了Ecma规范没有提供的特殊的额外的特性。甚至在今天,JavaScript和JScript依然有个很多不兼容的地方。JavaScript受如java、c++等面向对象语言的影响很深,这也意味着初学者能很容易的上手。

语言的增强

更加的面向对象

迄今为止,JavaScript是使用的原型来做继承的,而不是经典的面向对象式的继承自父类。事实上,如下面实例的一样,如今JavaScript没有class的东西:

// Current JavaScript 1.x "Class" Definition
function MyClass()
{
 this.member1 = "a string";
 this.member2 = 10;
}
var myClass = new MyClass(); // class instantiation


// JavaScript 2.0 Class Definition
class TrueClass
{
 this.member1 = "a string";
 this.member2 = 10;
}
var trueClass = new TrueClass(); // class instantiation


当对象的构造函数和他们类型角色一起的时候,构造函数会翻倍。使用new 调用函数的时候会创建一个新对象,而后你就可以使用被bind到这个对象的本地关键字this来调用这个函数。函数的原型决定了这个对象的原型。不管什么类型的值赋予一个对象的原型,那么它都会被他所有的实例和汉字共享。使用原型 ,JavaScript可以模拟许多基于class的特性,尽管有些古怪。举个例子,在下面的代码中,myOtherDog尝试去重载父类Dog的getBreed() 函数。虽然myOtherDog的getBreed()函数是能够实现的,但是他没有重载成功——给了myOtherDog两个面包。

function Dog(name)
{
  this.name = name;
  this.bark = function() { alert('Woof!'); };
  this.displayName = function() { alert(this.name); };
};

var myDog = new Dog('Killer');
myDog.displayName(); //Killer
myDog.bark(); //Woof!

Dog.prototype.getBreed = function()
{
  alert("Mutt");
};

myDog.getBreed(); //Mutt

myOtherDog = new Dog('Bowzer');

// this hides getBreed() from other Dogs
myOtherDog.getBreed = function()
{
  return "Lhasa Apso";
};
alert(myOtherDog.getBreed()); //Lhaso Apso and Mutt!

alert(myDog.getBreed()); //function is undefined


强类型

像大多数的脚本语言一样,JavaScript也是弱类型的。解释器会在运行时,基于值来决定某变量的数据类型。这种松散性使得开发者可以很灵活的重用和比较变量。在后种情况,使用强制类型转换就可以比较两种不同数据类型的值;JavaScript会自动在比较之前将他们转化成相同的类型。

alert( "42" == 42 ); //true
alert( ("42" == 42) + 1 ); //2. the boolean true evaluates to 1.
alert( "I live at " + 99 + " Renolds street."); // the 99 int is converted to a string.


相反的,JavaScript2.0会强类型化了些,这就意味着必须显式的申明变量的类型,脚本引擎不会强制类型转换了。类型可以赋予属性、函数参数、函数返回值、变量、对象、数组的初始化对象。如果没有定义类型,那么变量或者属性被设置为默认的Object类型,这是所有的数据类型层级的基类。使用:后跟类型申明的是赋类型的语法:

var a:int = 100; //variable a has a type of int
var b:String = "A string."; //variable b has a type of String

function (a:int, b:string)//the function accepts two parameters, one of type int, one of type string

function(...):int //the function returns a value with a type of int


为了进行上述的比较,你需要转换类型:

alert( int("42") == 42 ); //true
alert( int("42" == 42) + 1 ); //2
alert( "I live at " + string(99) + " Renolds street.");


程序单元体

借鉴了各种流行js框架,程序单元体是很有用的代码模块,它可以在运行时导入。当框架和自定义库数量越来越多的时候,这些已经成为web程序不可或缺的组成部分。设想下,包含了成千上万行代码的库们,一次性下载他们已经不合时宜了。这是伪代码:
use unit Effects "http://mysite/lib/Effects";
use unit Utils "http://mysite/lib/Utils";

var panel = new Panel();
panel.setTime(Util.getFormattedTime());


编译时的类型检查

在JavaScript2.0 里,你可以使用严格模式来编译JavaScript模块。在运行之前,它可以检查几个重要的方面的完整性,包括:

静态类型检查

引用名称确认

对常数的非法赋值

保证比较的两个值有合法的类型

常数

先前的JavaScript开发者不得不使用命名规范或者精心制定的工作规则保护他们的常量。而这些在JavaScript2.0都是不需要的:

//JavaScript 1.x constant
var CULTURE_CONST = "Do you really want to change me?"; // constant in appearance only.

//JavaScript 2.0 constant
const HAMMER_TIME = "You can't touch this!" // a true constant.


命名空间

随着js框架的不断涌现,使用命名空间已经变得越来越必要了。这个标准目前被用作创建全局对象来保护你自己的功能不给先前的全局对象和函数击倒在地(直译)。

总结

许多向对2.0提案进行了猛烈的抨击,批评它在想经典的语言如c++、java在靠近。

“...JavaScript是动态、灵活的,使用原型继承和对象模型是很实用,很基础的优势,为什么有人要把这些那么优雅、灵活的东西变成java呢,java基本上强制性的让程序员使用古典的,基于class的继承——我搞不懂。”

而我个人对此很感受很复杂,即欢迎像class,命名空间,常量这样好的变化,也对强类型脚本变量很不感冒。总体上说,JavaScript冒着对业余程序员变得更严格,相应的更严肃的危险 。不过,我也想应该感谢那些商业网站能够使用像我这样的专业人士来编码他们的业务流程。不管结果如何,无疑web开发的格局将会发生戏剧性的改变。

初稿:2009 7.20

复查:2009.7.22

翻译:2009.8.20
来源:http://www.webreference.com/programming/javascript/rg38/2.html
来自: hometown-631
35
16
评论 共 48 条 请登录后发表评论
28 楼 a274915611 2009-08-18 23:26
641216927 写道
语言泛滥!!

我觉得也点
27 楼 rainsilence 2009-08-18 20:18
但是,有一点不解
ECMAScript4不是已经死亡了?因为微软
javascript2又是根据什么出来的?
26 楼 641216927 2009-08-18 20:18
语言泛滥!!
25 楼 rainsilence 2009-08-18 20:15
阿,兄弟们,我错了。ECMAScript4的很多特性被取消
ECMAScript4是javascript2的基础。。。
24 楼 rainsilence 2009-08-18 20:09
javascript2.0提案不是已经作废了吗?什么时候的事情拉。
23 楼 lixinlixin2008 2009-08-18 19:44
只希望引入byte类型就好...
22 楼 takuma888 2009-08-18 17:01
JS变成这样就不好玩了,灵活的优势消失了
21 楼 jkfzero 2009-08-18 15:59
我也加入了炮轰Javascript2的行列
20 楼 whaosoft 2009-08-18 15:42
我要好好学习
19 楼 ronnin 2009-08-18 15:05
这已经不是javascript了 .........................................
18 楼 lifei800 2009-08-18 14:41
强类型应该可以选用把,象php那样可以限制某方法参数变量为强类型,也可不指定类型,就是弱类型,根据自己爱好选用 
17 楼 java.lang.Object 2009-08-18 14:17
不管什么类型的值赋予一个对象的原型,那么它都会被他所有的实例和汉字共享.

汉字怎么共享?
16 楼 hite 2009-08-18 13:49
jindw 写道
这条新闻真实性很值得怀疑。

我只是翻译不为真实性保证。来自www.javascript.com
15 楼 jindw 2009-08-18 13:30
这条新闻真实性很值得怀疑。

http://www.javaeye.com/news/3239
早就ECMA5了,ECMA4 不是早就放弃了吗?


http://www.ecmascript.org/
这里也能看到,只有ecma5发布的说明,没有ECMA4的声音。


而ECMA262 4th 除了加了个 JSON 原生对象之外,和ECMA3基本没有区别。
http://www.ecma-international.org/publications/files/drafts/tc39-2009-025.pdf
14 楼 darkbaby123 2009-08-18 13:27
gakaki 写道
还不如直接 整合 jquery来得实际 然后调整浏览器兼容性
强化 DOM操作 ,,,,,,,,,标准dom操作真的不是一般的烂


这方面jquery可以说做得太好了

再加一点,强化一下事件模型,把“标准”推广下,就行了。
13 楼 鹤惊昆仑 2009-08-18 13:16
开倒车,简直是语言的退化!
12 楼 look12345 2009-08-18 13:15
恶心的语法
11 楼 SSH_Jacky 2009-08-18 13:03
期待中。。。。。。
10 楼 satanest 2009-08-18 13:01
jltest 写道
强制类型不喜欢。。。

Me too
9 楼 gakaki 2009-08-18 12:49
还不如直接 整合 jquery来得实际 然后调整浏览器兼容性
强化 DOM操作 ,,,,,,,,,标准dom操作真的不是一般的烂


这方面jquery可以说做得太好了

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 编译原理课程设计 java实现编译器

    java实现c语言编译器,包括词法分析,语法分析,语义分析,目标代码生成四个部分,总体实现编译器功能,有运行界面,代码精简,值得下载。

  • java编译原理

    1.javac是什么? (1)javac是一种编译器,能够将一种语言规范转换成另一种用语言规范,通常编译器是将便于人们理解的语言规范成机器容易理解的语言规范。 (2)javac的任务就是将java源代码语言转换成jvm能够识别的语言,然后jvm将jvm语言再转化成当前机器能够识别的语言(这样使得对开发者屏蔽与机器相关的细节,并且使得语言的执行与平台无关) 2.javac编译器的基本结构 (1)步骤: <1>读取源码,进行词法分析。也就是找出源码字节中的关键字,识别出合法的关键字,最后得出一些规范

  • JVM——Java虚拟机详解

    内存分配有两种方式,指针碰撞空闲列表指针碰撞和空闲列表指针碰撞:假设Java堆中内存是绝对规整的,所有被使用过的内存都被放在一边,空闲的内存被放在另一边,中间放着一个指针作为分界点的指示器,那所分配内存就仅仅是把那个指针向空闲空间方向挪动一段与对象大小相等的距离,这种分配方式称为“指针碰撞”。

  • Java虚拟机(JVM)

    JVM内存区域划分、类加载的过程、垃圾回收机制

  • 详解Java虚拟机

    JAVA虚拟机

  • Java虚拟机(JVM)详解

    本文详细介绍了Java虚拟机(JVM)的概念、架构、组成部分以及其在Java程序运行中的作用。希望对Java程序员的学习和实践有所帮助。了解JVM可以帮助我们更好地理解Java程序的运行机制,为程序性能优化和问题诊断提供依据。

  • Java之虚拟机

    概述 Java虚拟机是Java Virtual Machine的缩写,Java程序需要运行在虚拟机上,不同的平台有自己的虚拟机,因此Java语言可以实现跨平台。 为了对Java虚拟机内存高效的管理,Java虚拟机在执行Java程序的过程中会把它所管理的内存划分为若干个不同的数据区域。这些区域有个字的用途,以及创建和销毁的时间。根据《Java虚拟机规范》的规定,Java虚拟机所管理的内存将会包括以下几个运行时数据区域:程序计数器、java虚拟机栈、本地方法栈、Java堆、运行时常量池、直接内存。 Java虚

  • Java虚拟机是什么?一文带你深入了解Java虚拟机

    首先必须虚拟机进程启动就绪,然后由虚拟机中的类加载器加载必要的class文件,包括jdk中的基础类(如String和Object等),然后由虚拟机进程解释class字节码指令,把这些字节码指令翻译成本机cpu能够识别的指令,才能在cpu上运行。这些“原料”在运行时被加载到虚拟机中,被虚拟机解释执行,以控制虚拟机实现我们java代码中所定义的一些相对高层的操作,比如创建一个文件等,可以将class文件中的信息看做对虚拟机的控制信息,也就是一种虚拟指令。3 加载class文件的是一个叫做类加载器的子系统。

  • JVM虚拟机

    JVM是的简称,意为Java虚拟机。虚拟机是指通过软件模拟的具有完整硬件功能的、运行在一个完全隔离的环境中的完整计算机系统。常见的虚拟机:JVMVMwave。JVM 和其他两个虚拟机的区别:VMwave与VirtualBox是通过软件模拟物理CPU的指令集,物理系统中会有很多的寄存器;JVM则是通过软件模拟Java字节码的指令集,JVM中只是主要保留了PC寄存器,其他的寄存器都进行了裁剪。JVM是一台被定制过的现实当中不存在的计算机。

  • JVM学习总结——一、编译原理(为啥将 .java 文件编译为.class文件?)

    百度百科解释: JVM是Java Virtual Machine(Java虚拟机)的缩写,JVM是一种用于计算设备的规范,它是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。 引入Java语言虚拟机后,Java语言在不同平台上运行时不需要重新编译。Java语言使用Java虚拟机屏蔽了与具体平台相关的信息,使得Java语言编译程序只需生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。 一句话:JVM只能加载符合规范的字节码文件(.class)。

  • Java编译工作原理(简释)

    如图: 首先,源程序(.java)文件由javac编译器将其转换成jvm可识别字节码文件(.class)(这个字节码文件不是针对具体平台的,而是针对抽象的Java虚拟机的,在Java虚拟机上运行,在不同类型的平台上安装不同的Java虚拟机,这些不同的Java虚拟机屏蔽了各个不同平台的差异,从而使编译过的Java程序具有平台无关性,即Java虚拟机在执行字节码时,把字节码解析成具体平台上的机器指令...

  • 编译原理-语法分析器的java实现

    语法分析器 实验步骤 1.2.1 1. 文法 E->TE’ E’->+TE’|ε T->FT’ T’->*FT’|ε F->(E)|i 1.2.2 2. 程序描述(LL(1)文法) 本程序是基于已构建好的某一个语法的预测分析表来对用户的输入字符串进行分析,判断输入的字符串是否属于该文法的句子。   基本实现思想:接收用户输入的字符串(字符串以“#”表示结束)后,对用做分析栈的一维数组和存放分析表的二维数组进行初始化。然后取出分析栈的栈顶字符,判断是否为终结符,若为终结符则判

  • java的运行原理

    编译型语言  VS  解释性语言:编译型语言是通过专门的编译器,将高级语言【一次性翻译成】可被平台(如OS操作系统)执行的机器码,编译一次,脱离开发环境可独立运行,故效率高;但对编译器严重依赖,而不同操作系统所使用的编译器是各不相同的,所以造成了编译型语言可移植性差的特点。同样的,解释型语言也有专门的解释器,将原程序解释成特定的平台可执行文件,不同的是,解释型语言不会进行整体的编译,而是把编译和解...

  • 不能不懂的 Java 源代码编译过程分析

    前言 首先问大家一个问题,我们开发好 Java 代码是如何运行的?我们写了这么多年的代码,对于代码运行的流程是否清楚呢? 是不是在 ide 中点一下 Run 启动就完事了,我们写的代码直接就跑起来了,其实在背后编译器和虚拟机默默的在帮我们承受了这一切。 Java 程序从源文件创建到程序运行要经过两大步骤: 1、源文件由编译器编译成字节码 2、字节码由 Java 虚拟机解释运行。因为 Java 程序既要编译同时也要经过 JVM 的解释运行。 Java 代码编译 代码编译由 JAVA 源码编译器来完成。主要是将

  • 从Java文件的编译到最终执行的过程

    JVM(Java虚拟机)是可运行Java代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。 Java源文件的编译、下载、解释和执行 Java应用程序的开发周期包括编译、下载、解释和执行几个部分。Java编译

  • JVM解释器与编译器

    JAVA编译器(javac.exe)的作用是将java源程序编译成中间代码字节码文件,是最基本的开发工具 JAVA解释器(java.exe)(英语:Interpreter),又译为直译器,是一种电脑程序,能够把高级编程语言一行一行直接转译运行。解释器不会一次把整个程序转译出来,只像一位“中间人”,每次运行程序时都要先转成另一种语言再作运行,因此解释器的程序运行速度比较缓慢。它每转译一行程序叙述就立刻运行,然后再转译下一行,再运行,如此不停地进行下去。 如: public class Test { publi

  • Java编译器、JVM、解释器

    Java编译器、JVM、解释器 收藏  Java 虚拟机(JVM)是可运行Java 代码的假想计算机。只要根据JVM规格描述将解释器移植到特定的计算机上,就能保证经过编译的任何Java代码能够在该系统上运行。本文首先简要介绍从Java文件的编译到最终执行的过程,随后对JVM规格描述作一说明。      一.Java源文件的编译、下载 、解释和执行    Java应用程序的开发周期包括编译、

  • 解释器与编译器

    计算机不能直接认识并执行我们写的语句,它只能认识机器语言(是二进制的形式)。 编译器是把源程序的每一条语句都编译成机器语言,并保存成二进制文件,这样运行时计算机可以直接以机器语言来运行此程序,速度很快; 解释器则是只在执行程序时,才一条一条的解释成机器语言给计算机来执行,所以运行速度是不如编译后的程序运行的快的. 1. 在具体计算机上实现一种语言,首先要确定的是表示该语言语义解释的虚拟计

  • JVM、编译器、解释器

    一、JVM:JVM有自己完善的硬件架构,如处理器、堆栈(Stack)、寄存器等,还具有相应的指令系统(字节码就是一种指令格式)。JVM屏蔽了与具体操作系统平台相关的信息,使得J**ava程序只需要生成在Java虚拟机上运行的目标代码(字节码),就可以在多种平台上不加修改地运行。JVM是Java平台无关的基础。JVM负责运行字节码:JVM把每一条要执行的字节码交给解释器,翻译成对应的机器码,然后由解...

  • java解释器是什么_java的解释器是什么

    Java解释器是JVM的一部分。Java解释器用来解释执行Java编译器编译后的程序。java.exe可以简单看成是Java解释器。java解释器的作用编译一个.java 文件时,我们会获得一个名字完全相同的输出文件;但对于.java 文件中的每个类,它们都有 一个.class扩展名。因此,我们最终从少量的.java 文件里有可能获得数量众多的.class 文件。如以前用一种汇编语言写过程序,那么...

Global site tag (gtag.js) - Google Analytics