JavaScript基础详解
1. 概述
JavaScript是一种解释型、基于对象、动态类型的脚本语言,主要用于增强网页的交互性。它与Java没有关系,只是在诞生初期为了借助Java的热度而取了类似的名字。
- 解释型:不需要编译,由浏览器直接解释执行
- 基于对象:支持面向对象编程,但没有类的概念(ES6之前)
- 动态类型:变量类型在运行时确定,无需声明类型
JavaScript主要运行在客户端浏览器中,但随着Node.js的发展,现在也可以在服务器端运行。
为什么需要JavaScript?
- 交互性:创建动态网页效果(如表单验证、动画效果)
- 异步通信:通过AJAX实现与服务器的异步通信
- 操作DOM:动态修改网页内容和结构
- 操作BOM:控制浏览器行为(如窗口、历史记录等)
示例
1 | // 简单的JavaScript代码示例 |
2. 嵌入方法
2.1 内嵌式
详细解释:
- 将JavaScript代码直接写在HTML文档的
<script>标签中 - 通常放在
<head>或<body>底部 - 优点:无需额外文件请求,代码与页面紧密结合
- 缺点:代码难以复用,HTML与JS混合导致维护困难
示例:
1 |
|
2.2 外链式
详细解释:
- 将JavaScript代码保存在单独的
.js文件中 - 通过
<script src="路径">标签引入 - 优点:代码复用性高,HTML与JS分离,便于维护
- 缺点:增加HTTP请求,可能影响页面加载速度
示例:
- 创建
script.js文件:
1 | // script.js |
- 在HTML中引入:
1 |
|
2.3 行内式
详细解释:
- 直接将JavaScript代码写在HTML元素的事件属性中
- 通常用于简单的事件处理
- 优点:简单直接
- 缺点:代码难以维护,HTML与JS高度耦合
示例:
1 |
|
3. 语句
详细解释
- JavaScript语句:由值、运算符、表达式、关键词和注释组成的编程指令
- 执行顺序:从上到下,从左到右
- 分号:用于分隔JavaScript语句,虽然在大多数情况下可以省略(自动分号插入机制),但强烈建议显式添加
示例
1 | // 基本语句示例 |
4. 注释
详细解释
- 单行注释:以
//开头,直到行末 - 多行注释:以
/*开头,以*/结尾,可以跨多行 - 作用:解释代码、临时禁用代码、文档生成
- 最佳实践:保持注释简洁、准确,与代码同步更新
示例
1 | // 单行注释示例 |
5. 变量
详细解释
- 变量:用于存储信息的”容器”
- 命名规则:
- 只能包含字母、数字、下划线和美元符号
- 不能以数字开头
- 区分大小写
- 不能使用JavaScript保留关键字
- 声明方式:
var:ES5及之前,函数作用域let:ES6,块级作用域,可重新赋值const:ES6,块级作用域,不可重新赋值
示例
1 | // var 声明(函数作用域) |
6. JavaScript保留关键字
详细解释
- 保留关键字:JavaScript中保留的特殊单词,不能用作变量名、函数名或标签名
- 原因:这些关键字可能在当前或未来版本中具有特殊含义
- 重要性:使用保留关键字会导致语法错误
常见保留关键字
1 | abstract, arguments, boolean, break, byte, case, catch, char, class, const, continue, |
示例
1 | // 错误示例:使用保留关键字作为变量名 |
7. JavaScript作用域
7.1 局部变量
详细解释:
- 定义:在函数内部声明的变量
- 作用域:仅在声明它的函数内部可访问
- 生命周期:函数调用开始时创建,函数执行结束时销毁
- 特点:每次函数调用都会创建新的局部变量
示例:
1 | function calculate() { |
7.2 全局变量
详细解释:
- 定义:在函数外部声明的变量,或未使用
var/let/const声明的变量 - 作用域:在整个程序中可访问
- 生命周期:从声明开始直到页面关闭
- 特点:容易造成命名冲突,应谨慎使用
示例:
1 | // 全局变量声明 |
8. 数据类型
8.1 基本数据类型
8.1.1 数值型(Number)
详细解释:
- 所有数字都是
number类型,不分整数和浮点数 - 支持十进制、八进制、十六进制表示法
- 特殊值:
NaN(非数字)、Infinity(无穷大) - 最大安全整数:
Number.MAX_SAFE_INTEGER(2^53 - 1) - 最小安全整数:
Number.MIN_SAFE_INTEGER(-(2^53 - 1))
示例:
1 | // 十进制 |
8.1.2 字符串型(String)
详细解释:
- 用单引号或双引号包裹的文本
- 字符串是不可变的(修改会创建新字符串)
- 支持转义字符(如
\n、\t) - 模板字符串(ES6+):使用反引号(`)创建,支持多行和变量插值
示例:
1 | // 单引号和双引号 |
8.1.3 布尔型(Boolean)
详细解释:
- 只有两个值:
true和false - 用于条件判断和逻辑运算
- 在条件语句中,其他类型会隐式转换为布尔值
示例:
1 | // 布尔值 |
8.1.4 null(空值)
详细解释:
- 表示”无”或”空”的特殊值
- 通常用于表示对象引用为空
typeof null返回"object"(历史遗留问题)
示例:
1 | // null的使用 |
8.1.5 undefined(未定义)
详细解释:
- 表示变量已声明但未赋值
- 函数没有返回值时的默认返回值
- 未定义的属性或方法
typeof undefined返回"undefined"
示例:
1 | // 未初始化的变量 |
8.2 复合数据类型
8.2.1 对象(Object)
详细解释:
- 用于存储键值对的集合
- 无序的数据结构
- 通过属性和方法组织数据
- 所有非基本类型都是对象(包括数组、函数等)
示例:
1 | // 创建对象的多种方式 |
8.2.2 数组(Array)
详细解释:
- 用于存储有序的元素集合
- 元素可以是任意数据类型
- 通过索引访问元素(从0开始)
- 动态大小,可以随时添加或删除元素
示例:
1 | // 创建数组的多种方式 |
9. 函数
9.1 函数定义与调用
详细解释:
- 函数声明:使用
function关键字定义 - 函数表达式:将函数赋值给变量
- 调用:使用函数名加括号,可传递参数
- 返回值:使用
return语句,未返回则默认返回undefined
示例:
1 | // 函数声明 |
9.2 匿名函数
详细解释:
- 没有函数名的函数
- 通常作为回调函数使用
- 用于创建立即执行函数表达式(IIFE)
示例:
1 | // 作为回调函数 |
10. 字典(对象作为字典使用)
详细解释:
- JavaScript中没有专门的”字典”类型
- 通常使用对象来模拟字典(键值对存储)
- 键必须是字符串或Symbol类型
- 通过属性访问或
Object.keys()等方法遍历
示例:
1 | // 创建字典 |
11. JavaScript序列化与反序列化
详细解释:
- 序列化:将JavaScript对象转换为字符串
- 反序列化:将字符串转换回JavaScript对象
- 主要使用
JSON对象的stringify和parse方法 - JSON(JavaScript Object Notation)是一种轻量级数据交换格式
示例:
1 | // 创建对象 |
12. 转义与编码
详细解释:
- 转义:将特殊字符转换为安全表示形式
- URL编码:将URL中的特殊字符转换为%xx格式
- 常用方法:
encodeURI():编码整个URIencodeURIComponent():编码URI的组件decodeURI():解码URIdecodeURIComponent():解码URI组件
示例:
1 | // URI编码 |
13. eval
详细解释:
- eval():执行传入的字符串作为JavaScript代码
- 风险:可能执行恶意代码,造成安全漏洞
- 替代方案:尽可能使用更安全的方法(如JSON.parse)
示例:
1 | // 基本用法 |
14. 日期与时间
详细解释:
- Date对象:用于处理日期和时间
- 支持多种创建方式:当前时间、指定时间、时间戳
- 提供丰富的方法获取和设置日期时间组件
- 时区处理:默认使用本地时区
示例:
1 | // 创建Date对象 |
15. 面向对象编程
15.1 构造函数模式
详细解释:
- 使用函数作为构造函数
- 通过
new关键字创建实例 this指向新创建的对象- 通过原型添加共享方法
示例:
1 | // 构造函数 |
15.2 ES6类语法
详细解释:
- 使用
class关键字定义类 - 更简洁的语法,但底层仍是原型继承
- 支持构造函数、方法、静态方法、继承
- 语法糖,与构造函数模式本质相同
示例:
1 | // 类定义 |
16. 原型
16.1 原型的基本概念
详细解释:
- 原型:JavaScript中实现继承的机制
- 每个函数都有
prototype属性,指向原型对象 - 每个对象都有
__proto__属性,指向其构造函数的原型 - 当访问对象属性时,如果对象本身没有,会沿着原型链查找
- 原型链最终指向
Object.prototype,再往上是null
示例:
1 | // 原型基本概念 |
16.2 原型与类的联系
16.2.1 类与原型的基本关系
详细解释:
- ES6的
class只是原型继承的语法糖,它让开发者可以用更熟悉、更面向对象的方式编写代码,但底层仍然基于原型链实现。 - 类中定义的方法会被添加到构造函数的原型对象上,所有实例共享这些方法。
- 类的
prototype属性指向原型对象,与构造函数的prototype相同。
示例:
1 | // ES6 class写法 |
16.2.2 类方法在原型上的体现
详细解释:
- 实例方法:类中定义的普通方法会被添加到原型对象上,所有实例共享。
- 静态方法:被添加到类本身,而不是原型上。
示例:
1 | class Person { |
16.2.3 继承与原型链
详细解释:
extends关键字实现的继承,实际上是设置子类的prototype指向父类的prototype,建立原型链。super关键字在方法中指向父类的原型,在构造函数中指向父类构造函数。
示例:
1 | class Animal { |
16.2.4 类中访问和操作原型
详细解释:
- 类本身也有
prototype属性,可以直接操作。 - 可以通过实例的
__proto__或Object.getPrototypeOf()访问原型。
示例:
1 | class Person { |
16.2.5 类与原型的高级应用
详细解释:
- 可以使用
Object.setPrototypeOf()动态改变类的原型链。 - 类的继承机制底层使用
Object.create()。
示例:
1 | class Animal { |
17. 运算符
17.1 算术运算符
详细解释:
- 用于执行数学计算
- 包括加、减、乘、除、取模、递增、递减等
+运算符也用于字符串拼接
示例:
1 | // 基本算术 |
17.2 比较运算符
详细解释:
- 用于比较两个值
- 返回布尔值(true或false)
- 包括相等、不等、大于、小于等
- 有宽松相等(==)和严格相等(===)之分
示例:
1 | // 相等比较 |
17.3 赋值运算符
详细解释:
- 用于给变量赋值
- 包括简单赋值和复合赋值
- 复合赋值是运算和赋值的简写形式
示例:
1 | // 简单赋值 |
17.4 逻辑运算符
详细解释:
- 用于布尔值的逻辑运算
- 包括逻辑与(&&)、逻辑或(||)、逻辑非(!)
- 支持短路求值
- 可用于条件判断和默认值设置
示例:
1 | // 逻辑与(&&) |
17.5 三元运算符
详细解释:
- 条件表达式的简写形式
- 语法:
条件 ? 表达式1 : 表达式2 - 如果条件为真,返回表达式1;否则返回表达式2
- 可嵌套使用,但应避免过度嵌套
示例:
1 | // 基本用法 |
18. 流程控制语句
18.1 if语句
详细解释:
- 根据条件执行代码块
- 语法:
if (条件) { 代码块 } - 条件为真时执行代码块
示例:
1 | var score = 85; |
18.2 if-else语句
详细解释:
- 提供条件为假时的备选代码块
- 语法:
if (条件) { 代码块1 } else { 代码块2 }
示例:
1 | var score = 75; |
18.3 if…else if…else语句
详细解释:
- 用于多条件分支判断
- 语法:
if (条件1) { ... } else if (条件2) { ... } else { ... } - 按顺序检查条件,执行第一个为真的条件对应的代码块
示例:
1 | var score = 85; |
18.4 switch语句
详细解释:
- 用于多分支选择
- 语法:
switch (表达式) { case 值: ... break; ... default: ... } - 比较表达式与case值的严格相等(===)
- 使用break防止穿透
示例:
1 | var day = new Date().getDay(); |
18.5 循环结构
18.5.1 while循环
详细解释:
- 先判断条件,条件为真时执行循环体
- 语法:
while (条件) { 循环体 } - 可能一次都不执行
示例:
1 | var i = 0; |
18.5.2 do…while循环
详细解释:
- 先执行循环体,再判断条件
- 语法:
do { 循环体 } while (条件); - 至少执行一次
示例:
1 | var i = 0; |
18.5.3 for循环
详细解释:
- 三部分:初始化、条件、迭代
- 语法:
for (初始化; 条件; 迭代) { 循环体 } - 最常用的循环结构
示例:
1 | // 基本for循环 |
18.5.4 for…in循环
详细解释:
- 遍历对象的可枚举属性
- 语法:
for (var key in object) { ... } - 包括继承的属性,通常需要
hasOwnProperty检查 - 不保证顺序
示例:
1 | // 遍历对象属性 |
18.5.5 for…of循环(ES6+)
详细解释:
- 遍历可迭代对象(数组、字符串、Map、Set等)
- 语法:
for (var item of iterable) { ... } - 不遍历对象属性
- 保证顺序
示例:
1 | // 遍历数组 |
18.6 break与continue
详细解释:
break:立即终止循环continue:跳过当前迭代,继续下一次迭代- 可用于所有循环结构
示例:
1 | // break示例 |
19. JS操作DOM
19.1 什么是DOM?
详细解释:
- DOM(Document Object Model):文档对象模型
- 将HTML/XML文档表示为树形结构
- 允许JavaScript动态访问和修改文档内容
- 由W3C标准化,所有现代浏览器都支持
- DOM树由节点组成:元素节点、属性节点、文本节点等
示例:
1 | // DOM结构示例 |
19.2 DOM查找元素
19.2.1 直接查找
详细解释:
- 通过ID、标签名、类名等查找元素
- 返回单个元素或元素集合
示例:
1 | // 通过ID获取元素(返回单个元素) |
19.2.2 间接查找
详细解释:
- 通过已获取的元素查找其子元素、父元素或兄弟元素
- 常用属性:
parentNode、childNodes、children、firstChild、lastChild、nextSibling、previousSibling
示例:
1 | // 获取父元素 |
19.3 文件内容操作
19.3.1 内容操作
详细解释:
innerText:获取或设置元素的文本内容(不包括HTML标签)innerHTML:获取或设置元素的HTML内容(包括HTML标签)textContent:类似innerText,但更标准,保留所有空白
示例:
1 | // 获取内容 |
19.3.2 表单元素操作
详细解释:
value:获取或设置输入框的值selectedIndex:获取或设置下拉菜单的选中索引checked:获取或设置复选框/单选按钮的选中状态
示例:
1 | // 输入框 |
19.4 样式操作
19.4.1 样式操作
详细解释:
className:获取或设置元素的class属性(字符串)classList:元素的类列表(DOMTokenList对象)style:元素的行内样式对象
示例:
1 | // className操作 |
19.5 属性操作
19.5.1 属性操作
详细解释:
getAttribute():获取元素属性值setAttribute():设置元素属性值removeAttribute():移除元素属性hasAttribute():检查元素是否有指定属性
示例:
1 | var link = document.getElementById("myLink"); |
19.6 创建和添加元素
19.6.1 创建标签并添加到HTML
详细解释:
- 两种主要方式:字符串方式和对象方式
- 字符串方式:使用
insertAdjacentHTML() - 对象方式:使用
document.createElement()和appendChild()
示例:
1 | // 字符串方式 |
19.7 表单操作
详细解释:
- 任何表单元素都可以通过DOM提交
- 使用
submit()方法提交表单 - 可以阻止默认提交行为进行验证
示例:
1 | // 通过DOM提交表单 |
19.8 其他DOM操作
19.8.1 控制台输出
详细解释:
console.log():普通日志console.error():错误日志console.warn():警告日志console.info():信息日志console.debug():调试日志console.table():表格形式显示数据
示例:
1 | console.log("普通日志"); |
19.8.2 弹窗
详细解释:
alert():显示消息框confirm():显示确认框,返回布尔值prompt():显示输入框,返回用户输入
示例:
1 | // alert |
19.8.3 URL和刷新
详细解释:
location.href:获取或设置当前URLlocation.reload():重新加载页面history.back():返回上一页history.forward():前进到下一页
示例:
1 | // 获取当前URL |
19.8.4 定时器
详细解释:
setInterval():重复执行函数clearInterval():清除重复执行的定时器setTimeout():延迟执行函数clearTimeout():清除延迟执行的定时器
示例:
1 | // setInterval |
19.9 事件处理
19.9.1 事件绑定
详细解释:
- 行内绑定:直接在HTML标签中添加事件属性
- 脚本绑定:通过JavaScript代码绑定事件
示例:
1 | // 行内绑定(在HTML中) |
综合大例子
以下是一个包含所有知识点的综合性示例,展示如何将JavaScript基础知识应用于实际项目:
1 |
|
总结
这个JavaScript综合示例展示了以下知识点:
- 变量与作用域:使用
let和const声明变量,理解局部和全局作用域 - 函数:定义和调用函数,包括箭头函数
- 数据类型:处理字符串、数字、布尔值、对象和数组
- DOM操作:
- 查找元素(getElementById, querySelector)
- 修改内容(innerText, innerHTML)
- 操作样式(classList, style)
- 创建和添加元素(createElement, appendChild)
- 事件处理:
- 事件绑定(addEventListener)
- 事件委托
- 阻止默认行为
- 表单处理:
- 获取表单值
- 表单验证
- 动态更新
- 定时器:
- setInterval和setTimeout
- 清除定时器
- JSON处理:
- JSON.parse和JSON.stringify
- 错误处理
- ES6+特性:
- 模板字符串
- 箭头函数
- 对象解构
- Promise(隐式使用)
- 错误处理:
- try/catch
- 输入验证
- 交互效果:
- 动画
- 拖拽
- 通知系统