ZhangYang's Blog

JavaScript的10个设计缺陷

为什么现在的前端学JavaScript要学那么多的版本,并且一年一大更,半年一小更,还要用到很多js的库、模块化工具

就是因为JavaScript的设计缺陷

这篇主要是参考《JavaScript语言精髓》(JavaScript: The Good Parts),总结的非常到位

大型程序不宜

Javascript没有名称空间(namespace),很难模块化

标准库小

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

null和undefined

传说是道格拉斯喝醉酒的时候,重复了发明了这两个数据类型,null和undefined可以认为是一样的

全局变量神出鬼没

函数内部可以生成全局变量

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

行尾分号自动加

Javascript的所有语句,都可以不用以分号结尾

比如,下面这个函数根本无法达到预期的结果,返回值不是一个对象,而是undefined

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

原因是解释器自动在return语句后面加上了分号

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

加号运算符

+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接

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

NaN

NaN是一种数字,表示超出了解释器的极限。它有一些很奇怪的特性

1
NaN === NaN; //false

数组和对象的区分

数组也是对象,要确认对象是不是数组比较麻烦

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

== 和 ===

==会自动转换数据类型,得到的直觉不符合常理

1
2
3
4
5
6
7
8
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

基本类型的包装对象

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

1
2
3
new Boolean(false);
new Number(1234);
new String("Hello World");

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

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

虽然JavaScript缺陷很多,但是ES6及很多库已经很多解决了这些缺陷的问题,完善了不少。并且JavaScript是浏览器唯一的编程语言,将来一定是随着时代发展不断进步