阅读更多

35顶
16踩

Web前端

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

2009-08-18 09:40 by 见习记者 hite 评论(48) 有22404人浏览
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 条 请登录后发表评论
8 楼 jltest 2009-08-18 11:45
强制类型不喜欢。。。
7 楼 zozoh 2009-08-18 11:10
jevy30 写道
alert(myOtherDog.getBreed()); //Lhaso Apso and Mutt!

这句只有Lhaso Apso吧!


没错,这会导致别人错误理解 override 的。我乍一看,吓了一小跳。

JS 如果强类型了,估计很多人都要骂娘了
6 楼 hite 2009-08-18 10:42
士来编码他们的业务流程。不管结果如何,无疑web开发的格局将会发生戏剧性的改变。

初稿:2009 7.20

复查:2009.7.22

incredible 写道
翻译的真烂!
强类型检查很差劲,灵活性没了


嘴下留情!第一次翻译……见谅
5 楼 jevy30 2009-08-18 10:41
alert(myDog.getBreed()); //function is undefined

这句才是: Mutt! and function is undefined
4 楼 jevy30 2009-08-18 10:40
alert(myOtherDog.getBreed()); //Lhaso Apso and Mutt!

这句只有Lhaso Apso吧!
3 楼 grandboy 2009-08-18 10:33
好像改动挺大,标准出来得一段时间成熟,估计js引擎跟上的时间还得一两年。
2 楼 incredible 2009-08-18 10:32
翻译的真烂!
强类型检查很差劲,灵活性没了
1 楼 fish2007 2009-08-18 10:24
javascript2.0,有些期待,对于强类型检查,不希望在这方面有什么变化

发表评论

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

相关推荐

  • java编译原理

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

  • JVM——Java虚拟机详解

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

  • java虚拟机及其安装

    Java虚拟机(JVM, Java Virtual Machine)是Java编程语言的核心组件之一,它负责执行Java字节码(.class文件),使得Java程序可以在任何安装了JVM的平台上运行,而无需重新编译。这种特性被称为“一次编写,到处运行”(Write Once, Run Anywhere, WORA)。javacjavaJVM的可移植性和高性能使其成为企业级应用、Web服务、移动设备开发(如Android应用程序)和云计算等领域的重要技术。

  • Java虚拟机(JVM)详解

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

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

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

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

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

  • java的运行原理

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

  • JVM、编译器、解释器

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

  • 编译原理中间代码生成--java实现

    程序要求能自动生成AST抽象语法树。Lab3Main.javapackage sch.cauc.edu.token; import edu.ustc.cs.compile.platform.interfaces.InterRepresent; /** * * * Lab3Main * 创建人:xrzhang * 时间:2018年5月25日-上午8:13:05 * @versi...

  • Java之编译原理解析

    为什么80%的码农都做不了架构师?>>> ...

  • java编译原理总结

    java的编译过程是一段"不确定"的过程,因为这可能是指将.java文件转变成.class文件的过程(javac编译阶段),也可能是指虚拟机后台的JIT(即时编译器)把字节码转为机器码 的过程(JIT编译) 前端编译器有javac等 后端编译器有HotSpotVM的C1,C2编译器 javac的编译过程为: 解析与填充符号表        解析包括词法分析和语法分析        词法...

  • 《Java虚拟机精讲》前两章的一些简单总结

    《Java虚拟机精讲》前两章的一些简单总结。   一、Java体系结构 1、Java现在发展出来三个版本,分别是JavaSE,JavaEE,JavaME。比如我们在下载Eclipse的时候,针对不同的Java版本会有不同的IDE。          区别:JavaSE是标准版,包含Java的全部API,也就是基础类库;JavaEE,是企业版,在JavaSE的基础上扩展了web组建,分布式,

  • 可以在虚拟机里运行Java吗,下面哪种类型的文件可以在Java虚拟机中运行( )

    下面虚拟【例18】属于抑癌基因的是类型It’s spring now. The flowers begin to _____.可机中You’d better _____ the words you don’t know.运行Our teacher came in the classroom so we stopped _____ and _____ what the teacher said.下面...

  • Java虚拟机学习笔记(2)——一个Java程序在虚拟机中的运行过程

    一.概述 二.执行细节 3.总结 一.概述 程序执行流程我把它划分为以下几个步骤:编辑源码、编译生成class文件、(加载class文件、运行class字节码文件),其中后两个步骤都是在jvm虚拟机上执行的。 二.执行细节 2.1 一个Java类 package com.javase.string; class Person { ...

  • Java方法执行流程解析

    栈帧是支持虚拟机方法调用和方法执行的数据结构,每个方法调用都对应一个栈帧。栈帧中包含局部变量表、操作栈、动态连接和方法返回地址等信息,结构如下图所示(图摘自Java —— 运行时栈帧结构): 具体内容的介绍参考书《深入理解Java虚拟机》。简单总结如下:   1. 基本概念 栈帧中局部变量表的大小、操作数栈的大小在编译期确定; 局部变量表用于存储方法参数和方法内部定义的局部变量,以槽(slot)为最小单位; 操作数栈用于存储指令计算对应的数据元素; 动态连接是指向运行时常量池中该栈帧所属..

  • java程序的执行过程详解四

    Java程序运行时,必须经过编译和运行两个步骤。首先将后缀名为.java的源文件进行编译,最终生成后缀名为.class的字节码文件。然后Java虚拟机将编译好的字节码文件加载到内存(这个过程被称为类加载,是由加载器完成的),然后虚拟机针对加载到内存的java类进行解释执行,显示结果。 Java的运行原理 在Java中引入了虚拟机的概念,即在机器和编译程序之间加入了一层抽象的虚拟的机器。这台虚拟...

  • 可以在虚拟机里运行Java吗,在Java虚拟机中可以运行Java的_____文件。

    1、[主观题]【程序设计题】设计一个应用程序,原始数据从程序界面的一个文本区输入,用户点击按钮后,在另一个文本区上输出排序后的数据,并将排序后的数据输出到文件中。已给出部分代码,请完成程序。import java.io.*;import java.util.*;import java.awt.*;import javax.swing.*;import java.awt.event.*...

  • java虚拟机到底是什么

    转自:http://blog.csdn.net/zhangjg_blog/article/details/20380971 虚拟机是一种抽象化的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现的。Java虚拟机有自己完善的硬体架构,如处理器、堆栈、寄存器等,还具有相应的指令系统。JVM屏蔽了与具体操作系统平台相关的信息,使得Java程序只需生成在Java虚拟机上运行的目标代码(字节码),

  • Android虚拟机DVM和JAVA虚拟机JVM的区别总结

    前阵子面试一个公司,自我介绍的时候说到自己曾经玩过Android但是现在做后台。然后面试官问我,那你知道Android的虚拟机和Java的虚拟机有什么区别吗?当时我就蒙蔽了,JVM了解过一些,知道JVM细分还是可以分好几种的,但是却不记得了,支支吾吾半天没答上来。于是回来便打算探讨一下这个问题。一查,才知道,原来Android的虚拟机都已不是JVM了,就算自己当时记得估计答的也是错的。Androi

  • 详解Java虚拟机

    JAVA虚拟机

Global site tag (gtag.js) - Google Analytics