`

js的设计缺陷

 
阅读更多

原文请搜阮一峰

 

一、js为什么有缺陷

1。设计阶段过于仓促

设计者只用十天时间完成js的设计,而且设计初衷只是为了完成简单的网页互动,并没有考虑复杂应用的需要

2。设计借鉴太杂

设计者本身擅长函数式编程,但由于某些原因又需要将js往面向对象上靠。又因为只想做一种简单的脚本语言就放弃了‘类’的想法,采用prototype继承模型,使这门语言显得有点四不像

3。过早的标准化

js的发展太快,乃至没时间调整设计。语言一经推出市场,立刻被广泛接受,用户量爆炸式增长,缺乏一个积累过程。并且netscape为了与微软的Jscript竞争,强势申请js的国际标准。使得js在推出一年半后就称为标准

 

二、js的几个设计缺陷

1。不适合开发大型程序

js没有命名空间(namespace)很难模块化;没有如何将代码分布在多个文件的规范;允许同名函数重复定义,后面的定义覆盖前面的定义,很不利于模块化加载

2。js提供的标准函数库非常小,只能完成一些基本操作

3。全局变量难以控制

在每个函数里面都能生成全局变量,增加了程序的复杂性如:function a(){b=2;} 这里的b就是全局变量

4。自动插入行尾分号

js所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器会自动加上,有时候会导致难以发现的错误比如

function(){
  return 
   {i:1;};
}

 这里解释器会自动在return后面加分号则函数返回undefined。而如果这样写

function(){
  return{
     i:1;
  }
}

 则函数返回一个对象

5。数组与对象的区分

js中的数组也属于对象,所以要辨别一个对象是不是数组有点麻烦。Douglas Crockford的代码是这样的

if(arr && typeof arr ==='object' && typeof arr.length === 'number'
   && !arr.prototypeIsEnumerable('length')){
  alert("arr is an arry");
}

 其中第二个条件是限制arr首先是个对象,第三个条件arr有自有属性length并且属性类型是number(如果是继承自prototype则类型就是undefined),第四个条件限制这个属性是预定义属性而不是用户定义的,因为,预定义的属性是不可枚举的,而用户定义的属性是可枚举的

6。基本类型的包装对象

js有三种基本类型:字符串、数字、布尔值。他们又都有相应的构造函数生成相应的对象。这种设计作用很小,造成混淆不小

typeof 1234;//number
typeof new Number(1234); //object

 7。其他的一些奇怪设计

包括像null、NaN、==与===等都容易产生混淆而又比较鸡肋

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics