# JavaScript练习-24级 **Repository Path**: myhfw003/javascript-exercise-grade24 ## Basic Information - **Project Name**: JavaScript练习-24级 - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 3 - **Created**: 2025-11-26 - **Last Updated**: 2025-12-31 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 24级全栈开发方向js练习集 ## 一、JavaScript基础 ### 开发环境与初体验 ### 变量、常量与基础数据类型 1. 完成如下任务 - 题目描述: 声明一个变量 name,赋值为你的名字,再声明一个常量 SCHOOL,赋值为"某某职业学院",最后输出这两个值 - 输出示例: "张三" "某某职业学院" 2. 完成如下任务 - 题目描述: 判断给定的变量 value 是什么数据类型,并返回类型名称的字符串 - 输入示例: 123 - 输出示例: "number" 3. 完成如下任务 - 题目描述: 创建一个变量 age,初始值为 18,然后将其修改为 20,最后输出修改后的值 - 输出示例: 20 4. 完成如下任务 - 题目描述: 声明三个变量分别存储一个学生的姓名(字符串)、年龄(数字)、是否及格(布尔值),然后分别输出这三个变量的值和类型 - 输出示例: 姓名: "李四", 类型: string 年龄: 19, 类型: number 及格: true, 类型: boolean 5. 完成如下任务 - 题目描述: 理解 null 和 undefined 的区别,分别创建这两种类型的变量并输出 - 输出示例: undefined 变量: undefined, 类型: undefined null 变量: null, 类型: object 6. 完成如下任务 - 题目描述: 理解变量的作用域,演示块级作用域(let、const)和函数作用域(var)的区别 - 输出示例: let 和 const 有块级作用域 var 只有函数作用域 7. 完成如下任务 - 题目描述: 理解变量提升(Hoisting),对比 var、let、const 的行为 - 输出示例: var 声明会提升,但值为 undefined let 和 const 存在暂时性死区 8. 完成如下任务 - 题目描述: 使用模板字符串拼接变量和表达式 - 输入示例: name = "张三", age = 20, score = 85 - 输出示例: `${name}今年${age}岁,考了${score}分,${score >= 60 ? '及格' : '不及格'}` 9. 完成如下任务 - 题目描述: 理解基本数据类型和引用数据类型的区别 - 输出示例: 基本类型:Number、String、Boolean、Undefined、Null、Symbol、BigInt 引用类型:Object、Array、Function ### 运算符与类型转换 1. 完成如下任务 - 题目描述: 计算两个数字 a 和 b 的加、减、乘、除、取余结果,并返回一个包含这些结果的对象 - 输入示例: 10, 3 - 输出示例: { 加: 13, 减: 7, 乘: 30, 除: 3.33, 余: 1 } 2. 完成如下任务 - 题目描述: 将字符串 "123" 转换为数字类型,将数字 456 转换为字符串类型,并分别返回它们的值和类型 - 输出示例: 转换后的数字: 123, 类型: number 转换后的字符串: "456", 类型: string 3. 完成如下任务 - 题目描述: 比较两个变量 a 和 b,返回 a 是否大于 b、是否等于 b、是否不等于 b 的布尔值结果 - 输入示例: 5, 3 - 输出示例: { 大于: true, 等于: false, 不等于: true } 4. 完成如下任务 - 题目描述: 给定三个变量 x = "5", y = 5, z = "5",使用 == 和 === 分别比较 x 和 y、x 和 z,理解并返回比较结果 - 输出示例: x == y: true, x === y: false x == z: true, x === z: true 5. 完成如下任务 - 题目描述: 使用逻辑运算符(&&、||、!)判断:年龄在18-60岁之间且有驾照的人可以开车 - 输入示例: age = 25, hasLicense = true - 输出示例: true (可以开车) 6. 完成如下任务 - 题目描述: 理解隐式类型转换,计算各种表达式的结果 - 输入示例: "5" + 3, "5" - 3, true + 1, "10" * "2" - 输出示例: "53", 2, 2, 20 7. 完成如下任务 - 题目描述: 使用一元运算符进行类型转换(+, -, !) - 输入示例: +"123", -"45", !!"hello" - 输出示例: 123, -45, true 8. 完成如下任务 - 题目描述: 理解 NaN 的特性,如何检测 NaN - 输出示例: NaN === NaN // false isNaN(NaN) // true Number.isNaN(NaN) // true 9. 完成如下任务 - 题目描述: 使用位运算符进行简单计算(如取整、判断奇偶) - 输入示例: 5.8, 7 - 输出示例: ~~5.8 = 5 (取整) 7 & 1 = 1 (判断奇偶,结果为1表示奇数) 10. 完成如下任务 - 题目描述: 使用三元运算符和短路求值进行条件赋值 - 输入示例: score = 85 - 输出示例: const level = score >= 60 ? '及格' : '不及格'; const name = userName || '游客'; ### 流程控制 1. 完成如下任务 - 题目描述: 给定一个分数 score,判断成绩等级:90分以上为"优秀",80-89分为"良好",60-79分为"及格",60分以下为"不及格" - 输入示例: 85 - 输出示例: "良好" 2. 完成如下任务 - 题目描述: 使用 for 循环计算 1 到 n 的累加和 - 输入示例: 100 - 输出示例: 5050 3. 完成如下任务 - 题目描述: 遍历数组 arr,输出所有偶数 - 输入示例: [1, 2, 3, 4, 5, 6, 7, 8] - 输出示例: [2, 4, 6, 8] 4. 完成如下任务 - 题目描述: 判断给定数字 num 是否为质数(只能被1和自身整除的大于1的自然数) - 输入示例: 17 - 输出示例: true 5. 完成如下任务 - 题目描述: 使用 while 循环找出小于 n 的所有3的倍数 - 输入示例: 20 - 输出示例: [3, 6, 9, 12, 15, 18] 6. 完成如下任务 - 题目描述: 使用 switch 语句根据星期几输出不同的信息 - 输入示例: dayOfWeek = 1 (周一) - 输出示例: "今天是工作日,要上班" 7. 完成如下任务 - 题目描述: 使用 for...of 循环遍历数组 - 输入示例: ['苹果', '香蕉', '橙子'] - 输出示例: 依次输出每个水果名称 8. 完成如下任务 - 题目描述: 使用 for...in 循环遍历对象的属性 - 输入示例: { name: "张三", age: 20, city: "北京" } - 输出示例: name: 张三 age: 20 city: 北京 9. 完成如下任务 - 题目描述: 使用 break 和 continue 控制循环流程 - 输入示例: 查找数组中第一个大于50的数,跳过所有负数 - 输出示例: 演示 break(跳出循环)和 continue(跳过本次循环)的使用 10. 完成如下任务 - 题目描述: 使用嵌套循环打印九九乘法表 - 输出示例: 1*1=1 1*2=2 2*2=4 1*3=3 2*3=6 3*3=9 ... 11. 完成如下任务 - 题目描述: 使用条件运算符和 if-else 对比,实现同样的逻辑 - 输入示例: age = 18 - 输出示例: const status = age >= 18 ? '成年' : '未成年'; (三元运算符) if (age >= 18) { status = '成年'; } else { status = '未成年'; } 12. 完成如下任务 - 题目描述: 实现一个简单的猜数字游戏,使用循环和条件判断 - 输出示例: 生成1-100随机数,用户猜测,给出"太大"、"太小"或"猜对了"的提示 ## 二、核心数据结构与函数 ### 数组 1. 完成如下任务 - 题目描述: 计算并返回给定数组 arr 中所有元素的总和 - 输入示例: [ 1, 2, 3, 4 ] - 输出示例: 10 2. 完成如下任务 - 题目描述: 合并数组 arr1 和数组 arr2。不要直接修改数组 arr,结果返回新的数组 - 输入示例: [1, 2, 3, 4], ['a', 'b', 'c', 1] - 输出示例: [1, 2, 3, 4, 'a', 'b', 'c', 1] 3. 完成如下任务 - 题目描述: 统计数组 arr 中值等于 item 的元素出现的次数 - 输入示例: [1, 2, 4, 4, 3, 4, 3], 4 - 输出示例: 3 4. 完成如下任务 - 题目描述(15分): 找出数组 arr 中重复出现过的元素(不用考虑返回顺序) - 输入示例: [1, 2, 4, 4, 3, 3, 1, 5, 3] - 输出示例: [1, 3, 4] 5. 完成如下任务 - 题目描述: 删除数组 arr 中的指定元素 item,返回新数组(不修改原数组) - 输入示例: [1, 2, 3, 4, 2, 5], 2 - 输出示例: [1, 3, 4, 5] 6. 完成如下任务 - 题目描述: 使用数组方法 filter 和 map,从学生数组中筛选出及格的学生,并返回他们的姓名数组 - 输入示例: [{name: "小明", score: 85}, {name: "小红", score: 55}, {name: "小刚", score: 90}] - 输出示例: ["小明", "小刚"] #### 数组高阶函数(重点) 7. 完成如下任务 - 题目描述: 使用 map() 方法将数组中的每个数字都乘以 2 - 输入示例: [1, 2, 3, 4, 5] - 输出示例: [2, 4, 6, 8, 10] 8. 完成如下任务 - 题目描述: 使用 filter() 方法筛选出数组中的所有奇数 - 输入示例: [1, 2, 3, 4, 5, 6, 7, 8, 9] - 输出示例: [1, 3, 5, 7, 9] 9. 完成如下任务 - 题目描述: 使用 reduce() 方法计算数组中所有数字的总和 - 输入示例: [10, 20, 30, 40, 50] - 输出示例: 150 10. 完成如下任务 - 题目描述: 使用 reduce() 方法找出数组中的最大值 - 输入示例: [3, 7, 2, 9, 1, 5] - 输出示例: 9 11. 完成如下任务 - 题目描述: 使用 find() 方法查找数组中第一个大于 10 的数字 - 输入示例: [2, 5, 8, 12, 15, 7] - 输出示例: 12 12. 完成如下任务 - 题目描述: 使用 findIndex() 方法查找数组中第一个负数的索引位置 - 输入示例: [1, 5, 3, -2, 8, -5] - 输出示例: 3 13. 完成如下任务 - 题目描述: 使用 some() 方法判断数组中是否存在偶数 - 输入示例: [1, 3, 5, 7, 8] - 输出示例: true 14. 完成如下任务 - 题目描述: 使用 every() 方法判断数组中的所有数字是否都大于 0 - 输入示例: [1, 2, 3, 4, 5] - 输出示例: true 15. 完成如下任务 - 题目描述: 使用 sort() 方法对数字数组进行升序排序(注意:sort 默认按字符串排序) - 输入示例: [40, 100, 1, 5, 25, 10] - 输出示例: [1, 5, 10, 25, 40, 100] 16. 完成如下任务 - 题目描述: 对对象数组按指定属性排序,使用 sort() 方法按学生年龄从小到大排序 - 输入示例: [{name: "小明", age: 20}, {name: "小红", age: 18}, {name: "小刚", age: 22}] - 输出示例: [{name: "小红", age: 18}, {name: "小明", age: 20}, {name: "小刚", age: 22}] 17. 完成如下任务 - 题目描述: 使用 forEach() 方法遍历数组,输出每个元素及其索引 - 输入示例: ['apple', 'banana', 'orange'] - 输出示例: 索引0: apple 索引1: banana 索引2: orange 18. 完成如下任务 - 题目描述: 使用 reduce() 方法将数组扁平化(数组降维) - 输入示例: [[1, 2], [3, 4], [5, 6]] - 输出示例: [1, 2, 3, 4, 5, 6] 19. 完成如下任务 - 题目描述: 使用 reduce() 方法统计数组中每个元素出现的次数 - 输入示例: ['apple', 'banana', 'apple', 'orange', 'banana', 'apple'] - 输出示例: { apple: 3, banana: 2, orange: 1 } 20. 完成如下任务 - 题目描述: 链式调用多个数组方法:筛选出价格大于50的商品,然后按价格升序排序,最后只返回商品名称 - 输入示例: [ {name: "鼠标", price: 29}, {name: "键盘", price: 89}, {name: "显示器", price: 899}, {name: "耳机", price: 199} ] - 输出示例: ["键盘", "耳机", "显示器"] 21. 完成如下任务 - 题目描述: 使用 map() 和 filter() 组合:将数组中的数字先乘以 2,再筛选出大于 10 的数字 - 输入示例: [2, 5, 8, 3, 9] - 输出示例: [16, 18] 22. 完成如下任务 - 题目描述: 使用 reduce() 实现数组去重 - 输入示例: [1, 2, 2, 3, 4, 4, 5, 1] - 输出示例: [1, 2, 3, 4, 5] 23. 完成如下任务 - 题目描述: 使用数组高阶函数计算学生的平均分 - 输入示例: [ {name: "小明", score: 85}, {name: "小红", score: 92}, {name: "小刚", score: 78}, {name: "小丽", score: 88} ] - 输出示例: 85.75 24. 完成如下任务 - 题目描述: 使用 filter() 和 map() 实现数据转换:从用户数组中筛选出成年人,并返回他们的姓名和年龄组成的字符串数组 - 输入示例: [ {name: "张三", age: 17}, {name: "李四", age: 20}, {name: "王五", age: 25}, {name: "赵六", age: 16} ] - 输出示例: ["李四(20岁)", "王五(25岁)"] ### 函数 1. 完成如下任务 - 题目描述: 编写一个函数 greet,接收一个名字参数,返回问候语 "你好,XXX!" - 输入示例: "小明" - 输出示例: "你好,小明!" 2. 完成如下任务 - 题目描述: 编写一个函数 max,接收两个数字参数,返回较大的那个数 - 输入示例: 15, 23 - 输出示例: 23 3. 完成如下任务 - 题目描述: 编写一个函数 calculateArea,可以计算矩形面积(两个参数)或正方形面积(一个参数),使用默认参数实现 - 输入示例: 5, 10 或 5 - 输出示例: 50 或 25 4. 完成如下任务 - 题目描述: 编写一个箭头函数 filterEven,接收一个数组,返回所有偶数组成的新数组 - 输入示例: [1, 2, 3, 4, 5, 6] - 输出示例: [2, 4, 6] 5. 完成如下任务 - 题目描述: 编写一个函数 sumAll,使用剩余参数接收任意数量的数字,返回它们的总和 - 输入示例: 1, 2, 3, 4, 5 - 输出示例: 15 6. 完成如下任务 - 题目描述: 理解函数声明和函数表达式的区别,分别创建并调用 - 输出示例: 函数声明可以在定义前调用(函数提升) 函数表达式只能在定义后调用 7. 完成如下任务 - 题目描述: 编写一个闭包函数,创建一个计数器,每次调用返回递增的数字 - 输出示例: 第一次调用: 1 第二次调用: 2 第三次调用: 3 8. 完成如下任务 - 题目描述: 理解函数作用域,演示全局变量和局部变量的区别 - 输出示例: 局部变量只在函数内部可访问 全局变量在任何地方都可访问 9. 完成如下任务 - 题目描述: 编写一个回调函数示例,创建 processArray(arr, callback) 函数,对数组每个元素执行回调操作 - 输入示例: [1, 2, 3, 4], (num) => num * 2 - 输出示例: [2, 4, 6, 8] 10. 完成如下任务 - 题目描述: 编写一个递归函数计算阶乘 factorial(n) - 输入示例: 5 - 输出示例: 120 (因为 5! = 5 × 4 × 3 × 2 × 1 = 120) 11. 完成如下任务 - 题目描述: 编写一个递归函数实现斐波那契数列 fibonacci(n) - 输入示例: 7 - 输出示例: 13 (斐波那契数列: 0,1,1,2,3,5,8,13...) 12. 完成如下任务 - 题目描述: 使用立即执行函数表达式(IIFE)创建私有变量 - 输出示例: (function(){ var private = "私有"; })(); 外部无法访问 private 变量 13. 完成如下任务 - 题目描述: 编写一个高阶函数,接收一个函数作为参数并返回一个新函数 - 输入示例: function multiply(x) { return x * 2; } - 输出示例: 创建一个包装函数,可以在原函数执行前后添加日志 14. 完成如下任务 - 题目描述: 理解箭头函数中的 this 绑定,对比普通函数和箭头函数的 this - 输出示例: 箭头函数的 this 继承自外层作用域 普通函数的 this 指向调用者 15. 完成如下任务 - 题目描述: 使用函数柯里化(Currying)实现一个加法函数 add(a)(b) - 输入示例: add(3)(5) - 输出示例: 8 16. 完成如下任务 - 题目描述: 编写一个防抖(debounce)函数,延迟执行函数调用 - 输出示例: 用户停止输入500ms后才执行搜索函数 17. 完成如下任务 - 题目描述: 编写一个节流(throttle)函数,限制函数执行频率 - 输出示例: 滚动事件每300ms最多执行一次处理函数 18. 完成如下任务 - 题目描述: 使用解构赋值从函数参数中提取值 - 输入示例: function getUser({name, age, city}) { } getUser({name: "张三", age: 25, city: "北京", job: "工程师"}) - 输出示例: 只提取需要的 name, age, city ### 对象 1. 完成如下任务 - 题目描述: 创建一个学生对象 student,包含姓名、年龄、专业三个属性,并输出该对象 - 输出示例: { name: "张三", age: 20, major: "软件技术" } 2. 完成如下任务 - 题目描述: 给定一个对象 person,访问并返回其 name 属性和 age 属性的值 - 输入示例: { name: "李四", age: 22, city: "北京" } - 输出示例: 姓名: "李四", 年龄: 22 3. 完成如下任务 - 题目描述: 创建一个商品对象,包含名称、价格、库存,并添加一个方法 getInfo() 返回商品信息字符串 - 输出示例: 调用 getInfo() 返回: "商品:手机,价格:2999元,库存:50件" 4. 完成如下任务 - 题目描述: 给定一个对象数组 students,筛选出年龄大于18岁的学生 - 输入示例: [ { name: "小明", age: 17 }, { name: "小红", age: 19 }, { name: "小刚", age: 20 } ] - 输出示例: [ { name: "小红", age: 19 }, { name: "小刚", age: 20 } ] 5. 完成如下任务 - 题目描述: 使用对象解构,从给定对象中提取 name 和 age 属性 - 输入示例: { name: "王五", age: 25, job: "工程师", city: "上海" } - 输出示例: name: "王五", age: 25 6. 完成如下任务 - 题目描述: 使用 Object.keys()、Object.values()、Object.entries() 遍历对象 - 输入示例: { name: "张三", age: 20, city: "北京" } - 输出示例: keys: ["name", "age", "city"] values: ["张三", 20, "北京"] entries: [["name", "张三"], ["age", 20], ["city", "北京"]] 7. 完成如下任务 - 题目描述: 使用 Object.assign() 或展开运算符合并多个对象 - 输入示例: {name: "李四"}, {age: 25}, {city: "上海"} - 输出示例: {name: "李四", age: 25, city: "上海"} 8. 完成如下任务 - 题目描述: 实现对象的深拷贝和浅拷贝,理解它们的区别 - 输入示例: { name: "张三", profile: { age: 20, city: "北京" } } - 输出示例: 浅拷贝:只复制第一层 深拷贝:递归复制所有层级 9. 完成如下任务 - 题目描述: 使用 this 关键字,创建一个对象方法访问对象自身的属性 - 输出示例: ```javascript const person = { name: "张三", greet() { return `你好,我是${this.name}`; } } ``` 10. 完成如下任务 - 题目描述: 使用构造函数创建对象,理解 new 关键字的作用 - 输出示例: ```javascript function Person(name, age) { this.name = name; this.age = age; } const p = new Person("李四", 25); ``` 11. 完成如下任务 - 题目描述: 使用 ES6 的 class 语法创建类和对象 - 输出示例: ```javascript class Student { constructor(name, grade) { this.name = name; this.grade = grade; } } ``` 12. 完成如下任务 - 题目描述: 为类添加方法,包括实例方法和静态方法 - 输出示例: 实例方法:每个对象都可以调用 静态方法:只能通过类名调用 13. 完成如下任务 - 题目描述: 理解对象的属性描述符,使用 Object.defineProperty() 定义属性 - 输出示例: 设置属性为只读、不可枚举或不可配置 14. 完成如下任务 - 题目描述: 使用 getter 和 setter 控制属性的访问 - 输出示例: ```javascript const obj = { _age: 0, get age() { return this._age; }, set age(value) { this._age = value; } } ``` 15. 完成如下任务 - 题目描述: 实现对象的继承,使用原型链或 class extends - 输出示例: 子类继承父类的属性和方法 16. 完成如下任务 - 题目描述: 使用 Object.freeze() 和 Object.seal() 控制对象的可修改性 - 输出示例: freeze:完全冻结,不可修改 seal:密封,可修改现有属性,不可添加删除 17. 完成如下任务 - 题目描述: 检查对象中是否存在某个属性,使用 in 运算符和 hasOwnProperty() - 输入示例: { name: "张三", age: 20 } - 输出示例: "name" in obj: true obj.hasOwnProperty("age"): true 18. 完成如下任务 - 题目描述: 使用计算属性名动态创建对象属性 - 输入示例: const key = "score"; const student = { [key]: 85 } - 输出示例: { score: 85 } 19. 完成如下任务 - 题目描述: 实现一个简单的对象工厂函数,批量创建相似对象 - 输入示例: createUser("张三", 20), createUser("李四", 25) - 输出示例: 返回两个用户对象 20. 完成如下任务 - 题目描述: 遍历对象数组,根据某个属性分组(使用 reduce) - 输入示例: [ {name: "张三", dept: "技术部"}, {name: "李四", dept: "销售部"}, {name: "王五", dept: "技术部"} ] - 输出示例: { 技术部: [{name: "张三", dept: "技术部"}, {name: "王五", dept: "技术部"}], 销售部: [{name: "李四", dept: "销售部"}] } ## 三、DOM 操作 ### DOM 基础 1. 完成如下任务 - 题目描述: 使用 getElementById 获取 id 为 "title" 的元素,并在控制台输出该元素 - HTML 结构: ```html
段落
``` - 输出示例: class为"box"的元素个数: 2,p标签个数: 1 5. 完成如下任务 - 题目描述: 遍历一个 NodeList 或 HTMLCollection,为每个元素添加序号文本 - HTML 结构: ```html段落1
段落2
```
- 输出示例:
5. 完成如下任务
- 题目描述:
使用 innerHTML 和 textContent 的区别,分别设置元素内容并观察效果
- HTML 结构:
```html
```
- 输出示例:
理解 innerHTML 可以解析HTML标签,textContent 只显示纯文本
6. 完成如下任务
- 题目描述:
使用 classList 操作元素的 class,添加、删除、切换类名
- HTML 结构:
```html
段落1
段落2
段落3
段落2
段落3
卡片描述内容
模板内容
项目1
项目2
项目3
``` - 输出示例: 所有项目文本变为红色 2. 完成如下任务 - 题目描述: 使用 jQuery 选择所有 li 元素中的第一个和最后一个,分别添加不同的背景色 - HTML 结构: ```html段落 文本1
段落 文本2
| 第1行 |
| 第2行 |
| 第3行 |
| 第4行 |
```
- 输出示例:
图片淡入淡出切换
3. 完成如下任务
- 题目描述:
使用 jQuery 的 .slideDown() 和 .slideUp() 实现下拉菜单效果
- HTML 结构:
```html
```
- 输出示例:
点击按钮,菜单滑动展开/收起
4. 完成如下任务
- 题目描述:
使用 jQuery 的 .animate() 方法自定义动画,让元素移动并改变大小
- HTML 结构:
```html
段落1
段落2
特殊段落
段落1
段落2
段落3
``` - 输出示例: ```html段落1
段落2
段落3
```
- 输出示例:
点击按钮后图片 src 改变,宽度变为 200px,边框添加
## 六、综合实战与进阶概念
### 本地存储
1. 完成如下任务
- 题目描述:
使用 localStorage 存储用户名,页面刷新后仍能读取
- 输入示例:
"张三"
- 输出示例:
刷新页面后仍显示 "欢迎回来,张三!"
2. 完成如下任务
- 题目描述:
使用 localStorage 存储和读取一个对象(如用户信息)
- 输入示例:
{ name: "李四", age: 20, email: "lisi@example.com" }
- 输出示例:
从 localStorage 读取并显示用户信息
3. 完成如下任务
- 题目描述:
创建一个简单的待办事项列表,使用 localStorage 持久化存储数据
- 输出示例:
添加、删除待办事项后,刷新页面数据不丢失
4. 完成如下任务
- 题目描述:
使用 sessionStorage 实现页面间的数据传递(仅在当前会话有效)
- 输出示例:
在一个页面设置数据,在另一页面读取(关闭浏览器后失效)
5. 完成如下任务
- 题目描述:
实现一个"记住我"功能,使用 localStorage 保存用户登录状态
- 输出示例:
勾选"记住我"后,下次打开页面自动填充用户名
6. 完成如下任务
- 题目描述:
清除 localStorage 中的指定数据或全部数据
- 输出示例:
点击"清除数据"按钮后,localStorage 中的数据被删除
### 错误处理
1. 完成如下任务
- 题目描述:
使用 try-catch 捕获并处理 JSON.parse() 可能产生的错误
- 输入示例:
'{"name": "张三"' (错误的 JSON 格式)
- 输出示例:
输出友好的错误提示:"JSON 格式错误,请检查"
2. 完成如下任务
- 题目描述:
创建自定义错误类型,用于特定业务场景的错误处理
- 输出示例:
class ValidationError extends Error,用于表单验证错误
3. 完成如下任务
- 题目描述:
使用 try-catch-finally 处理文件读取操作,确保资源正确释放
- 输出示例:
无论是否出错,finally 块都会执行清理操作
4. 完成如下任务
- 题目描述:
在异步函数中使用 try-catch 处理 async/await 的错误
- 输出示例:
捕获 fetch 请求失败的错误并显示友好提示
5. 完成如下任务
- 题目描述:
使用 throw 语句主动抛出错误,实现参数验证
- 输入示例:
function divide(a, b) - 当 b 为 0 时抛出错误
- 输出示例:
"错误:除数不能为零"
6. 完成如下任务
- 题目描述:
设置全局错误处理器,捕获未处理的错误和 Promise rejections
- 输出示例:
使用 window.onerror 和 window.onunhandledrejection
### 模块化(选做)
1. 完成如下任务
- 题目描述:
使用 ES6 模块语法 export 导出一个函数和一个常量
- 输出示例:
```javascript
// utils.js
export const PI = 3.14159;
export function square(x) { return x * x; }
```
2. 完成如下任务
- 题目描述:
使用 import 语法导入模块中的函数和变量
- 输出示例:
```javascript
// main.js
import { PI, square } from './utils.js';
console.log(square(5)); // 25
```
3. 完成如下任务
- 题目描述:
使用 export default 导出默认模块,并在另一文件中导入
- 输出示例:
```javascript
// calculator.js
export default class Calculator { }
// main.js
import Calculator from './calculator.js';
```
4. 完成如下任务
- 题目描述:
创建一个工具模块,包含多个辅助函数,使用命名导出
- 输出示例:
创建 stringUtils.js,包含 capitalize、trim、reverse 等函数
5. 完成如下任务
- 题目描述:
使用 import * as 语法导入模块的所有导出
- 输出示例:
```javascript
import * as utils from './utils.js';
utils.square(5);
```
6. 完成如下任务
- 题目描述:
重命名导入的模块成员,避免命名冲突
- 输出示例:
```javascript
import { name as userName } from './user.js';
import { name as productName } from './product.js';
```
### 综合实战项目