JavaScript设计缺陷

416 阅读3分钟

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); // true
4.任何一个函数都可以全局变量难以控制

 

a = 1;  (function(){ 
  b=2; 
   alert(a); 
     })(); // 1  
        alert(b); //2
5.如果你忘记加分号,解释器会为你自动加上分号。有时这会导致一些难以发现的错误。

function(){  
  return;
   {    
    i=1  
    }; 
 }
6.+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接, 不必要地加剧了运算的复杂性。

alert(1+10); // 11 
alert("1"+"10"); // 110
alert(1+"10"); // 110
alert("10"+1); // 101
7.NaN是一种数字,表示超出了解释器的极限。与其设计NaN,不如解释器直接报错,反而有     利于简化程序。

 NaN === NaN; //false 
 NaN !== NaN; //true 
 alert( 1 + NaN ); // NaN
8.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 // true
10.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。




参考来源:火锅伯南克,阮一峰