JavaScript 总结

简介

JavaScript 是一种轻量级、解释型的编程语言,主要用于网页开发,但现在已经发展成为全栈开发语言。

运行环境

  • 浏览器端:直接嵌入 HTML,操作 DOM
  • 服务端:Node.js 环境
  • 其他:React Native(移动端)、Electron(桌面端)等

基础语法

变量声明

// var - 函数作用域,可重复声明(不推荐)
var name = 'Alice';

// let - 块级作用域,可重新赋值
let age = 25;
age = 26; // ✅ 允许

// const - 块级作用域,不可重新赋值;声明时必须赋值,不能先声明后赋值;对引用类型	只保证引用不变,对象内容可变
const PI = 3.14159;
// PI = 3.14; // ❌ 报错

数据类型

// 原始类型(Primitive)
let str = "字符串";      // String
let num = 42;            // Number(整数和浮点数)
let big = 9007199254740991n; // BigInt
let bool = true;         // Boolean
let nothing = null;      // Null(空值)
let notDefined;          // Undefined(未定义)
let sym = Symbol('id');  // Symbol(唯一标识符)

// 引用类型(Reference)
let obj = { name: 'Tom', age: 20 };  // Object
let arr = [1, 2, 3];                 // Array(特殊的对象)
let fn = function() {};              // Function

运算符

// 算术运算
let sum = 10 + 5;      // 15
let diff = 10 - 5;     // 5
let product = 10 * 5;  // 50
let quotient = 10 / 5; // 2
let remainder = 10 % 3; // 1
let power = 2 ** 3;    // 8(ES2016)

// 比较运算(注意区别)
console.log(5 == '5');   // true(宽松相等,类型转换)
console.log(5 === '5');  // false(严格相等,类型和值都相同)

// 逻辑运算
let result = (age > 18) && (hasID === true); // 与
let alternative = isAdmin || isModerator;    // 或
let opposite = !isActive;                    // 非

// 空值合并(ES2020)
let value = userInput ?? '默认值'; // 仅对 null/undefined 生效

条件语句

// if...else
let score = 85;
if (score >= 90) {
    console.log('优秀');
} else if (score >= 80) {
    console.log('良好');
} else {
    console.log('一般');
}

// 三元运算符
let status = age >= 18 ? '成年' : '未成年';

// switch
let day = 3;
switch (day) {
    case 1:
        console.log('周一');
        break;
    case 2:
        console.log('周二');
        break;
    default:
        console.log('其他');
}

循环结构

// for 循环
for (let i = 0; i < 5; i++) {
    console.log(i); // 0,1,2,3,4
}

// while 循环
let count = 0;
while (count < 5) {
    count++;
}

// for...of(遍历可迭代对象)
const fruits = ['apple', 'banana', 'orange'];
for (const fruit of fruits) {
    console.log(fruit);
}

// for...in(遍历对象属性)
const person = { name: 'Alice', age: 25 };
for (const key in person) {
    console.log(`${key}: ${person[key]}`);
}

// 数组方法(函数式风格)
const numbers = [1, 2, 3, 4, 5];
numbers.forEach(num => console.log(num));           // 遍历
const doubled = numbers.map(num => num * 2);        // 映射 [2,4,6,8,10]
const evens = numbers.filter(num => num % 2 === 0); // 过滤 [2,4]
const sum = numbers.reduce((acc, num) => acc + num, 0); // 归约 15

函数定义方式

// 1. 函数声明(提升)
function greet(name) {
    return `Hello, ${name}!`;
}

// 2. 函数表达式
const sayHi = function(name) {
    return `Hi, ${name}`;
};

// 3. 箭头函数(ES6,简洁,无自己的 this)
const add = (a, b) => a + b;
const square = x => x * x;

// 4. 默认参数
function greetUser(name = 'Guest') {
    return `Welcome, ${name}`;
}

// 5. 剩余参数
function sum(...numbers) {
    return numbers.reduce((a, b) => a + b, 0);
}
sum(1, 2, 3, 4); // 10

闭包(Closure)

function createCounter() {
    let count = 0; // 私有变量
    
    return {
        increment: () => ++count,
        decrement: () => --count,
        getCount: () => count
    };
}

const counter = createCounter();
console.log(counter.increment()); // 1
console.log(counter.increment()); // 2
console.log(counter.getCount());  // 2

对象操作

// 对象字面量
const user = {
    firstName: 'John',
    lastName: 'Doe',
    age: 30,
    
    // 方法简写
    getFullName() {
        return `${this.firstName} ${this.lastName}`;
    },
    
    // Getter/Setter
    get isAdult() {
        return this.age >= 18;
    }
};

// 访问属性
console.log(user.firstName);    // 点符号
console.log(user['lastName']);  // 括号符号(动态属性名)

// 解构赋值
const { firstName, age } = user;

// 扩展运算符
const userCopy = { ...user, email: 'john@example.com' };

类(ES6)

class Animal {
    constructor(name) {
        this.name = name;
    }
    
    speak() {
        console.log(`${this.name} makes a sound`);
    }
    
    // 静态方法
    static isAnimal(obj) {
        return obj instanceof Animal;
    }
}

class Dog extends Animal {
    constructor(name, breed) {
        super(name); // 调用父类构造函数
        this.breed = breed;
    }
    
    speak() { // 方法重写
        console.log(`${this.name} barks`);
    }
}

