一、基础语法
1. 变量声明
var:ES5 中用于声明变量,有函数作用域和变量提升现象。变量提升意味着变量可以在声明之前使用,但其值为undefined。
            
            
              javascript
              
              
            
          
          console.log(a); // 输出: undefined
var a = 10;
        let:ES6 引入,具有块级作用域。在块级作用域内声明的let变量,只在该块级作用域内有效。
            
            
              javascript
              
              
            
          
          {
    let b = 20;
    console.log(b); // 输出: 20
}
console.log(b); // 报错: b is not defined
        const:同样是 ES6 引入,用于声明常量。一旦声明,其值不能被重新赋值,且也具有块级作用域。
            
            
              javascript
              
              
            
          
          const PI = 3.14159;
PI = 3.14; // 报错: Assignment to constant variable.
        2. 注释
- 单行注释 :使用 
//开头,注释本行后面的内容。 
            
            
              javascript
              
              
            
          
          // 这是一个单行注释
let num = 10;
        - 多行注释 :使用 
/* */包裹注释内容,可以跨越多行。 
            
            
              javascript
              
              
            
          
          /* 
这是一个
多行注释
*/
function add(a, b) {
    return a + b;
}
        3. 语句与运算符
- 
条件语句:
- 
if、else、else if。 - 
switch:多分支选择。 
 - 
 - 
循环语句:
- 
for:for (let i = 0; i < 5; i++) {}。 - 
while:while (condition) {}。 - 
do...while:do {} while (condition)。 - 
for...of:遍历可迭代对象(如数组)。 - 
for...in:遍历对象的可枚举属性。 
 - 
 
            
            
              javascript
              
              
            
          
          for (let i = 0; i < 5; i++) {
  console.log(i);
}
const obj = { a: 1, b: 2 };
for (let key in obj) {
  console.log(key, obj[key]);
}
        - 
算术运算符 :
+、-、*、/、%、**(幂运算)。 - 
比较运算符 :
==(值相等)、===(值和类型相等)、!=、!==、>、<、>=、<=。 - 
逻辑运算符 :
&&(与)、||(或)、!(非)。 - 
赋值运算符 :
=、+=、-=、*=、/=。 - 
三元运算符 :
condition ? expr1 : expr2。 
            
            
              javascript
              
              
            
          
          let a = 10;
let b = 5;
console.log(a > b && a !== 10); // false
        二、数据类型
1. 基本数据类型
undefined:表示变量已声明但未赋值。
            
            
              javascript
              
              
            
          
          let var1;
console.log(var1); // 输出: undefined
        null:表示一个空值,通常用于表示有意的空值。
            
            
              javascript
              
              
            
          
          let var2 = null;
console.log(var2); // 输出: null
        boolean:有两个值true和false,用于逻辑判断。
            
            
              javascript
              
              
            
          
          let isDone = true;
if (isDone) {
    console.log('任务完成');
}
        number:表示整数和浮点数。
            
            
              javascript
              
              
            
          
          let num1 = 10;
let num2 = 3.14;
        string:用于表示文本数据,可使用单引号、双引号或反引号(模板字面量)。
            
            
              javascript
              
              
            
          
          let str1 = 'Hello';
let str2 = "World";
let str3 = `Hello, ${str2}`; // 模板字面量,可以嵌入表达式
console.log(str3); // 输出: Hello, World
        symbol:ES6 新增,是一种唯一的、不可变的数据类型,常用于对象属性键,以避免属性名冲突。
            
            
              javascript
              
              
            
          
          let sym1 = Symbol('unique');
let sym2 = Symbol('unique');
console.log(sym1 === sym2); // 输出: false
        bigint:ES2020 新增,用于表示任意精度的整数,解决了number类型的安全整数范围限制问题。
            
            
              javascript
              
              
            
          
          let big1 = BigInt(9007199254740991);
let big2 = BigInt('9007199254740991');
        2. 引用数据类型
