你不知道的JavaScript

JavaScript是什么?

JavaScript(通常缩写为JS)是一种高级的、解释型的编程语言。JavaScript是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象程序设计,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。它已经由ECMA(欧洲电脑制造商协会)通过ECMAScript实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari、Opera)支持。

JavaScript

JavaScript的诞生

  它诞生于1995年,当时主要用于处理如今的“前端验证”,也就是说,在 JavaScript 没有问世之前,表单项的验证需要提交到服务器端,这在当时的网络情况下是一种极差的用户体验,然而浏览器鼻祖的公司 Netscape 决定开发一门语言用于解决这破事,然而就有了 LiveScript ,它是 JS 的前身,因为 Netscape 当时跟 Sun 公司合作联合开发的,Netscape 也想借当时 Java 的热度,所以索性把名字更换为 JavaScript,从此这门语言就引起了世人的注意。

  然而,作为 Netscape 死对头的微软公司坐不住了,你整了一个 JavaScript,我就搞一个 JScript(轻吐槽一下,微软起步要在抄袭啊,人家的浏览器叫 Navigator,微软的浏览器就叫 Explorer ….),功能与 JavaScript 一致,所以这就导致了有标准不一致的 JS ,然而,将 JS 标准化就提到议程上了。1997年,JavaScript 1.1 作为蓝本交给了欧洲计算机制造商协会,由他们的技术委员会来制定标准,这个标准就是 ECMA-262,直到如今一共有7个版本(据说ES8也快出来了,嚯嚯~),也就是我们平时所认识的什么 ES5,ES6等等。

Javascript的10个设计缺陷

  1. 不适合开发大型程序:Javascript没有名称空间(namespace),很难模块化;没有如何将代码分布在多个文件的规范;允许同名函数的重复定义,后面的定义可以覆盖前面的定义,很不利于模块化加载。
  2. 非常小的标准库:Javascript提供的标准函数库非常小,只能完成一些基本操作,很多功能都不具备。
  3. null和undefined:null属于对象(object)的一种,意思是该对象为空;undefined则是一种数据类型,表示未定义。
    1
    2
    3
    // 两者非常容易混淆,但是含义完全不同。
     typeof null; // object
     typeof undefined; // undefined
  4. 全局变量难以控制:Javascript的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,这大大加剧了程序的复杂性。
  5. 自动插入行尾分号 :Javascript的所有语句,都必须以分号结尾。但是,如果你忘记加分号,解释器并不报错,而是为你自动加上分号。有时候,这会导致一些难以发现的错误。
  6. 加号运算符:+号作为运算符,有两个含义,可以表示数字与数字的和,也可以表示字符与字符的连接。
  7. NaN:NaN是一种数字,表示超出了解释器的极限。它有一些很奇怪的特性:
  8. 数组和对象的区分:由于Javascript的数组也属于对象(object),所以要区分一个对象到底是不是数组,相当麻烦。
  9. == 和 === : ==用来判断两个值是否相等。当两个值类型不同时,会发生自动转换,得到的结果非常不符合直觉。
  10. 基本类型的包装对象 : Javascript有三种基本数据类型:字符串、数字和布尔值。它们都有相应的建构函数,可以生成字符串对象、数字对象和布尔值对象。

为什么Javascript有设计缺陷

  • 设计阶段过于仓促, 因为Javascript的设计,其实只用了十天。
  • 没有先例,Javascript仍然是世界上唯一使用Prototype继承模型的主要语言。这使得它没有设计先例可以参考。
  • 过早的标准化 Javascript的发展非常快,根本没有时间调整设计。

以上信息来自于:阮一峰博客