引子: JS 定义和诞生的原因,以及缺陷。
0. 前言
0-1. 定义
来自 WikiPedia 上对 JavaScript 的定义:
JavaScript(通常缩写为 JS)是一种高级的、解释型的编程语言。JavaScript 是一门基于原型、函数先行的语言,是一门多范式的语言,它支持面向对象编程,命令式编程,以及函数式编程。它提供语法来操控文本、数组、日期以及正则表达式等,不支持 I/O,比如网络、存储和图形等,但这些都可以由它的宿主环境提供支持。它已经由 ECMA(欧洲电脑制造商协会)通过 ECMAScript 实现语言的标准化。它被世界上的绝大多数网站所使用,也被世界主流浏览器(Chrome、IE、Firefox、Safari、Opera)支持。
那么 JS 是如何诞生的呢?
0-2. 诞生
诞生于1996 年的 JavaScript, 其设计者BrendanEich仅花了 10 天 时间便创造而出。
诞生原因:当时网景公司的发展决策是「未来的网页脚本语言必须看上去与Java足够相似,但是比Java简单,使得非专业的网页作者也能很快上手」,这个决定将 Perl、Python 等非面向对象编程的语言都排除了,但BrendanEich 对 Java 毫无兴趣,同时又临危受命,所以仅花费 10 天时间潦草设计出了 JavaScript。
仓促的设计时间、第一例同时结合函数式编程和面向对象编程的语言以至于没有设计先例可借阅、过早的标准化以至于没有时间调整设计, 这三个原因导致 JS 的设计不够完善,那么 JS 有哪些设计缺陷呢?
【过早的标准化】:设计缺陷尚未暴露就推行标准
1995.5,JS 设计完成
1995.10,解释器开发完成
1995.12,进入市场,广泛使用
1996.8,微软强推 Jscript
1996.11,网景申请 JS 的国际标准
1997.6,第一个国际标准 ECMA-262 正式颁布
0-3. 设计缺陷
(1). 不适合大型项目(现已解决)
JS 没有命名空间,难以模块化;允许同名函数的重复定义,后面覆盖前面,不利于模块化加载;
解决方案:ES6Module。import 命令用于输入其他模块提供的功能,同时创造命名空间(namespace),防止函数名冲突。
(2). 隐式类型转换
'' == '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
(3). 闭包
Detached DOM
1. 语言类型:动态
关于语言我们一般分为两个大类: 强类型与弱类型,动态与静态。
强类型:程序中表达的任何对象所从属的类型都必须能在编译时刻确定。例,C#,Java,Ruby,Python
弱类型:变量类型无需声明,JavaScript 引擎在运行代码的时候会自动计算变量类型。例,JavaScript,C,C++,PHP
动态:可以使用同一个变量保存不同类型的数据。例,JavaScript,Python,Ruby,PHP
静态:在声明变量之前需要先定义变量类型。例,C,C++,C#,Java
JS 是一种弱类型、动态的语言。
2. JS 内存模型(3 种内存空间)
2-1 分类
在 JS 执行过程中,主要有三种类型的