Object:是一种无序的键值对集合,可以存储各种类型的数据。对象,如{}、[]、function。
            
            
              javascript
              
              
            
          
          let person = {
    name: 'John',
    age: 30,
    address: {
        city: 'New York',
        country: 'USA'
    },
    hobbies: ['reading', 'traveling']
};
console.log(person.name); // 输出: John
        Array:是一种有序的、可变的列表,可以存储不同类型的数据。
            
            
              javascript
              
              
            
          
          let numbers = [1, 2, 3, 4, 5];
numbers.push(6); // 在数组末尾添加元素
console.log(numbers[2]); // 输出: 3
        Function:是一种特殊的对象,用于封装可重用的代码块。函数可以作为值传递、存储在变量中、作为参数传递给其他函数等。
            
            
              javascript
              
              
            
          
          function add(a, b) {
    return a + b;
}
let sum = add(3, 5);
console.log(sum); // 输出: 8
        三、函数
1. 函数定义
- 函数声明 :使用 
function关键字定义函数,具有函数提升特性。 
            
            
              javascript
              
              
            
          
          function multiply(a, b) {
    return a * b;
}
let result1 = multiply(4, 5);
console.log(result1); // 输出: 20
        - 函数表达式:将函数赋值给一个变量,没有函数提升特性。
 
            
            
              javascript
              
              
            
          
          let divide = function (a, b) {
    return a / b;
};
let result2 = divide(10, 2);
console.log(result2); // 输出: 5
        - 箭头函数 :ES6 引入的简洁函数定义方式,没有自己的 
this、arguments、super和new.target。 
            
            
              javascript
              
              
            
          
          let square = (x) => x * x;
let result3 = square(3);
console.log(result3); // 输出: 9
// 多个参数
let addNumbers = (a, b) => a + b;
// 无参数
let greet = () => console.log('Hello');
        2. 函数参数
- 默认参数:在函数定义时可以为参数指定默认值。
 
            
            
              javascript
              
              
            
          
          function greet(name = 'Guest') {
    console.log(`Hello, ${name}`);
}
greet(); // 输出: Hello, Guest
greet('John'); // 输出: Hello, John
        - 剩余参数 :使用 
...语法将多个参数收集到一个数组中。 
            
            
              javascript
              
              
            
          
          function sumAll(...numbers) {
    let total = 0;
    for (let num of numbers) {
        total += num;
    }
    return total;
}
let sumResult = sumAll(1, 2, 3, 4, 5);
console.log(sumResult); // 输出: 15
        3. 函数作用域和闭包
- 函数作用域:函数内部可以访问外部作用域的变量,而外部作用域不能访问函数内部的变量。
 
            
            
              javascript
              
              
            
          
          let outerVar = 10;
function outerFunction() {
    let innerVar = 20;
    console.log(outerVar); // 可以访问外部变量
    console.log(innerVar); // 可以访问内部变量
}
outerFunction();
console.log(innerVar); // 报错: innerVar is not defined
        - 闭包:函数可以记住并访问其所在的词法作用域,即使在函数执行完毕后。闭包常用于创建私有变量和模拟面向对象的封装。
 
            
            
              javascript
              
              
            
          
          function outer() {
  let count = 0;
  return function inner() {
    count++;
    console.log(count);
  };
}
const counter = outer();
counter(); // 1
counter(); // 2
        四、对象和数组
1. 对象创建
- 对象字面量 :最常用的创建对象的方式,使用花括号 
{}定义对象的属性和方法。 
            
            
              javascript
              
              
            
          
          let car = {
    brand: 'Toyota',
    model: 'Corolla',
    year: 2020,
    start: function () {
        console.log('The car has started.');
    }
};
        new Object():使用Object构造函数创建对象,然后逐个添加属性。
            
            
              javascript
              
              
            
          
          let person = new Object();
person.name = 'Alice';
person.age = 30;
        2. 属性访问
