JavaScript 语法基础
注释
- 单行注释(快捷键
Ctrl + /
)
// 单行注释
- 多行注释(快捷键
Shift + Alt + A
)
/*
多行注释
*/
结束符
使用英文分号;
代表语句结束。在实际开发中,大多数情况下可以省略,浏览器可以自动推断语句结束位置,回车会被解析为;
少数需要手动加分号的情况有:以括号、方括号、正则开头的斜杆、加号、减号作为行首时。
输入输出
这里的输入输出,不是其他语言中的 I/O,只单指与浏览器进行交互
// 输入
prompt('输入内容')
// 输出
document.write('要输出的内容') // 向body内输出内容,可以解析标签
document.writeln('要输出的内容')
alert('要输出的内容') // 页面弹出警告对话框
console.log('要输出的内容') // 控制台打印
alert()
和prompt()
它们会跳过页面渲染先被执行
字面量
字面量是指在代码中直接表示值的特殊语法结构。字面量是 JavaScript 中创建数据的一种简单方式,它允许你直接在代码中定义一些基本的数据结构,而不是通过调用函数或构造器。如:
3000
:数字字面量'hello world'
: 字符串字面量true
: 布尔字面量{}
:对象字面量[]
:数组字面量/ab+c/i
:正则表达式字面量function fn() {}
、() => {}
:函数字面量
字面量永远不能出现在等号的左边,等号的左边只能是变量
变量
JavaScript 中,变量指的是一个可以改变的量。可以把变量看成存储数据的容器,本质上是程序在内存中申请的一块用来存放数据的小空间

