时间的节点终于来到了JavaScript,既然是JavaScript速查手册,自然要用简明的毫无修饰的自然语言描述,闲话少说我们步入正题。
历史
时间回到Internet刚兴起的那段时间,如果用户要注册个账户,需要在表单里面填写邮件地址,如果用户填了个非法的邮箱地址,比如填了个sb,浏览器也原封不动的发给服务器,服务器校验邮件地址不对后再告诉浏览器你地址填错了,当时的Internet可不像现在这么快,简直是龟速,这么一来一往,花时间不说,对没耐心的用户来讲是一种考验。话说网景公司当时有个浏览器叫Netscape,每天也经受着这样的摧残,为了解决这个问题,在1995年的时候,Netscape公司的程序员布兰登·艾奇,花了十天的时间开发了LiveScript语言,这么短的时间开发一门语言,确实了不起。后来Netscape为了蹭Java的热度,把LiveScript改名为JavaScript,JavaScript和Java基本上没有什么关系。当时的JavaScript有三个版本,IE的JScript、网景的JavaScript和ScriptEase中的CEnvi。为了统一标准,1997年三家公司将统一化需求提交给欧洲计算机制造商协会(ECMA),该协会指定39号技术委员会负责将其进行标准化,代号为TC39,经过委员会数月的努力,一种名为ECMAScript的新脚本语言的标准诞生,JavaScript也由此变得标准化。近两年随着Node.js的风靡,JavaScript的执行也渐渐脱离了浏览器,变成了一门全栈语言,不仅前端在使用,后端也在使用。
研究一门语言我一般会从以下几个方面进行探讨:
运行环境,注释,数据类型,关键字,变量,命名规则,数据类型转换,作用域,函数,控制语句,面向对象,继承,接口,反射,异步,异常,IO操作,网络,常用库
执行环境
JavaScript可以在两种环境下执行,一种是在客户端执行的浏览器环境,在浏览器中执行,一种是将代码嵌入到<script>标签中,另一种是直接写到js文件中
1 | //嵌入到标签中的写法 |
另一种是在服务器端执行的Node.js环境,不需要嵌套在任何标签内,直接写代码即可:
1 | console.log("Hello World!"); |
注释
- 单行注释://单行注释信息。
- 多行注释:/*多行注释信息*/。
执行顺序
当代码嵌套到<script>中时,脚本是按先后顺序执行,当然我们可以通过添加defer属性延迟执行脚本
1 | <!DOCTYPE html> |
defer属性虽然会将脚本执行延迟,但是会同步加载文件,造成阻塞,有另一种方法可以异步加载文件,那就是async属性,即在加载 JavaScript 文件时,浏览器不会暂停,而是继续解析。这样能节省时间,提升响应速度。
1 | <!DOCTYPE html> |
命名规则
- 第一个字符必须是字母、下划线(_)或美元符号($)。
- 除了第一个字符外,其他位置可以使用 Unicode 字符。一般建议仅使用 ASCII 编码的字母,不建议使用双字节的字符。
- 不能与 JavaScript 关键字、保留字重名。
- 可以使用 Unicode 转义序列。例如,字符 a 可以使用“\u0061”表示。
关键字
break | delete | if | this | while |
case | do | in | throw | with |
catch | else | instanceof | try | |
continue | finally | new | typeof | |
debugger(ECMAScript 5 新增) | for | return | var | |
default | function | switch | void | |
abstract | double | goto | native | static |
boolean | enum | implements | package | super |
byte | export | import | private | synchronized |
char | extends | int | protected | throws |
class | final | interface | public | transient |
const | float | long | short | volatile |
变量声明
1 | var a; //声明一个变量 |
数据类型
JavaScript 定义了 6 种基本数据类型,如表所示。
数据类型 | 说明 |
---|---|
null | 空值,表示非对象 |
undefined | 未定义的值,表示未赋值的初始化值 |
number | 数字,数学运算的值 |
string | 字符串,表示信息流 |
boolean | 布尔值,逻辑运算的值 |
object | 对象,表示复合结构的数据集 |
使用typeof可以返回数据类型的字符串形式:
1 | //如果是 null 值,则先返回字符串 "null" 否则返回(typeof o)的值 |
启用严格模式
在代码首部添加以下一行字符串,即可启用严格模式。
1 | "use strict" |
数据类型转换
1 | //把数字转换为字符串 |
运算符
+ | 加法 | !== | 不等值或不等型 |
---|---|---|---|
- | 减法 | > | 大于 |
* | 乘法 | < | 小于 |
/ | 除法 | >= | 大于或等于 |
% | 系数 | <= | 小于或等于 |
++ | 递加 | ? | 三元运算符 |
– | 递减 | && | 逻辑与 |
= | x = y | || | 逻辑或 |
+= | x += y | ! | 逻辑非 |
-= | x -= y | & | 与 |
*= | x *= y | | | 或 |
/= | x /= y | ~ | 非 |
%= | x %= y | ^ | 异或 |
== | 等于 | << | 零填充左位移 |
=== | 等值等型 | >> | 有符号右位移 |
!= | 不相等 | >>> | 零填充右位移 |
typeof | 返回变量的类型。 | b ? x : y | 条件运算符 |
instanceof | 返回 true,如果对象是对象类型的实例。 |
控制语句
1 | var num = parseInt(Math.random() * 99 + 1); |
异常
ECMA-262 规范了 7 种错误类型,具体说明如下。其中 Error 是基类,其他 6 种错误类型是子类,都继承 Error 基类。Error 类型的主要用途是自定义错误对象。
- Error:普通异常。与 throw 语句和 try/catch 语句一起使用,属性 name 可以读写异常类型,message 属性可以读写详细错误信息。
- EvalError:不正确的使用 eval() 方法时抛出。
- SyntaxError:出现语法错误时抛出。
- RangeError:数字超出合法范围时抛出、
- ReferenceError:读取不存在的变量时抛出。
- TypeError:值得类型发生错误时抛出。
- URIError:URI 编码和解码错误时抛出。
try/catch/finally 是 JavaScript 异常处理语句。语法格式如下:
1 | try{ |
throw 语句能够主动抛出异常,语法格式如下:
1 | throw expression; |
未完待续。。。