> 资料来自阮一峰的博客《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; //object
typeof undefined; //undefined
两者含义不同,但很容易混淆
var foo;
alert(foo==null); //true
alert(foo==undefined);//true
alert(foo===null); //false
alert(foo===undefined);//true
4.全局变量难以控制
JavaScript的全局变量在所有模块中是可见的;任何一个函数内部都可以生成全局变量,大大加剧了程序的复杂性
a=1;
(function(){
b=2;
alert(a);
})(); //1
alert(b)//2
5.自动插入行尾分号
JavaScript的所有语句,都必须以分号结尾,如果忘记加分号,解释器会自动加上且不报错,这会导致一些难以发现的错误
function(){
return
{
i=1
};
}
返回值不是一个对象,而是undefined,原因是,解释器自动在return语句上加了分号
function(){
return;
{
i=1
};
}
6.加号运算符
有两个含义,可以表示数字之间的和,也可以表示字符间的连接
alert(1+10);//11
alert("1"+"10");//110
如果一个操作符是字符,另一个操作项是数字,则数字自动转化为字符
alert(1+"10") //110
7.NaN
NaN代表不是数字,但他本身是一种数字
NaN === NaN //false
NaN !== NaN //true
alert(1+NaN) //NaN
8.数组和对象的区分
在JavaScript中,数组也属于对象,所以要区分对象到底是不是数组相当麻烦
if(arr&&
typeof arr === 'object' &&
typeof arr.length === 'number' &&
!arr.propertyIsEnumerable('length')){
alert("arr is a 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("nih");
与基本数据类型中的对象类型,作用很小,造成的混淆却很大
alert(typrof 1234) //number
alert(typeof new Number(1234)); //object