- 点表示法 :使用点号 
.访问对象的属性。 
            
            
              javascript
              
              
            
          
          console.log(car.brand); // 输出: Toyota
        - 方括号表示法 :使用方括号 
[]访问对象的属性,适用于属性名是变量或包含特殊字符的情况。 
            
            
              javascript
              
              
            
          
          let propName ='model';
console.log(car[propName]); // 输出: Corolla
        3. 继承
- 传统原型链继承:通过构造函数和原型链实现继承。
 
            
            
              javascript
              
              
            
          
          function Animal(name) {
    this.name = name;
}
Animal.prototype.speak = function () {
    console.log(this.name +'makes a sound.');
};
function Dog(name, breed) {
    Animal.call(this, name);
    this.breed = breed;
}
Dog.prototype = Object.create(Animal.prototype);
Dog.prototype.constructor = Dog;
let myDog = new Dog('Buddy', 'Golden Retriever');
myDog.speak(); // 输出: Buddy makes a sound.
        - ES6 class 继承 :使用 
class和extends关键字实现继承,语法更简洁。 
            
            
              javascript
              
              
            
          
          class Animal {
    constructor(name) {
        this.name = name;
    }
    speak() {
        console.log(this.name +'makes a sound.');
    }
}
class Dog extends Animal {
    constructor(name, breed) {
        super(name);
        this.breed = breed;
    }
}
let myDog2 = new Dog('Charlie', 'Labrador');
myDog2.speak(); // 输出: Charlie makes a sound.
        4. 数组
- 
定义 :
const arr = [1, 2, 3]。 - 
常用方法:
- 
push()、pop()、shift()、unshift()。 - 
map()、filter()、reduce()。 - 
slice()、splice()。 
 - 
 
            
            
              javascript
              
              
            
          
          const numbers = [1, 2, 3];
const doubled = numbers.map((n) => n * 2); // [2, 4, 6]
        五、异步编程
1 回调函数
- 异步操作完成后执行的函数。
 
            
            
              javascript
              
              
            
          
          setTimeout(function () {
    console.log('First timeout');
    setTimeout(function () {
        console.log('Second timeout');
    }, 1000);
}, 1000);
        - 回调地狱:当多个异步操作嵌套时,代码会变得难以阅读和维护,形成回调地狱。
 
2. Promise
- 基本概念 :
Promise是一个表示异步操作最终完成(或失败)及其结果值的对象。它有三种状态:pending(进行中)、fulfilled(已成功)和rejected(已失败)。 - 方法:
then()、catch()、finally()。 
            
            
              javascript
              
              
            
          
          let promise = new Promise((resolve, reject) => {
    setTimeout(() => {
        resolve('Success!');
    }, 1000);
});
promise.then(value => {
    console.log(value);
}).catch(error => {
    console.error(error);
});
        - 链式调用 :通过 
.then()方法可以将多个Promise操作链接起来,解决回调地狱问题。 
            
            
              javascript
              
              
            
          
          const promise = new Promise((resolve, reject) => {
  setTimeout(() => resolve("Success"), 1000);
});
promise.then((result) => console.log(result));
        3. async/await
- 基本概念 :
async函数是一种异步函数,它返回一个Promise对象。await只能在async函数内部使用,用于暂停异步函数的执行,直到Promise被解决(fulfilled)或被拒绝(rejected)。 - 基于 Promise 的语法糖,使异步代码看起来像同步代码。
 
            
            
              javascript
              
              
            
          
          async function fetchData() {
  const response = await fetch("https://api.example.com/data");
  const data = await response.json();
  console.log(data);
}
        六、DOM 操作
1 选择元素
- 
document.getElementById() - 
document.querySelector() - 
document.querySelectorAll() 
            
            
              javascript
              
              
            
          
          const element = document.querySelector("#myElement");
        2 修改元素
- 
修改内容:
element.textContent、element.innerHTML。 - 
修改样式:
element.style.property = value。 - 
修改属性:
element.setAttribute()。 
            
            
              javascript
              
              
            
          
          element.textContent = "Hello, World!";
