> 资料来自阮一峰的博客《Javascript的10个设计缺陷》
http://www.ruanyifeng.com/blog/2011/06/10_design_defects_in_javascript.html
1.不适合开发大型程序
JavaScript很难模块化
没有将分布在多个文件的规范
允许同名函数的重复定义,后面的会覆盖前面的,不利于模块化加载
2.标准库小
3.null和undefined
null属于对象的一种,意思为对象为空
undefined则是数据类型的一种,表示未定义
typeof null; //objecttypeof undefined; //undefined
两者含义不同,但很容易混淆
var foo;alert(foo==null); //truealert(foo==undefined);//truealert(foo===null); //falsealert(foo===undefined);//true
4.全局变量难以控制
JavaScript的全局变量在所有模块中是可见的;任何一个函数内部都可以生成全局变量,大大加剧了程序的复杂性
a=1;(function(){b=2;alert(a);})(); //1alert(b)//2
5.自动插入行尾分号
JavaScript的所有语句,都必须以分号结尾,如果忘记加分号,解释器会自动加上且不报错,这会导致一些难以发现的错误
function(){return{i=1};}
返回值不是一个对象,而是undefined,原因是,解释器自动在return语句上加了分号
function(){return;{i=1};}
6.加号运算符
有两个含义,可以表示数字之间的和,也可以表示字符间的连接
alert(1+10);//11alert("1"+"10");//110
如果一个操作符是字符,另一个操作项是数字,则数字自动转化为字符
alert(1+"10") //110
7.NaN
NaN代表不是数字,但他本身是一种数字
NaN === NaN //falseNaN !== NaN //truealert(1+NaN) //NaN
8.数组和对象的区分
在JavaScript中,数组也属于对象,所以要区分对象到底是不是数组相当麻烦
if(arr&&typeof arr === 'object' &&typeof arr.length === 'number' &&!arr.propertyIsEnumerable('length')){alert("arr is a array");}
9.==和===
==用来判断两个值是否相等。===不仅判断两个值是否相等,还判断数据类型是否一样
"" == "0" //false0 == "" //true0 == "0" //truefalse == "false" //falsefalse == "0" //truefalse == undefined // falsefalse == null // falsenull == undefined // true" \t\r\n" == 0 // true
10.基本类型的包装对象
JavaScript的三种基本数据类型:字符串、数字、布尔型。他们有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象
new Boolean(false);new Number(1234);new String("nih");
与基本数据类型中的对象类型,作用很小,造成的混淆却很大
alert(typrof 1234) //numberalert(typeof new Number(1234)); //object
