> 资料来自阮一峰的博客《Javascript的10个设计缺陷》

http://www.ruanyifeng.com/blog/2011/06/10_design_defects_in_javascript.html

1.不适合开发大型程序

JavaScript很难模块化
没有将分布在多个文件的规范
允许同名函数的重复定义,后面的会覆盖前面的,不利于模块化加载

2.标准库小

功能少,只能完成一些基本操作

3.null和undefined

null属于对象的一种,意思为对象为空
undefined则是数据类型的一种,表示未定义

  1. typeof null; //object
  2. typeof undefined; //undefined

两者含义不同,但很容易混淆

  1. var foo;
  2. alert(foo==null); //true
  3. alert(foo==undefined);//true
  4. alert(foo===null); //false
  5. alert(foo===undefined);//true

4.全局变量难以控制

JavaScript的全局变量在所有模块中是可见的;任何一个函数内部都可以生成全局变量,大大加剧了程序的复杂性

  1. a=1;
  2. (function(){
  3. b=2;
  4. alert(a);
  5. })(); //1
  6. alert(b)//2

5.自动插入行尾分号

JavaScript的所有语句,都必须以分号结尾,如果忘记加分号,解释器会自动加上且不报错,这会导致一些难以发现的错误

  1. function(){
  2. return
  3. {
  4. i=1
  5. };
  6. }

返回值不是一个对象,而是undefined,原因是,解释器自动在return语句上加了分号

  1. function(){
  2. return
  3. {
  4. i=1
  5. };
  6. }

6.加号运算符

有两个含义,可以表示数字之间的和,也可以表示字符间的连接

  1. alert(1+10);//11
  2. alert("1"+"10");//110

如果一个操作符是字符,另一个操作项是数字,则数字自动转化为字符

  1. alert(1+"10") //110

7.NaN

NaN代表不是数字,但他本身是一种数字

  1. NaN === NaN //false
  2. NaN !== NaN //true
  3. alert(1+NaN) //NaN

8.数组和对象的区分

在JavaScript中,数组也属于对象,所以要区分对象到底是不是数组相当麻烦

  1. if(arr&&
  2. typeof arr === 'object' &&
  3. typeof arr.length === 'number' &&
  4. !arr.propertyIsEnumerable('length')){
  5. alert("arr is a array");
  6. }

9.==和===

==用来判断两个值是否相等。===不仅判断两个值是否相等,还判断数据类型是否一样

  1. "" == "0" //false
  2. 0 == "" //true
  3. 0 == "0" //true
  4. false == "false" //false
  5. false == "0" //true
  6. false == undefined // false
  7. false == null // false
  8. null == undefined // true
  9. " \t\r\n" == 0 // true

10.基本类型的包装对象

JavaScript的三种基本数据类型:字符串、数字、布尔型。他们有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象

  1. new Boolean(false);
  2. new Number(1234);
  3. new String("nih");

与基本数据类型中的对象类型,作用很小,造成的混淆却很大

  1. alert(typrof 1234) //number
  2. alert(typeof new Number(1234)); //object