element.style.color = "red";
        3 事件处理
- 添加事件监听器:
element.addEventListener()。 
            
            
              javascript
              
              
            
          
          let button = document.getElementById('myButton');
button.addEventListener('click', function () {
    console.log('Button clicked!');
});
        4.常见事件类型
- 鼠标事件 :如 
click(点击)、dblclick(双击)、mouseover(鼠标悬停)、mouseout(鼠标离开)、mousedown(鼠标按下)、mouseup(鼠标释放)等。 - 键盘事件 :如 
keydown(键盘按下)、keyup(键盘释放)、keypress(键盘按下并产生字符)等。 - 表单事件 :如 
submit(表单提交)、input(输入框内容改变)、change(表单元素值改变)等。 
            
            
              javascript
              
              
            
          
          let form = document.getElementById('myForm');
form.addEventListener('submit', function (event) {
    event.preventDefault(); // 阻止表单默认提交行为
    console.log('Form submitted');
});
        七、ES6+ 新特性
1 解构赋值
- 从数组或对象中提取值。
 
            
            
              javascript
              
              
            
          
          const [a, b] = [1, 2];
const { name, age } = { name: "Alice", age: 25 };
        2 模板字符串
- 使用反引号(``)定义字符串,支持多行和嵌入表达式。
 
            
            
              javascript
              
              
            
          
          const name = "Alice";
console.log(`Hello, ${name}!`);
        3 模块化
- 使用 
import和export导入和导出模块。 
            
            
              javascript
              
              
            
          
          // math.js
export const add = (a, b) => a + b;
// main.js
import { add } from "./math.js";
console.log(add(2, 3)); // 5
        八、 常用 API__内置函数 或方法,
1 数组方法
数组是 JavaScript 中最常用的数据结构之一,以下是一些常用的数组方法:
map():对数组中的每个元素执行函数,并返回新数组。
            
            
              javascript
              
              
            
          
          const numbers = [1, 2, 3];
const doubled = numbers.map((n) => n * 2); // [2, 4, 6]
        filter():过滤数组,返回满足条件的元素组成的新数组。
            
            
              javascript
              
              
            
          
          const evens = numbers.filter((n) => n % 2 === 0); // [2]
        reduce():将数组元素累积为一个值。
            
            
              javascript
              
              
            
          
          const sum = numbers.reduce((acc, n) => acc + n, 0); // 6
        find():返回数组中第一个满足条件的元素。
            
            
              javascript
              
              
            
          
          const firstEven = numbers.find((n) => n % 2 === 0); // 2
        some():检查数组中是否有元素满足条件。
            
            
              javascript
              
              
            
          
          const hasEven = numbers.some((n) => n % 2 === 0); // true
        every():检查数组中的所有元素是否都满足条件。
            
            
              javascript
              
              
            
          
          const allEven = numbers.every((n) => n % 2 === 0); // false
        2.字符串 API
字符串是 JavaScript 中的基本数据类型之一,以下是一些常用的字符串方法:
split():将字符串按指定分隔符拆分为数组。
            
            
              javascript
              
              
            
          
          const str = "hello,world";
const arr = str.split(","); // ["hello", "world"]
        join():将数组元素按指定分隔符拼接为字符串。
            
            
              javascript
              
              
            
          
          const newStr = arr.join("-"); // "hello-world"
        substring():提取字符串的子串。
            
            
              javascript
              
              
            
          
          const sub = str.substring(0, 5); // "hello"
        replace():替换字符串中的内容。
            
            
              javascript
              
              
            
          
          const newStr = str.replace("world", "JavaScript"); // "hello,JavaScript"
        toUpperCase():将字符串转换为大写。
            
            
              javascript
              
              
            
          
          const upper = str.toUpperCase(); // "HELLO,WORLD"
        toLowerCase():将字符串转换为小写。
            
            
              javascript
              
              
            
          
          const lower = str.toLowerCase(); // "hello,world"
        3. 对象 API
