JavaScript 是世界上最流行的脚本语言, 是属于 HTML 和 Web 的编程语言。 本文章主要介绍 JavaScript 的基本语法。
Quick Guide
JavaScript 是 web 开发者必学的三种语言之一:
- HTML 定义网页的内容
- CSS 规定网页的布局
- JavaScript 对网页行为进行编程
一、用途
- JavaScript 能够改变 HTML 内容
1 |
|
JavaScript 能够改变 HTML 属性
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<body>
<h2>JavaScript 能做什么?</h2>
<p>JavaScript 能够改变 HTML 属性值。</p>
<p>在本例中,JavaScript 改变了图像的 src 属性值。</p>
<button onclick="document.getElementById('myImage').src='/i/eg_bulbon.gif'">开灯</button>
<img id="myImage" border="0" src="/i/eg_bulboff.gif" style="text-align:center;">
<button onclick="document.getElementById('myImage').src='/i/eg_bulboff.gif'">关灯</button>
</body>
</html>JavaScript 能够改变 HTML 样式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<body>
<h2>JavaScript 能够做什么</h2>
<p id="demo">JavaScript 能够改变 HTML 元素的样式。</p>
<button type="button" onclick="document.getElementById('demo').style.fontSize='35px'">
点击我!
</button>
</body>
</html>JavaScript 能够隐藏 HTML 元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>
<body>
<h2>JavaScript 能够做什么</h2>
<p id="demo">JavaScript 能够隐藏 HTML 元素。</p>
<button type="button" onclick="document.getElementById('demo').style.display='none'">
点击我!
</button>
</body>
</html>JavaScript 能够显示 HTML 元素
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<body>
<h2>JavaScript 能够做什么</h2>
<p>JavaScript 能够显示隐藏的 HTML 元素。</p>
<p id="demo" style="display:none">Hello JavaScript!</p>
<button type="button" onclick="document.getElementById('demo').style.display='block'">
点击我!
</button>
</body>
</html>
二、使用
在 HTML 中, 脚本可被放置与 HTML 页面的 <body> 或 <head> 部分中 <script> 与 </script> 标签之间。
内部引用
1 |
|
外部引用
分离了 HTML 和代码
使 HTML 和 JavaScript 更易于阅读和维护
已缓存的 JavaScript 文件可加速页面加载
1 | // 外部myScript.js |
1 | <script type="text/javascript" src="myScript.js"></script> |
三、基本语法
3.1.输出
- 使用 window.alert() 写入警告框
- 使用 document.write() 写入 HTML 输出
- 使用 innerHTML 写入 HTML 元素
- 使用 console.log() 写入浏览器控制台
1 |
|
1 |
|
1 |
|
1 |
|
3.2.语句
由 值、运算符、表达式、关键词和注释构成。
- 关键词:代码内部用于标识被执行的动作
- 值:字面量(具体的数据)和变量值(存储字面量的名称)
- 运算符:如算数运算符(+ - * /)
- 表达式:变量和运算符的组合,计算结果是值
- 注释:代码描述说明
1 | var x, y; // 如何声明变量 |
关键词指的是保留的单词。保留词无法用作变量名。
| 关键词 | 描述 |
|---|---|
| break | 终止 switch 或循环。 |
| continue | 跳出循环并在顶端开始。 |
| debugger | 停止执行 JavaScript,并调用调试函数(如果可用)。 |
| do … while | 执行语句块,并在条件为真时重复代码块。 |
| for | 标记需被执行的语句块,只要条件为真。 |
| function | 声明函数。 |
| if … else | 标记需被执行的语句块,根据某个条件。 |
| return | 退出函数。 |
| switch | 标记需被执行的语句块,根据不同的情况。 |
| try … catch | 对语句块实现错误处理。 |
| var | 声明变量。 |
注意:
- 1.使用分号分隔语句
- 2.增加适当空格(符号之间或者代码块的缩进)提高可读性
- 3.代码行控制在 80 个字符以内
- 4.使用花括号包围代码块
- 5.双斜杠 // 或 / 与 / 之间的代码被视为注释
3.3.标识符
标识符:有 变量 和 关键词。下面是命名规则:
- 名称可包含字母、数字、下划线和美元符号
- 名称必须以字母开头
- 名称也可以 $ 和 _ 开头(一般不会这么做)
- 名称对大小写敏感(y 和 Y 是不同的变量)
- 保留字(比如 JavaScript 的关键词)无法用作变量名称
3.4.变量
存储数据值的容器,变量必须以唯一的名称的标识。
1 | // 声明未定义,值为undefined |
3.5.数据类型
变量可用作不同类型
字符串值
1 | // 字符串 |
数值
1 | // 数值:64 位的浮点数 |
布尔值
1 | // 布尔值 |
undefined
1 | // 空 |
对象
1 | // 数组:一种特殊类型的对象,使用数字索引 |
| 代码 | 结果 |
|---|---|
| \b | 退格键 |
| \f | 换页 |
| \n | 新行 |
| \r | 回车 |
| \t | 水平制表符 |
| \v | 垂直制表符 |
获取类型
- typeof
- 使用 typeof 操作符来查看 JavaScript 变量的数据类型。
- NaN 的数据类型是 number
- 数组(Array)的数据类型是 object
- 日期(Date)的数据类型为 object
- null 的数据类型是 object
- 未定义变量的数据类型为 undefined
1 | typeof "John" // 返回 string |
如果对象是 JavaScript Array 或 JavaScript Date ,我们就无法通过 typeof 来判断他们的类型,因为都是 返回 Object。
- constructor
constructor 属性返回所有 JavaScript 变量的构造函数。
1 | "John".constructor // 返回函数 String() { [native code] } |
类型转换
JavaScript 变量可以转换为新变量或其他数据类型:
- 通过使用 JavaScript 函数
- 通过 JavaScript 自身自动转换
转换为字符串
1 | // 将数字转换为字符串 |
转换为数字
1 | //将字符串转换为数字 |
自动转换类型
当 JavaScript 尝试操作一个 “错误” 的数据类型时,会自动转换为 “正确” 的数据类型。
1 | 5 + null // 返回 5 because null is converted to 0 |
3.6.运算符
算数运算
算数运算符用于对数字执行算数运算:
| 运算符 | 描述 |
|---|---|
| + | 加法 |
| - | 减法 |
| * | 乘法 |
| / | 除法 |
| % | 系数 |
| ++ | 递加 |
| – | 递减 |
赋值运算
赋值运算符向 JavaScript 变量赋值。
| 运算符 | 例子 | 等同于 |
|---|---|---|
| = | x = y | x = y |
| += | x += y | x = x + y |
| -= | x -= y | x = x - y |
| *= | x *= y | x = x * y |
| /= | x /= y | x = x / y |
| %= | x %= y | x = x % y |
比较预算符
| 运算符 | 描述 |
|---|---|
| == | 等于 |
| === | 等值等型 |
| != | 不相等 |
| !== | 不等值或不等型 |
| > | 大于 |
| < | 小于 |
| >= | 大于或等于 |
| <= | 小于或等于 |
| ? | 三元运算符 |
逻辑运算符
| 运算符 | 描述 | ||
|---|---|---|---|
| && | 逻辑与 | ||
| \ | \ | 逻辑或 | |
| ! | 逻辑非 |
类型运算符
| 运算符 | 描述 |
|---|---|
| typeof | 返回变量的类型。 |
| instanceof | 返回 true,如果对象是对象类型的实例。 |
位运算符
| 运算符 | 描述 | 例子 | 等同于 | 结果 | 十进制 | |||
|---|---|---|---|---|---|---|---|---|
| & | 与 | 5 & 1 | 0101 & 0001 | 0001 | 1 | |||
| \ | 或 | 5 \ | 1 | 0101 \ | 0001 | 0101 | 5 | |
| ~ | 非 | ~ 5 | ~0101 | 1010 | 10 | |||
| ^ | 异或 | 5 ^ 1 | 0101 ^ 0001 | 0100 | 4 | |||
| << | 零填充左位移 | 5 << 1 | 0101 << 1 | 1010 | 10 | |||
| >> | 有符号右位移 | 5 >> 1 | 0101 >> 1 | 0010 | 2 | |||
| >>> | 零填充右位移 | 5 >>> 1 | 0101 >>> 1 | 0010 | 2 |
运算符优先级值
| 值 | 运算符 | 描述 | 实例 | ||||
|---|---|---|---|---|---|---|---|
| 20 | ( ) | 表达式分组 | (3 + 4) | ||||
| 19 | . | 成员 | person.name | ||||
| 19 | [] | 成员 | person[“name”] | ||||
| 19 | () | 函数调用 | myFunction() | ||||
| 19 | new | 创建 | new Date() | ||||
| 17 | ++ | 后缀递增 | i++ | ||||
| 17 | – | 后缀递减 | i– | ||||
| 16 | ++ | 前缀递增 | ++i | ||||
| 16 | – | 前缀递减 | –i | ||||
| 16 | ! | 逻辑否 | !(x==y) | ||||
| 16 | typeof | 类型 | typeof x | ||||
| 15 | ** | 求幂 (ES7) | 10 ** 2 | ||||
| 14 | * | 乘 | 10 * 5 | ||||
| 14 | / | 除 | 10 / 5 | ||||
| 14 | % | 模数除法 | 10 % 5 | ||||
| 13 | + | 加 | 10 + 5 | ||||
| 13 | - | 减 | 10 - 5 | ||||
| 12 | << | 左位移 | x << 2 | ||||
| 12 | >> | 右位移 | x >> 2 | ||||
| 12 | >>> | 右位移(无符号) | x >>> 2 | ||||
| 11 | < | 小于 | x < y | ||||
| 11 | <= | 小于或等于 | x <= y | ||||
| 11 | > | 大于 | x > y | ||||
| 11 | >= | 大于或等于 | x >= y | ||||
| 11 | in | 对象中的属性 | “PI” in Math | ||||
| 11 | instanceof | 对象的实例 | instanceof Array | ||||
| 10 | == | 相等 | x == y | ||||
| 10 | === | 严格相等 | x === y | ||||
| 10 | != | 不相等 | x != y | ||||
| 10 | !== | 严格不相等 | x !== y | ||||
| 9 | & | 按位与 | x & y | ||||
| 8 | ^ | 按位 XOR | x ^ y | ||||
| 7 | \ | 按位或 | x \ | y | |||
| 6 | && | 逻辑与 | x && y | ||||
| 5 | \ | \ | 逻辑否 | x \ | \ | y | |
| 4 | ? : | 条件 | ? “Yes” : “No” | ||||
| 3 | = | 赋值 | x = y | ||||
| 3 | += | 赋值 | x += y | ||||
| 3 | -= | 赋值 | x -= y | ||||
| 3 | *= | 赋值 | x *= y | ||||
| 3 | %= | 赋值 | x %= y | ||||
| 3 | <<= | 赋值 | x <<= y | ||||
| 3 | >>= | 赋值 | x >>= y | ||||
| 3 | >>>= | 赋值 | x >>>= y | ||||
| 3 | &= | 赋值 | x &= y | ||||
| 3 | ^= | 赋值 | x ^= y | ||||
| 3 | \ | = | 赋值 | x \ | = y | ||
| 2 | yield | 暂停函数 | yield x | ||||
| 1 | , | 逗号 | 7 , 8 |
提示:括号中的表达式会在值在表达式的其余部分中被使用之前进行完全计算。
3.7.保留关键字
保留关键字在意思上表达成为将来的关键字而保留的单词。
JavaScript 保留关键字
| abstract | arguments | boolean | break | byte |
|---|---|---|---|---|
| case | catch | char | class* | const |
| continue | debugger | default | delete | do |
| double | else | enum* | eval | export* |
| extends* | false | final | finally | float |
| for | function | goto | if | implements |
| import* | in | instanceof | int | interface |
| let | long | native | new | null |
| package | private | protected | public | return |
| short | static | super* | switch | synchronized |
| this | throw | throws | transient | true |
| try | typeof | var | void | volatile |
| while | with | yield |
* 标记的关键字是 ECMAScript5 中新添加的。
JavaScript 对象、属性和方法
| Array | Date | eval | function | hasOwnProperty |
|---|---|---|---|---|
| Infinity | isFinite | isNaN | isPrototypeOf | length |
| Math | NaN | name | Number | Object |
| prototype | String | toString | undefined | valueOf |
Java 保留关键字
JavaScript 经常与 Java 一起使用。您应该避免使用一些 Java 对象和属性作为 JavaScript 标识符:
| getClass | java | JavaArray |
|---|---|---|
| javaClass | JavaObject | JavaPackage |
Windows 保留关键字
| alert | all | anchor | anchors | area |
|---|---|---|---|---|
| assign | blur | button | checkbox | clearInterval |
| clearTimeout | clientInformation | close | closed | confirm |
| constructor | crypto | decodeURI | decodeURIComponent | defaultStatus |
| document | element | elements | embed | embeds |
| encodeURI | encodeURIComponent | escape | event | fileUpload |
| focus | form | forms | frame | innerHeight |
| innerWidth | layer | layers | link | location |
| mimeTypes | navigate | navigator | frames | frameRate |
| hidden | history | image | images | offscreenBuffering |
| open | opener | option | outerHeight | outerWidth |
| packages | pageXOffset | pageYOffset | parent | parseFloat |
| parseInt | password | pkcs11 | plugin | prompt |
| propertyIsEnum | radio | reset | screenX | screenY |
| scroll | secure | select | self | setInterval |
| setTimeout | status | submit | taint | text |
| textarea | top | unescape | untaint | window |
HTML 事件句柄
| onblur | onclick | onerror | onfocus |
|---|---|---|---|
| onkeydown | onkeypress | onkeyup | onmouseover |
| onload | onmouseup | onmousedown | onsubmit |
注意:在JavaScript中关键字不能用作变量名或者函数名,否则可能会得到错误消息,例如“”Identifier Expected”(应该有标识符、期望标识符)”。
四、流程
4.1.条件
通常在写代码时,您总是需要为不同的决定来执行不同的动作。您可以在代码中使用条件语句来完成该任务。
- if 语句 - 只有当指定条件为 true 时,使用该语句来执行代码
- if…else 语句 - 当条件为 true 时执行代码,当条件为 false 时执行其他代码
- JavaScript三目运算 - 当条件为true 时执行代码,当条件为 false 时执行其他代码
- if…else if….else 语句- 使用该语句来选择多个代码块之一来执行
- switch 语句 - 使用该语句来选择多个代码块之一来执行
if
只有当指定条件为 true 时,该语句才会执行代码。
- 语法
1 | if (condition){ |
- 例子
1 | if (time<20){ |
switch
switch 语句用于在不同的条件执行不同的动作。搭配case和default使用(default可以认为是一个特殊的case,case对应一种或多种(default)情况,Switch语句没有case是没有办法体现其功能的)。
语法
- 计算一次 switch 表达式
- 把表达式的值与每个case的值进行对比
- 如果存在匹配,则执行关联代码
1
2
3
4
5
6
7
8
9
10switch(n){
case 1:
执行代码块 1
break;
case 2:
执行代码块 2
break;
default:
n 与 case 1 和 case 2 不同时执行的代码
}
例子
1 | var x = "0"; |
4.2.循环
循环可以将代码块执行指定的次数。
- for - 循环代码块一定的次数
- for/in - 循环遍历对象的属性
- while - 当指定的条件为 true 时循环指定的代码块
- do/while - 同样当指定的条件为 true 时循环指定的代码块
for
- 语法
- 语句 1 (代码块)开始前执行 starts.
- 语句 2 定义运行循环(代码块)的条件
- 语句 3 在循环(代码块)已被执行之后执行
1 | for (语句 1; 语句 2; 语句 3){ |
- 例子
- Statement 1 在循环开始之前设置变量 (var i=0)。
- Statement 2 定义循环运行的条件(i 必须小于 5)。
- Statement 3 在每次代码块已被执行后增加一个值 (i++)
1 | for (var i=0; i<5; i++){ |
while
while 循环会在指定条件为真时循环执行代码块。
- 语法
1 | while (条件){ |
- 例子
1 | while (i<5){ |
4.3.跳转
- return 用于结束当前函数,并返回内容
- break 语句用于跳出循环。
- continue 用于跳过循环中的一个迭代。
Break
1 | for (i=0;i<10;i++){ |
Continue
1 | for (i=0;i<=10;i++){ |
4.4.异常处理
- try 语句测试代码块的错误。
- catch 语句处理错误。
- throw 语句创建自定义错误。
throw
throw 语句允许我们创建自定义错误。
- 语法
1 | throw exception |
- 例子
1 | var x=document.getElementById("demo").value; |
try 和 catch
- 语法
1 | try{ |
- 实例
1 | var txt=""; |
五、函数
JavaScript 使用关键字 function 定义函数。函数可以通过声明定义,也可以是一个表达式。
5.1.定义
- 函数声明
1 | function myFunction(a, b) { |
- 函数表达式
1 | var x = function (a, b) {return a * b}; |
- 构造函数
1 | var myFunction = new Function("a", "b", "return a * b"); |
- 函数提升
1 | // 提升(Hoisting)是 JavaScript 默认将当前作用域提升到前面去的的行为 |
5.2.函数参数
JavaScript 函数参数与大多数其他语言的函数参数的区别在于:它不会关注有多少个参数被传递,不关注传递的参数的数据类型。
- 显式参数
1 | functionName(parameter1, parameter2, parameter3) { |
- 隐私参数 Arguments 包含了函数调用的参数数组
1 | x = sumAll(1, 123, 500, 115, 44, 88); |
- 默认参数
1 | function myFunction(x, y) { |
- 值传递
1 | var x = 1; |
- 对象传递参数
1 | var obj = {x:1}; |
5.3.函数调用
JavaScript 函数有 4 种调用方式。
每种方式的不同在于 this 的初始化。
一般而言,在Javascript中,this指向函数执行时的当前对象。
- 作为一个函数调用
1 | function myFunction(a, b) { |
- 函数作为方法调用
1 | var myObject = { |
- 使用构造函数调用函数
1 | // 构造函数: |
- 作为函数方法调用函数
1 | function myFunction(a, b) { |
5.4.闭包
能访问函数内部的变量
1 | // 只有调用函数才能累计 |
More info: JavaScript 参考手册