const dog = new Dog('Buddy', 'Golden Retriever');
dog.speak(); // Buddy barks

 异步编程Promise

const fetchData = () => {
    return new Promise((resolve, reject) => {
        setTimeout(() => {
            const success = true;
            if (success) {
                resolve('Data loaded');
            } else {
                reject('Error occurred');
            }
        }, 1000);
    });
};

// 使用
fetchData()
    .then(data => console.log(data))
    .catch(error => console.error(error))
    .finally(() => console.log('Completed'));

异步编程Async/Await(ES2017,推荐)

async function getUserData() {
    try {
        const response = await fetch('https://api.example.com/user');
        const data = await response.json();
        return data;
    } catch (error) {
        console.error('Failed to fetch:', error);
        throw error;
    }
}

// 并行执行
async function fetchMultiple() {
    const [users, posts] = await Promise.all([
        fetch('/users'),
        fetch('/posts')
    ]);
    return { users, posts };
}

现代 JavaScript 特性(ES6+)

特性 示例 说明
模板字符串 `Hello ${name}` 支持插值和多行
解构赋值 const {a, b} = obj 快速提取属性
展开运算符 const arr2 = [...arr1] 复制/合并数组对象
可选链 user?.address?.city 安全访问深层属性
空值合并 value ?? default 仅对 null/undefined 生效
模块化 import/export 代码分割和复用

箭头函数

箭头函数(Arrow Function)是 ES6 引入的一种更简洁的函数写法,同时它解决了传统函数中 this 绑定的痛点。

// 传统函数
function add(a, b) {
    return a + b;
}

// 箭头函数(等价写法)
const add = (a, b) => {
    return a + b;
};

// 更简洁:单表达式可省略 {} 和 return
const add = (a, b) => a + b;

// 单个参数可省略括号
const square = x => x * x;

// 无参数需要空括号
const greet = () => console.log('Hello');
场景 箭头函数写法 说明
多参数 + 多行 (a, b) => { ... } 需要 return
单表达式 (a, b) => a + b 隐式返回
单个参数 x => x * 2 括号可省
无参数 () => console.log('hi') 必须空括号
返回对象 () => ({ name: 'Tom' }) 用 () 包裹 {}
多行逻辑 (x) => { const y = x + 1; return y; } 必须显式 return

核心特性:没有自己的 this

传统函数的 this 问题

const user = {
    name: 'Tom',
    hobbies: ['reading', 'coding'],
    
    // 传统函数:this 指向调用者
    showHobbies: function() {
        console.log(this.name + ' likes:');
        
        this.hobbies.forEach(function(hobby) {
            console.log(this.name + ' likes ' + hobby); // ❌ this.name 是 undefined
        });
    }
};

user.showHobbies();
// 输出:Tom likes:
//       undefined likes reading
//       undefined likes coding

forEach 中的普通函数有自己的 this,不再指向 user。

箭头函数解决方案:

const user = {
    name: 'Tom',
    hobbies: ['reading', 'coding'],
    
    showHobbies: function() {
        console.log(this.name + ' likes:');
        
        // 箭头函数继承外层 this
        this.hobbies.forEach(hobby => {
            console.log(this.name + ' likes ' + hobby); // ✅ Tom likes reading
        });
    }
};

箭头函数没有自己的 this,它会继承定义时外层作用域的 this(词法作用域绑定)。

React/Vue与JavaScript 的关系

都是基于js开发的js框架

浏览器只认识 JavaScript,不认识 JSX、Vue 单文件组件或 TypeScript。

React 和 Vue 是"开发时的语法糖和工具",最终都编译为浏览器能运行的纯 JavaScript。

┌─────────────────────────────────────────────────────────┐
│  你的源代码                 编译/构建过程                浏览器运行    │
│  ───────────────►  ─────────────────────────►  ─────────  │
│                                                          │
│  React (.jsx)              Babel/Vite/Webpack           纯 JS       │
│  Vue (.vue)        ───►    模板编译 + 代码转换    ───►   纯 JS       │
│  TypeScript (.ts)          类型擦除 + 语法降级            纯 JS       │
└─────────────────────────────────────────────────────────┘

TypeScript 与 JavaScript 的关系

TypeScript是微软于2012年10月发布的开源编程语言,它是JavaScript的一个超集,本质上添加了可选的静态类型和基于类的面向对象编程。

TypeScript通过编译器转译为JavaScript代码,最终运行时还是要被编译为JavaScript。

TypeScript扩展了JavaScript的语法,所以任何现有的JavaScript程序可以运行在TypeScript环境中。

编译过程

TypeScript 源码 (.ts/.tsx)
        │
        ▼
   tsc(TypeScript 编译器)或 Vite/Webpack + ts-loader
        │
        ├── 类型检查(发现错误,但不阻止输出)
        │
        └── 代码转换(擦除类型,降级语法)
                │
                ▼
        JavaScript 代码 (.js/.jsx)
                │
                ▼
        浏览器或 Node.js 运行

TypeScript与 React/Vue 的关系

组合 文件扩展名 说明
JavaScript + React .jsx 基础组合
TypeScript + React .tsx 现代主流,强烈推荐
JavaScript + Vue .vue Vue 2 时代常用
TypeScript + Vue .vue (setup lang="ts") Vue 3 官方推荐
posted @ 2026-04-13 14:55  星光闪闪  阅读(0)  评论(0)    收藏  举报