# 1. JavaScript
## 1.1 基础语法
### 1.1.1 变量声明
JavaScript 中可以使用 `var`、`let` 和 `const` 来声明变量。示例如下:
```javascript
// 使用 var 声明变量
var oldVariable = 'This is a var variable';
// 使用 let 声明变量
let newVariable = 'This is a let variable';
// 使用 const 声明常量
const constantValue = 'This is a constant';
```
### 1.1.2 数据类型
JavaScript 有七种基本数据类型:`undefined`、`null`、`boolean`、`number`、`string`、`symbol` 和 `bigint`,以及一种引用数据类型 `object`。示例如下:
```javascript
// undefined
let undef;
console.log(undef); // undefined
// null
let empty = null;
console.log(empty); // null
// boolean
let isTrue = true;
let isFalse = false;
// number
let integer = 10;
let float = 3.14;
// string
let message = 'Hello, World!';
// symbol
let sym = Symbol('unique');
// bigint
let bigNumber = 1234567890123456789012345678901234567890n;
// object
let person = { name: 'John', age: 30 };
```
### 1.1.3 运算符
#### 算术运算符
```javascript
let a = 10;
let b = 5;
console.log(a + b); // 加法
console.log(a - b); // 减法
console.log(a * b); // 乘法
console.log(a / b); // 除法
console.log(a % b); // 取余
console.log(a ** b); // 幂运算
```
#### 比较运算符
```javascript
let x = 10;
let y = 20;
console.log(x == y); // 相等
console.log(x === y); // 严格相等
console.log(x != y); // 不相等
console.log(x !== y); // 严格不相等
console.log(x < y); // 小于
console.log(x > y); // 大于
console.log(x <= y); // 小于等于
console.log(x >= y); // 大于等于
```
#### 逻辑运算符
```javascript
let p = true;
let q = false;
console.log(p && q); // 逻辑与
console.log(p || q); // 逻辑或
console.log(!p); // 逻辑非
```
## 1.2 函数
### 1.2.1 函数声明
```javascript
function add(a, b) {
return a + b;
}
let result = add(3, 5);
console.log(result); // 8
```
### 1.2.2 箭头函数
```javascript
const multiply = (a, b) => a * b;
let product = multiply(4, 6);
console.log(product); // 24
```
### 1.2.3 函数作用域
```javascript
function outerFunction() {
let outerVar = 'I am outside';
function innerFunction() {
let innerVar = 'I am inside';
console.log(outerVar); // 可以访问外部变量
}
innerFunction();
// console.log(innerVar); // 报错,无法访问内部变量
}
outerFunction();
```
## 1.3 异步编程
### 1.3.1 Promise
Promise 是异步编程的一种解决方案,用于表示一个异步操作的最终完成(或失败)及其结果值。它有三种状态:`pending`(进行中)、`fulfilled`(已成功)和 `rejected`(已失败)。状态一旦改变,就不会再变。
```javascript
function fetchData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
const success = true;
if (success) {
resolve('Data fetched successfully');
} else {
reject(new Error('Failed to fetch data'));
}
}, 2000);
});
}
fetchData()
.then(data => {
console.log(data);
})
.catch(error => {
console.error(error);
});
```
使用场景:处理异步操作,如网络请求、文件读取等,避免回调地狱。
### 1.3.2 Async/Await
`async/await` 是基于 Promise 的语法糖,它让异步代码看起来更像同步代码,提高了代码的可读性。`async` 函数总是返回一个 Promise,`await` 只能在 `async` 函数内部使用,用于等待一个 Promise 完成并返回其结果。
```javascript
async function getData() {
try {
let data = await fetchData();
console.log(data);
} catch (error) {
console.error(error);
}
}
getData();
```
使用场景:在需要按顺序执行多个异步操作时,使用 `async/await` 可以让代码更简洁易读。
### 1.3.3 事件循环
JavaScript 是单线程的,通过事件循环机制实现异步操作。事件循环主要包括调用栈、任务队列和微任务队列。调用栈用于执行同步代码,任务队列存放异步操作完成后的回调函数,微任务队列存放 Promise 的回调函数。事件循环会不断检查调用栈是否为空,若为空则从任务队列和微任务队列中取出任务执行。
```javascript
console.log('Start');
setTimeout(() => {
console.log('Timeout');
}, 0);
Promise.resolve().then(() => {
console.log('Promise');
});
console.log('End');
// 输出顺序:Start -> End -> Promise -> Timeout
```
使用场景:处理异步操作,保证代码的执行顺序符合预期。
## 1.4 ES6+ 特性
### 1.4.1 解构赋值
```javascript
// 数组解构
let [first, second] = [1, 2];
console.log(first); // 1
console.log(second); // 2
// 对象解构
let { name, age } = { name: 'John', age: 30 };
console.log(name); // John
console.log(age); // 30
```
### 1.4.2 扩展运算符
```javascript
// 数组扩展
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let combined = [...arr1, ...arr2];
console.log(combined); // [1, 2, 3, 4, 5, 6]
// 对象扩展
let obj1 = { a: 1 };
let obj2 = { b: 2 };
let merged = { ...obj1, ...obj2 };
console.log(merged); // { a: 1, b: 2 }
```
### 1.4.3 类
```javascript
class Person {
constructor(name, age) {
this.name = name;
this.age = age;
}
greet() {
console.log(`Hello, my name is ${this.name} and I am ${this.age} years old.`);
}
}
let person = new Person('John', 30);
person.greet(); // Hello, my name is John and I am 30 years old.
```
### 1.4.4 模块化
#### 导出模块
```javascript
// math.js
export function add(a, b) {
return a + b;
}
export const PI = 3.14;
```
#### 导入模块
```javascript
// main.js
import { add, PI } from './math.js';
console.log(add(3, 5)); // 8
console.log(PI); // 3.14
```
### 1.4.5 模板字符串
```javascript
let name = 'John';
let age = 30;
let message = `Hello, my name is ${name} and I am ${age} years old.`;
console.log(message);
```
### 1.4.6 默认参数
```javascript
function greet(name = 'Guest') {
console.log(`Hello, ${name}!`);
}
greet(); // Hello, Guest!
greet('John'); // Hello, John!
```
### 1.4.7 Rest 参数
```javascript
function sum(...numbers) {
return numbers.reduce((total, num) => total + num, 0);
}
console.log(sum(1, 2, 3)); // 6
console.log(sum(1, 2, 3, 4, 5)); // 15
```
### 1.4.8 Spread 参数
```javascript
let arr1 = [1, 2, 3];
let arr2 = [4, 5, 6];
let combined = [...arr1, ...arr2];
console.log(combined); // [1, 2, 3, 4, 5, 6]
let obj1 = { a: 1 };
let obj2 = { b: 2 };
let merged = { ...obj1, ...obj2 };
console.log(merged); // { a: 1, b: 2 }
```
### 1.4.9 Proxy
```javascript
let target = { name: 'John', age: 30 };
let handler = {
get: function(target, prop) {
console.log(`Getting property ${prop}`);
return target[prop];
},
set: function(target, prop, value) {
console.log(`Setting property ${prop} to ${value}`);
target[prop] = value;
return true;
}
};
let proxy = new Proxy(target, handler);
console.log(proxy.name); // Getting property name
// John
proxy.age = 31; // Setting property age to 31
```
### 1.4.10 Reflect
```javascript
let target = { name: 'John', age: 30 };
console.log(Reflect.get(target, 'name')); // John
Reflect.set(target, 'age', 31);
console.log(target.age); // 31
```
## 1.5 闭包
```javascript
function outer() {
let outerVar = 'I am outside';
function inner() {
console.log(outerVar);
}
return inner;
}
let closure = outer();
closure(); // I am outside
```
## 1.6 原型与继承
### 1.6.1 原型链
```javascript
function Animal(name) {
this.name = name;
}
Animal.prototype.speak = function() {
console.log(`${this.name} makes a noise.`);
};
let dog = new Animal('Dog');
// 先在 dog 对象本身查找 speak 方法,找不到则去 Animal.prototype 中查找
dog.speak(); // Dog makes a noise.
```
### 1.6.2 继承
```javascript
function Dog(name) {
// 构造函数继承,继承父类的属性
Animal.call(this, name);
}
// 原型链继承,继承父类的方法
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
Dog.prototype.bark = function() {
console.log(`${this.name} barks.`);
};
let myDog = new Dog('Buddy');
myDog.speak(); // Buddy makes a noise.
myDog.bark(); // Buddy barks.
```
## 1.7 浏览器 API
### 1.7.1 DOM 操作
```javascript
// 获取元素
let element = document.getElementById('myElement');
// 创建元素
let newElement = document.createElement('p');
newElement.textContent = 'This is a new paragraph.';
// 添加元素
let parent = document.body;
parent.appendChild(newElement);
// 修改元素样式
newElement.style.color = 'red';
```
### 1.7.2 事件处理
```javascript
let button = document.getElementById('myButton');
button.addEventListener('click', function() {
alert('Button clicked!');
});
```
### 1.7.3 本地存储
```javascript
// 设置本地存储
localStorage.setItem('name', 'John');
// 获取本地存储
let name = localStorage.getItem('name');
console.log(name); // John
// 删除本地存储
localStorage.removeItem('name');
```
### 1.7.4 定时器
```javascript
// setTimeout
setTimeout(function() {
console.log('This will be executed after 2 seconds');
}, 2000);
// setInterval
let intervalId = setInterval(function() {
console.log('This will be executed every 1 second');
}, 1000);
// 清除定时器
clearInterval(intervalId);
```
## 1.8 Node.js
### 1.8.1 文件系统操作
```javascript
const fs = require('fs');
// 读取文件
fs.readFile('example.txt', 'utf8', function(err, data) {
if (err) throw err;
console.log(data);
});
// 写入文件
fs.writeFile('example.txt', 'Hello, Node.js!', function(err) {
if (err) throw err;
console.log('File written successfully');
});
```
### 1.8.2 模块系统
```javascript
// module.js
const add = (a, b) => a + b;
module.exports = {
add
};
// main.js
const myModule = require('./module');
console.log(myModule.add(3, 5)); // 8
```
### 1.8.3 HTTP 服务器
```javascript
const http = require('http');
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello, World!');
});
server.listen(3000, '127.0.0.1', () => {
console.log('Server running at http://127.0.0.1:3000/');
});
```
## 1.9 正则表达式
### 1.9.1 基本语法
```javascript
let pattern = /abc/;
let str = 'abcdef';
console.log(pattern.test(str)); // true
```
### 1.9.2 元字符
```javascript
// 匹配任意字符
let pattern = /a.c/;
let str = 'abc';
console.log(pattern.test(str)); // true
// 匹配开始位置
let pattern = /^a/;
let str = 'abc';
console.log(pattern.test(str)); // true
// 匹配结束位置
let pattern = /c$/;
let str = 'abc';
console.log(pattern.test(str)); // true
```
### 1.9.3 量词
```javascript
// 匹配零个或多个
let pattern = /a*/;
let str = 'aaaa';
console.log(pattern.test(str)); // true
// 匹配一个或多个
let pattern = /a+/;
let str = 'aaaa';
console.log(pattern.test(str)); // true
// 匹配零个或一个
let pattern = /a?/;
let str = 'a';
console.log(pattern.test(str)); // true
```
## 1.10 错误处理
### 1.10.1 try...catch
```javascript
try {
let result = 1 / 0;
if (result === Infinity) {
throw new Error('Division by zero');
}
} catch (error) {
console.error(error.message); // Division by zero
} finally {
console.log('This will always be executed');
}
```
### 1.10.2 自定义错误
```javascript
class CustomError extends Error {
constructor(message) {
super(message);
this.name = 'CustomError';
}
}
try {
throw new CustomError('This is a custom error');
} catch (error) {
console.error(error.name + ': ' + error.message); // CustomError: This is a custom error
}
## 1.11 Web API 扩展
### 1.11.1 Fetch API
Fetch API 提供了一个 JavaScript 接口,用于访问和操纵 HTTP 管道的部分,例如请求和响应。它还提供了一个全局 `fetch()` 方法,该方法提供了一种简单,合理的方式来跨网络异步获取资源。
```javascript
// 基本用法
fetch('https://api.example.com/data')
.then(response => {
if (!response.ok) {
throw new Error('Network response was not ok');
}
return response.json();
})
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});
// 带请求体的 POST 请求
const postData = {
name: 'John Doe',
age: 30
};
fetch('https://api.example.com/submit', {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(postData)
})
.then(response => response.json())
.then(data => {
console.log(data);
})
.catch(error => {
console.error('Error:', error);
});
```
### 1.11.2 Web Workers
Web Workers 使得一个 Web 应用程序可以在与主执行线程分离的后台线程中运行一个脚本操作。这样做的好处是可以在一个单独的线程中执行费时的处理任务,从而允许主(通常是 UI)线程继续运行而不被阻塞。
```javascript
// main.js
if (typeof Worker !== 'undefined') {
// 创建一个新的 worker
const worker = new Worker('worker.js');
// 向 worker 发送消息
worker.postMessage('Hello from main script');
// 接收 worker 的消息
worker.onmessage = function(e) {
console.log('Received message from worker:', e.data);
// 终止 worker
worker.terminate();
};
worker.onerror = function(error) {
console.error('Worker error:', error.message);
};
} else {
console.error('Web Workers are not supported in this environment.');
}
// worker.js
self.onmessage = function(e) {
console.log('Received message from main script:', e.data);
// 向主脚本发送消息
self.postMessage('Hello from worker');
};
```
### 1.11.3 WebSocket
WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议。WebSocket 使得客户端和服务器之间的数据交换变得更加简单,允许服务端主动向客户端推送数据。
```javascript
// 客户端代码
const socket = new WebSocket('ws://echo.websocket.org');
// 连接建立时触发
socket.addEventListener('open', function (event) {
socket.send('Hello, WebSocket!');
});
// 接收到消息时触发
socket.addEventListener('message', function (event) {
console.log('Received message:', event.data);
});
// 连接关闭时触发
socket.addEventListener('close', function (event) {
if (event.wasClean) {
console.log('Connection closed cleanly');
} else {
console.log('Connection died');
}
});
// 发生错误时触发
socket.addEventListener('error', function (event) {
console.error('WebSocket error:', event);
});
```
## 1.12 性能优化
### 1.12.1 代码压缩与混淆
代码压缩和混淆是提高网站性能的重要手段。压缩可以减少代码的体积,从而减少网络传输时间;混淆可以使代码更难被逆向工程,同时也能进一步减小代码体积。
```javascript
// 示例:使用 UglifyJS 压缩代码
const UglifyJS = require('uglify-js');
const code = 'function add(a, b) { return a + b; }';
const result = UglifyJS.minify(code);
if (result.error) {
console.error('Error:', result.error);
} else {
console.log('Minified code:', result.code);
}
```
### 1.12.2 懒加载
懒加载是一种优化技术,它允许你在需要时才加载资源,而不是在页面加载时就全部加载。这可以显著减少初始加载时间,提高用户体验。
```html
```
### 1.12.3 事件委托
事件委托是一种利用事件冒泡机制来处理事件的技术。通过将事件监听器添加到父元素上,可以减少事件监听器的数量,从而提高性能。
```html