javascript的历史
js诞生于1995年,当时网景公司发布了历史上第一个成熟的网络浏览器,但是只能用于浏览,创始人认为需要一种语言实现网页与使用者的动态交互,于是招聘了Brendan Eich来设计一门语言,由于当时网景公司正在与sum公司合作,公司要求这门语言要和java相似。Brendan Eich花了十天设计了javascript他的设计思路是这样的:
1.借鉴C语言的基本语法
2.借鉴Java语言的数据类型和内存管理
3.借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;
4.借鉴Self语言,使用基于原型(prototype)的继承机制。
所以,Javascript语言实际上是两种语言风格的混合产物----(简化的)函数式编程+(简化的)面向对象编程。这是由Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定的。
javascript的缺陷
1.不适合开发大型程序 没有命名空间,难以模块化。 早期一般通过闭包的方式解决,但是随着技术的发展,js的模块化技术也已经十分成熟如CommonJs、RequireJs、官方的ES6模块化。
2.非常小的标准库 Javascript提供的标准函数库非常小,只能完成一些基本操作,很多功能都不具备。
3.null和undefined null属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义。 二者十分容易混淆,在实际使用中,null几乎没用。
4.全局变量难以控制 任何一个函数内部都能产生全局变量,使得代码难以维护
5.自动插入行尾分号 js可以省略分号结尾,这导致一些难以发现的错误
6.加号运算符 +号可以代表数字相加,也可以表示字符串的拼接。如果一个操作项是字符,另一个操作项是数字,则数字自动转化为字符。这导致了很多运算增加了不必要的复杂性。
7.NaN NaN是一种数字,表示超出了解释器的极限。 它有一些很奇怪的特性:
NaN === NaN; //false
NaN !== NaN; //true
alert( 1 + NaN ); // NaN
与其设计NaN,不如解释器直接报错,反而有利于简化程序。
8.数组和对象的区分 由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组, 相当麻烦。Douglas Crockford的代码是这样的:
if ( arr && typeof arr === 'object' && typeof arr.length === 'number' && !arr.propertyIsEnumerable('length'))
{
alert("arr is an array");
}
如今ES6可以用Array.isArray()来判断
- == 和 === 当两个值类型不同时,==会发生自动转换,得到的结果非常不符合直觉。
因此,推荐任何时候都使用”===”(精确判断)比较符。
本文参考阮一峰博客Javascript的10个设计缺陷、Javascript诞生记