变量名只能包含字母、数字、下划线、$
,且不能以数字开头,此外不能使用关键字且严格区分大小写。在命名变量的过程中,要尽可能的让变量具有意义,一个变量包含多个单词时,使用小驼峰命名法(如userName
)
与很多语言一样,JS 也可以同时声明多个变量并赋值,不过 JS 具有变量没有类型而值有类型的特点(弱类型)声明变量使用let、var
,无需声明类型
var a // es6之后不推荐使用var
let b
// 可以多变量声明,一般都是分开声明
let age = 18,uname = 'moss'
其他变量相关知识点,如变量提升、块级作用域等,见JavaScript进阶部分
常量
使用const
声明的变量称为常量,当某个变量永远不会改变的时候,就可以使用const
来声明
常量无法修改,强制修改会报错
常量必须要初始化,定义的时候必须要进行赋值
对于值常量(固定值),常量名推荐全大写,单词间以
_
分割,如:UPPER_SNAKE_CASE
const
声明并不会真的保护数据不被改变。 为了确保数据不被改变,JavaScript 提供了一个函数Object.freeze
,任何更改对象的尝试都将被拒绝,如果脚本在严格模式下运行,将抛出错误
"use strict"
const obj = {
name: "FreeCodeCamp",
review: "Awesome"
};
Object.freeze(obj);
obj.review = "bad"; // 报错
obj.newProp = "Test"; // 报错
console.log(obj); // { name: "FreeCodeCamp", review: "Awesome" }
严格模式
严格模式可以帮开发者及早发现错误,使代码更安全规范,推荐在代码中一直保持严格模式运行
基本差异
- 变量必须使用关键词声明,未声明的变量不允许赋值
"use strict"
url = 'www.baidu.com' // url is not defined
- 关键词不允许做变量使用
"use strict"
var public = 'hello' // Unexpected strict mode reserved word
- 变量参数不允许重复定义
"use strict"
function fn(name, name) {}
- 可以单独为函数设置严格模式
function strict(){
"use strict"
return "严格模式"
}
function notStrict() {
return "正常模式"
}
- 为了在多文件合并时,防止全局设置严格模式对其他没使用严格模式文件的影响,将脚本放在一个执行函数中
(function () {
"use strict"
function fn(name, name) {}
})();
解构差异
- 如果解构赋值中的变量未事先声明,会抛出
ReferenceError
// 严格模式
'use strict';
const [a, b] = [1, 2] // 如果没有声明过a和b,会抛出ReferenceError
- 在函数参数中,解构赋值不会影响外层作用域的同名变量
// 严格模式
function example({x}) {
x = 2 // 这里会抛出TypeError,因为参数不能被赋值
}
流程控制
在JavaScript中,共有三种流程控制方式:顺序结构、选择结构、循环结构
顺序结构:代码按照从上到下、从左到右的顺序执行
选择结构:根据条件判断来决定使用哪一段代码。包括单向选择、双向选择、多向选择。无论是哪一种,都只执行其中的一个分支
循环结构:根据条件来判断是否重复执行某一段程序。若条件为 true,则继续循环;若条件为 false,则退出循环
分支语句
if
分支语句
if
语句分为:单分支、双分支、多分支- 括号内的结果不是布尔类型时,会发生隐式类型转换,转换为布尔值
if
语句中只有一行时,可以省略{}
// 单分支
if (条件) {
// 满足条件要执行的代码
}
// 双分支
if (条件) {
// 满足条件要执行的代码
} else {
// 不满足条件要执行的代码
}
// 多分支
if (条件1) {
// 代码1
} else if (条件2) {
// 代码2
} else if (条件3) {
// 代码3
} else {
// 代码n
}
// 先判断条件1,若满足条件1就执行代码1,其他不执行
// 若条件1不满足则向下判断条件2,满足条件2执行代码2,其他不执行
// 若依然不满足继续往下判断,依次类推
// 若以上条件都不满足,执行else里的代码n
Switch
语句
- 找到跟括号里数据全等的 case 值,并执行里面对应的代码,若没有全等
===
的则执行default
内的代码 switch case
语句一般用于等值判断,不适合于区间判断switch case
一般需要配合break
关键字使用,没有break
会造成case
穿透
switch (数据) {
case 值1:
代码1
break;
case 值2:
代码2
break;
default:
代码n
break;
}
循环语句
while
循环
// 符合条件,一直循环,否则跳出循环体
while (循环条件) {
要重复执行的代码(循环体)
}
while 循环三要素:
- 循环变量初始化
- 循环条件(判断条件是否成立,成立执行循环体代码,不成立,循环结束)
- 变量更新(自增或自减)
//变量初始化
let i = 1
//循环条件
while (i <= 3) {
document.write(`我会循环三次<br>`)
//变量更新
i++
}
do...while
循环:不论什么情况,都会执行do
循环里的代码,然后当while
条件被评估为true
的时,继续运行循环
for
循环
- 初始化语句只会在执行循环开始之前执行一次,通常用于定义和设置循环变量
- 循环条件语句会在每一轮循环的开始前执行,条件为
true
时执行循环。这意味着,如果条件在一开始就为false
,这个循环将不会执行 - 终止循环表达式在每次循环迭代结束, 在下一个条件检查之前时执行,通常用来递增或递减循环计数
for (初始化语句; 循环条件语句; 终止循环表达式) {
//循环体
}
循环退出:continue
(中止本次循环,开始下次循环)、break
(中止整个循环)
无限循环:while(true)
、for(;;)
。都需使用break
退出循环
异常处理
异常处理是指预估代码执行过程中可能发生的错误,最大程度避免错误的发生
主要包含三个部分:
throw
:抛出异常信息,程序终止执行用于在try
中手动抛出错误,立即触发对应的catch
块Error
:内置对象,配合throw
使用,能够设置更详细的错误信息try...catch...finally
:捕获错误信息。try
代码块为可能发生错误的代码、catch
代码块对应错误发生后执行的代码、finally
代码块为最终且一定执行的代码
function divide(a, b) {
try {
// 可能发生错误的代码
if (b === 0) {
// 如果除数为0,抛出异常
throw new Error("Division by zero is not allowed.")
}
return a / b
} catch (e) {
// 捕获错误信息并处理
console.error("An error occurred: ", e.message)
// 可以选择返回一个默认值或执行其他错误恢复操作
return null
} finally {
// 无论是否发生错误,都会执行的代码
console.log("Execution of the divide function is complete.")
}
}
// 使用这个函数
var result = divide(10, 2) // 正常情况,期望得到 5
console.log(result) // 输出: 5
result = divide(10, 0) // 异常情况,除数为0
console.log(result) // 输出: null
try...catch
并不是异步操作,不影响 JavaScript 的单线程执行模型。异步操作中使用 try...catch
需要注意错误可能在Promise
的.then()
或.catch()
中被捕获,或在使用async/await
时通过try...catch
包裹异步函数内部的代码来捕获错误
可以用
debugger
来打断点调试,不过一般用的比较少,了解即可