发表时间:2022-03-25来源:网络
原标题:史上被骂最多的编程语言——JavaScript

文章作者:金旭亮(http://my.csdn.net/bitfan)原文链接:http://blog.csdn.net/bitfan/article/details/10362461
一、世无英雄,遂使竖子成名
1 Web客户端编程语言事实上的王者
(1)Java为何成功?
几乎所有的Java书都会先介绍一番Java的历史,比较有趣的是我在资料中看到这样一句话:
Java的设计者Brendan Eich曾在一次采访中说,Java“几天就设计出来了”。
Ruby的设计者——松本行弘为此感叹:
“这样的出身,得到这样的成功,还真让人出乎意料,……”,
“但由于开发周期短,确实也存在着不足……”。
确实,作为一种编程语言,Java并不完美,在实际开发中,Java同样也存在着严重的问题,其中最突出的就是早期没有完整的规范,导致浏览器厂商各行其是所带来的兼容性问题。
但奇怪的是,就是这样一个并不完美的东西,最终却成为了Web客户端编程语言事实上的王者,而它的种种缺陷,却给我们带来了丰富多彩的各种Java库及框架,整个Java社区则生机勃勃,活力四射,这真是一件很有趣的事。
在我看来,Java的成功在于它“生逢其时”,赶上了互联网大发展的时代契机。而当时“时无英雄,使竖子成名”。
读者可能不服气,那建议你看看那本著名的、指出过“10000小时专业训练是成为天才的必要条件”的《异类》,在此书中,作者Malcolm Gladwell列举了诸多二十世纪在IT业呼风唤雨的大人物:微软比尔盖茨、保罗艾伦和史蒂夫鲍尔默,苹果的乔布斯,Google的埃里克施密特,Sun的比尔乔伊……,他们全部出生在1953~1956之间;
再看看当前中国IT大佬们——李彦宏(1968.11)、张朝阳(1964)、马化腾(1971)、丁磊(1971),马云(1964),刘强东(1974)……,他们的出生日期都集中在上世纪60与70年代交替的时期,……
为什么会这样呢?请结合他们创业的时代大背景看看就明白了。
时势造英雄。Java就是这样的幸运儿。生逢其时,伴随着互联网的发展,有不计其数的Web应用是使用它编写的,Java应用得越广,其社区就越活跃,优秀的程序员不断为Java贡献大量的框架和库,还有Google和微软这样的大公司不断地想办法弥补或改进Java的现有缺陷,推出新的脚本语言和优化其引擎……
一切都构成了一个完整的生态圈。以后的脚本语言,哪怕比Java要好很多,也难以重现Java的辉煌了,Java己经成为Web客户端事实上的王者。
(2)为什么Java招人骂?
有趣的是,尽管Java用得如此广泛,但仍然承担了很多开发者的抱怨,我估计Java可能是“到目前为止,计算机软件史上被人骂得最多的编程语言”。
为什么会这样呢?
我看原因有三。
首先是至今犹存的浏览器兼容性问题,请看以下代码:
functionshowInformation(info){
varh3 =document.getElementById("info");
//适合于IE,Chrome, Opera
if(h3.innerText!==undefined){
h3.innerText =info;
}
else{
//适合于FireFox
h3.textContent =info;
}
}
上述代码只是简单地给一个 元素赋值,你可以看到,代码必须针对不同的浏览器写不同的代码,更让人郁闷的是,还可能为同一种浏览器的不同版本写不同的代码,有些浏览器(比如IE6)生命周期之长让人无奈,这些都强迫Web开发者把大量时间花在测试兼容性这种毫无成就感的工作之上,实在颇有点浪费生命的感觉。
大家都觉得不爽的地方,就是创新点,于是有了以jQuery为代表的大量的Java库和框架,其成功在于有意无意地迎合了人们的这种偷懒的心理:
“把麻烦丢给别人,把方便留给自己”。
Java招人骂的第2个原因是它名字引起的误会。
Java,名字中有个Java,初次听到几乎100%的人都以为它与Java有着密切的关系,而且很有可能就是Java语言的子集。
但事实上,叫“李富贵”的人可能在街上讨饭,叫“刘美美”的其实长得不怎么样,而取名“杨德有”的人其实是个小人,干了很多见不得人的事……
这世上名不副实的多了,其实,Java与Java根本是两种语言,取这个名字纯粹是最早设计并实现Java的那批人想攀高枝拍Java马屁的结果。
由于许多人把它当成自己所熟悉的Java语言去用,结果发现它根本不是自己所熟悉的那种编程语言,加上下面要讲的第三个原因让人编起程来很不爽,许多人愤怒了:“NND,给这丫骗了!”
Java招人骂的第3个原因其实与语言本身无关,而与浏览器相关。
许多人最早使用Java不是因为喜欢这种语言,而是工作中必须用它,在实际工作中用得最多的就是DOM,而DOM API的设计与各浏览器的具体实现 实在不怎么样,按照jQuery设计者John Resig的观点,它绝不可能获得任何“年度友好API(Friendliest API of the Year)”的奖项!
2 精华与糟粕的并存Java
Douglas Crockford写了一本《Java:The Good Parts》,在书中他这样写到:
Java建立在一些非常好的想法和少数非常坏的想法之上。
那些非常好的想法包括函数、弱类型、动态对象和一个富有表现力的对象字面量表示法,而那些坏的想法包括基于全局变量的编程模型、缺乏块作用域、“保留”了一堆根本没用到的保留字,不支持真正的数组(它所提供的类数组对象性能不好)等等。
还有一些是“鸡肋”,比如with语句,原始类型的包装对象,new,void等等
Java受到的主要批判有:
无法应对复杂的互联网应用程序,不支持大家己普遍熟悉的以类为模板的面向对象编程方式
运行速度慢,其对象内部采用散列表形式组织,相比数组和结构体,存取速度慢
不支持多核CPU,Java没有线程的概念,也缺乏必要的线程同步手段,使得它几乎无法编写能充分应用客户端多核CPU计算能力的代码
浏览器兼容性问题是硬伤
……
不少被批判的内容并不全是事实,或者说现在不少己经有很大改善,但Java身上的这些骂名是洗不掉的了。
其实,Java本身有很多精华,下面的内容就集中于Java的这些亮点之上。
二、Java技术导航
谈到Java技术,其实应该区分以下三个概念:Java语言、Java库和Java宿主。
Java语言的学习主要是Java语法学习,Java宿主是指Java程序的运行环境,通常是浏览器,浏览器提供了许多对象(比如window,document等),Java代码可以直接调用它们,另外,浏览器还包容一个专门负责运行Java代码的组件,我们把它称为Java引擎,在实际学习过程中,一般不需要深入地了解Java引擎的内部运行机理。Java库通常是指由Java社区所贡献出来的能完成特定功能的打包在一起的Java代码。
在学习过程中,通常是把Java语言与Java运行环境所提供的对象和实现的功能“打包到一块”作为一个整体学习,因此,下面的介绍不再明确地区分哪些内容属于Java语言特性,哪些功能实际上是由宿主环境提供的。至于Java库,不在本文的介绍范围之内。读者可自行阅相关的技术书籍。
1 掌握Java基础编程技能
(1)第一件事情,弄明白在哪儿写Java代码
三种方式写Java代码。
Inline Java:直接将简短的Java代码嵌入到HTML元素声明中:
About
Embedded Java:将java放到 元素中:
//在此写Java代码
链接外部Java文件:将Java代码放到独立的.js文件中,然后在 元素引用它:
(2)快速了解Java语法基础
学习这部分内容,可以与C/Java/C#的基础语法相对照,重点关注其不同点就行了,以下是部分要点:
Java定义了四种基本数据类型:numbers, strings, Booleans, undefined和null,其余所有的都是对象。
Java所有的数都是64位浮点数,还有一个常量叫NaN(Not a Number),在编程中常用。
Java有一些比较独特的运算符,列举几个: ===(严格判等运算符)、 !!(把后面跟着的表达式变成一个bool值),方括号运算符(可以用于访问对象属性)
变量的作用域:Java没有块作用域,但有函数作用域。即:定义在函数中的参数和变量在函数外部不可见,并且在一个函数中的任何位置定义的变量在该函数中的任何地方都可见。这点与C和Java等编程语言都不一样。
……
(3)比较独特与有用的内部对象
Java本身提供了一些内部对象,可以在代码中直接使用,列举几个:
数组:Java其实没有传统意义上的数组,因此,你应该把它看成是“另外一种东西”,需要花点时间去明白它的特性。
全局对象:Java中有一个全局的global对象,除了那些有明确对象归属的成员,其它所有的东西都成为它的成员,在浏览器环境中,window对象就是全局对象。
正则表达式:正则表达式在处理字符串上功能强大,花时间在这上面是值得的。
timer对象:可以用它实现定时调用
……
(4)Java代码调试方法
有几种方法可以调试Java代码,最土的一种是使用alert()输出信息,比较专业的是使用console.log和设置断点。
每个Web开发者都一定要至少掌握一种浏览器所提供的调试工具:Firebug(Firefox)、IE Developer Tools(IE 8以后)、Opera Dragonfly( Opera 9.5以后)、WebKit Developer Tools( Safari和Chrome)。
大多数浏览器调试工具都可以使用F12这个热键呼叫出来,并且其提供的功能都很强大。
另外,一些IDE(比如Visualstudio),也支持对Java代码的跟踪与调试。
2 把握Java编程语言的精华
在学习Java的过程中,我建议别把Java看成是一种OO语言,应把它看成是一种函数式语言!
另外,重点搞掂函数、对象、闭包三个东东,则Java精华尽在我手!
首先,我们先来摆函数的龙门阵。
(1)函数
Java中函数是“一等公民”。理解Java的函数是打开这门编程语言奥秘的钥匙,由它可以引申出N多重要的特性。
函数是一个对象
Java使用function关键字定义函数
functionadd(x,y){
returnx +y;
}
函数可看成是一个“函数”对象。函数名是指向这一“函数”对象的指针,可以有多个变量引用同一个函数对象
console.info(add(100,200));//300
varother =add;//other和add引用同一函数对象
console.info(other(300,400));//700
函数中定义的变量是私有的,因此,Java变量只有两种作用域:全局的和由函数所限制的局部作用域。这点非常重要。
函数可以没有名字,我们通常把这种“匿名”函数赋值给一个变量,通过变量来调用它:
varsquare =function(x){returnx *x;}
console.info(square(10));//100
牢记“函数是一个对象”,对看懂许多Java代码至关重要。
返回函数的函数
由于函数是对象,因此,我们可以写出一个返回函数的函数,这是一种非常重要的编程技巧:
functionfunc(x,y){
varvalue=300;
returnfunction(){
returnvalue +x +y;
};
}
console.info(func(100,200)());//600
被返回给外界的“内部”函数能够直接访问外部函数的变量,并且需要时它还可以再返回另一个函数,这样便可以构成一个排成“一字长蛇阵”的连续函数调用语句,这在许多Java库中都能看到。
函数的参数
Java对函数的要求极其地宽松。
定义函数时,不需要指定参数类型,对于参数值,Java不会进行类型检查,任何类型的值都可以被传递给参数。
对于函数参数,如果过少,没得到值的参数为undefined,如果过多,多的会被忽略掉。
Java将所有传给函数的参数放到一个arguments对象中(它类似于数组,但Java中没有传统意义上的数组,只能说是类似于数组的对象),使用它可以写出灵活的代码,比如模拟实现OO语言中的方法重载(method overload).
特别地,函数可以作为另一个函数的参数:
varvalues =[213,16,2058,54,10,1965,57,9];
values.sort(function(value1,value2){returnvalue2 -value1;});
如果有C#的delegate经验,看懂上述代码一点也不困难,反过来,理解了上述Java代码,再学习C#的delegate和Lambda表达式也就没多少难度,这就是各种语言均有相通之处的一个例子。
this对象
Java中的this与Java/C#中的不一样,在Java中,每次对函数的调用都有一个上下文对象,this关键字引用它。如果函数归属于某个对象,则this关键字将引用此对象,它就是本次函数调用的上下文。
this引用的函数上下文对象是可以动态改变的,使用函数对象的call方法可以动态地指定它:
window.color ="red";
varo ={color:"blue"};
functionsayColor(){
alert(this.color);
}
sayColor();//red
sayColor.call(this);//red
sayColor.call(window);//red
sayColor.call(o);//blue
不少Java库中,使用这个特性玩出了许多花样。
(2)闭包
“闭包(closure)”是函数式编程的重要特性,这也是在学习时最让人难以理解的技术关键点之一。请费点脑筋看看以下代码:
functiona(){
vari =0;
returnfunctionb(){
console.info(++i);
};
};
varc =a();
for(vari =0;i
责任编辑:
优居优住房产中介app官方版(优居找房)下载v4.3.2 安卓最新版
107.07MB |生活服务
纷享销客app官方版(更名纷享销客CRM)下载v9.7.6 安卓最新版
172.08MB |商务办公
虹蚁智控最新版下载v1.5.2 安卓版
57.93MB |生活服务
中鸽网赛事直播平台下载v2.5.09 安卓版
57.66MB |系统工具
四川政务服务一体化平台手机版(更名为天府通办)下载v5.1.2 安卓最新版
154.15MB |生活服务
钢之梦最新版本下载v5.8.5 安卓官方版
27.92MB |生活服务
合气网app下载v3.3.20 安卓版
36.64MB |商务办公
雷克萨斯elexusclub下载v3.96 安卓版
163.87MB |系统工具
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-02-15
2022-02-14