JavaScript的历史
JavaScript的开山祖师爷是Bremdan Eich(布兰登·艾奇),布兰登为了应付公司安排的任务,他用了10天就将JavaScript设计了出来。由于设计时间太短,语言的一些细节考虑的不够严谨,导致后来的很长一段时间,JavaScript写出来的程序混乱不堪。他的设计思路是这样的:
(1)借鉴C语言的基本语法;
(2)借鉴Java语言的数据类型和内存管理;
(3)借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;
(4)借鉴Self语言,使用基于原型(prototype)的继承机制。
Javascript的10个设计缺陷
由于设计过于仓促,没有先例和过早的标准化,这几个客观原因导致了JavaScript的设计缺陷
1.很难模块化不适合开发大型程序2.非常小的标准库只能完成一些基本操作
3.null和undefined两者非常容易混淆,但是含义完全不同,null几乎没用
typeof null; // object
typeof undefined; // undefined
var foo;
alert(foo == null); // true
alert(foo == undefined); // true
alert(foo === null); // false
alert(foo === undefined); // true4.任何一个函数都可以全局变量难以控制
a = 1; (function(){
b=2;
alert(a);
})(); // 1
alert(b); //25.如果你忘记加分号,解释器会为你自动加上分号。有时这会导致一些难以发现的错误。function(){
return;
{
i=1
};
}6.+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接, 不必要地加剧了运算的复杂性。alert(1+10); // 11
alert("1"+"10"); // 110
alert(1+"10"); // 110
alert("10"+1); // 1017.NaN是一种数字,表示超出了解释器的极限。与其设计NaN,不如解释器直接报错,反而有 利于简化程序。 NaN === NaN; //false
NaN !== NaN; //true
alert( 1 + NaN ); // NaN8.Javascript的数组也属于对象(object),所以区分一个对象到底是不是数组,相当麻烦。
if ( arr &&
typeof arr === 'object' &&
typeof arr.length === 'number' &&
!arr.propertyIsEnumerable('length')){
alert("arr is an array");
}9.==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符 合直觉。因此,推荐任何时候都使用"==="(精确判断)比较符。 "" == "0" // false
0 == "" // true
0 == "0" // true
false == "false" // false
false == "0" // true
false == undefined // false
false == null // false
null == undefined // true
" \t\r\n" == 0 // true10.Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。与基本数据类型对应的对象类型,作用很小, 造成的混淆却很大。 new Boolean(false);
new Number(1234);
new String("Hello World");
alert( typeof 1234); // number
alert( typeof new Number(1234)); // object如何看待Javascript的设计缺陷?
如果遵守良好的编程规范,加上第三方函数库的帮助,Javascript的这些缺陷大部分可以回避。
其次,Javascript目前是网页编程的唯一语言,只要互联网继续发展,它就必然一起发展。目前,许多新项目大大扩展了它的用途,node.js使得Javascript可以用于后端的服务器编程,coffeeScript使你可以用python和ruby的语法,撰写Javascript。
参考来源:火锅伯南克,阮一峰