对象是 JavaScript 中的核心数据结构,以下是一些常用的对象方法:
Object.keys():返回对象的所有键组成的数组。
            
            
              javascript
              
              
            
          
          const obj = { a: 1, b: 2 };
const keys = Object.keys(obj); // ["a", "b"]
        Object.values():返回对象的所有值组成的数组。
            
            
              javascript
              
              
            
          
          const values = Object.values(obj); // [1, 2]
        Object.entries():返回对象的键值对组成的数组。
            
            
              javascript
              
              
            
          
          const entries = Object.entries(obj); // [["a", 1], ["b", 2]]
        Object.assign():将一个或多个对象的属性复制到目标对象。
            
            
              javascript
              
              
            
          
          const target = { a: 1 };
const source = { b: 2 };
const result = Object.assign(target, source); // { a: 1, b: 2 }
        4. 日期 API
JavaScript 提供了 Date 对象来处理日期和时间。
new Date():创建日期对象。
            
            
              javascript
              
              
            
          
          const now = new Date(); // 当前时间
        getFullYear():获取年份。
            
            
              javascript
              
              
            
          
          const year = now.getFullYear(); // 2025
        getMonth():获取月份(0-11)。
            
            
              javascript
              
              
            
          
          const month = now.getMonth(); // 1 (表示 2 月)
        getDate():获取日期(1-31)。
            
            
              javascript
              
              
            
          
          const date = now.getDate(); // 12
        getHours():获取小时(0-23)。
            
            
              javascript
              
              
            
          
          const hours = now.getHours(); // 14
        5.网络请求 API
JavaScript 提供了 fetch API 用于发送网络请求。
fetch():发送 HTTP 请求并获取响应。
            
            
              javascript
              
              
            
          
          fetch("https://api.example.com/data")
  .then((response) => response.json())
  .then((data) => console.log(data))
  .catch((error) => console.error(error));
        6. 浏览器环境 API
JavaScript 可以通过浏览器提供的 API 操作 DOM 和浏览器环境。
document.querySelector():选择 DOM 元素。
            
            
              javascript
              
              
            
          
          const element = document.querySelector("#myElement");
        element.addEventListener():为 DOM 元素添加事件监听器。
            
            
              javascript
              
              
            
          
          element.addEventListener("click", () => {
  console.log("Element clicked");
});
        localStorage:在浏览器中存储数据。
            
            
              javascript
              
              
            
          
          localStorage.setItem("name", "Alice");
const name = localStorage.getItem("name"); // "Alice"
        sessionStorage:在浏览器会话中存储数据。
            
            
              javascript
              
              
            
          
          sessionStorage.setItem("token", "12345");
const token = sessionStorage.getItem("token"); // "12345"
        7. 数学 API
JavaScript 提供了 Math 对象来处理数学运算。
Math.random():生成 0 到 1 之间的随机数。
            
            
              javascript
              
              
            
          
          const random = Math.random(); // 0.123456789
        Math.floor():向下取整。
            
            
              javascript
              
              
            
          
          const num = Math.floor(3.7); // 3
        Math.ceil():向上取整。
            
            
              javascript
              
              
            
          
          const num = Math.ceil(3.2); // 4
        Math.round():四舍五入。
            
            
              javascript
              
              
            
          
          const num = Math.round(3.5); // 4
        九、最佳实践
1 代码风格
- 
使用
const和let代替var。 - 
使用箭头函数简化代码。
 - 
使用模板字符串代替字符串拼接。
 
2 错误处理
- 使用 
try...catch捕获异常。 
            
            
              javascript
              
              
            
          
          try {
  // 可能出错的代码
} catch (error) {
  console.error(error);
}
        3 性能优化
- 
避免全局变量。
 - 
使用事件委托减少事件监听器数量。
 - 
使用
requestAnimationFrame优化动画。