JavaScript零基础进阶实战指南:函数、数组与对象核心操作
一、认知破冰:函数、数组与对象的核心定位
函数:封装可重复执行的代码块,实现“一次编写、多次调用”,减少代码冗余(比如多次使用的计算逻辑、交互逻辑均可封装为函数);
数组:有序存储多个同类数据的集合,提供专属方法快速处理数据(比如批量处理用户列表、商品数据等);
对象:无序存储多个相关数据和方法的集合,用于封装复杂实体(比如一个用户、一件商品的信息,包含属性和操作方法)。
二、核心攻坚一:函数——代码复用的核心工具
2.1 函数的定义与调用:最基础的使用方式
2.1.1 基础语法
// 1. 定义函数(函数声明方式)
function 函数名(参数1, 参数2, ...) {
// 函数体:需要执行的代码逻辑
代码块;
// 可选:返回值(通过return语句)
return 返回结果;
}
// 2. 调用函数(必须调用才会执行函数体)
函数名(参数1, 参数2, ...);2.1.2 极简实战案例:封装加法计算
// 定义加法函数:接收两个参数a和b,返回两者的和
function add(a, b) {
let sum = a + b;
return sum; // 返回计算结果
}
// 调用函数:传入实际参数,接收返回值
let result1 = add(10, 20);
let result2 = add(30, 40);
// 打印结果
console.log("10+20=", result1); // 输出10+20= 30
console.log("30+40=", result2); // 输出30+40= 702.2 函数的参数:让函数更灵活
2.2.1 核心知识点
形参:函数定义时括号内的变量,用于接收实参的值(如上面案例中的a、b);
实参:函数调用时括号内传入的值,会赋值给对应的形参(如调用add(10,20)时的10、20);
默认参数:形参可设置默认值,当调用时未传入对应实参,将使用默认值(解决“实参缺失导致计算错误”的问题)。
2.2.2 实战案例:带默认参数的减法函数
// 定义减法函数:b设置默认值0,若未传入b则默认减0
function subtract(a, b = 0) {
return a - b;
}
// 调用函数
console.log(subtract(20, 5)); // 传入两个实参,输出15
console.log(subtract(10)); // 只传入一个实参,b使用默认值0,输出102.3 常见函数类型:箭头函数(简化写法)
2.3.1 基础语法与对比
// 传统函数声明
function add(a, b) {
return a + b;
}
// 箭头函数简化(等价于上面的传统函数)
const addArrow = (a, b) => a + b;
// 调用测试
console.log(add(5, 3)); // 输出8
console.log(addArrow(5, 3)); // 输出82.3.2 核心特点(新手必记)
简化语法:省略function关键字,用“=>”连接参数和函数体;
自动return:若函数体只有一句代码,可省略大括号和return语句(如上面的案例);
适用场景:简单逻辑函数、DOM事件回调、数组方法回调(后续数组章节会用到)。
三、核心攻坚二:数组进阶——高效处理有序数据
3.1 数组的基础操作:创建与访问
// 1. 创建数组(两种常用方式)
const arr1 = [1, 2, 3, 4, 5]; // 直接用方括号创建(最常用)
const arr2 = new Array("苹果", "香蕉", "橙子"); // 用Array构造函数创建
// 2. 访问数组元素(通过索引,索引从0开始)
console.log(arr1[0]); // 访问第一个元素,输出1
console.log(arr2[2]); // 访问第三个元素,输出橙子
// 3. 数组长度(length属性)
console.log(arr1.length); // 输出5(数组arr1有5个元素)3.2 新手必备数组方法:遍历与筛选
3.2.1 forEach:遍历数组(替代传统for循环)
const fruits = ["苹果", "香蕉", "橙子", "葡萄"];
// forEach遍历数组,接收一个回调函数(每个元素执行一次)
fruits.forEach((item, index) => {
// item:当前遍历的元素;index:当前元素的索引
console.log(`索引${index}:${item}`);
});
// 输出结果:
// 索引0:苹果
// 索引1:香蕉
// 索引2:橙子
// 索引3:葡萄3.2.2 filter:筛选数组元素
const scores = [85, 62, 93, 45, 78, 98];
// 筛选出及格的分数(>=60)
const passedScores = scores.filter(score => score >= 60);
console.log("原数组:", scores); // 输出原数组:[85,62,93,45,78,98]
console.log("及格分数:", passedScores); // 输出及格分数:[85,62,93,78,98]3.2.3 map:修改数组元素(映射数组)
const prices = [10, 20, 30, 40];
// 给每个价格加5元(模拟涨价)
const newPrices = prices.map(price => price + 5);
console.log("原价格:", prices); // 输出原价格:[10,20,30,40]
console.log("涨价后:", newPrices); // 输出涨价后:[15,25,35,45]3.3 实战:数组方法组合使用
const scores = [85, 62, 93, 45, 78, 98];
// 步骤1:筛选及格分数;步骤2:转换为等级
const scoreLevels = scores
.filter(score => score >= 60)
.map(score => {
if (score >= 90) {
return "优秀";
} else if (score >= 80) {
return "良好";
} else {
return "及格";
}
});
console.log("分数等级:", scoreLevels); // 输出分数等级:["良好","及格","优秀","及格","优秀"]四、核心攻坚三:对象操作——封装复杂数据与方法
4.1 对象的创建与基础结构
// 创建一个"用户"对象
const user = {
// 属性:键值对(键:属性名,值:属性值)
name: "张三",
age: 22,
gender: "男",
// 方法:属性值为函数
sayHello: function() {
// 用this访问对象内部的属性
console.log(`大家好,我是${this.name},今年${this.age}岁`);
},
// 箭头函数形式的方法(简化写法)
changeAge: (newAge) => {
user.age = newAge; // 箭头函数中this不指向当前对象,直接用对象名访问
}
};4.2 对象属性的访问与修改
const user = {
name: "张三",
age: 22,
gender: "男"
};4.2.1 点语法(最常用,简洁直观)
// 访问属性
console.log(user.name); // 输出张三
console.log(user.age); // 输出22
// 修改属性
user.age = 23;
console.log("修改后的年龄:", user.age); // 输出修改后的年龄:234.2.2 方括号语法(适用于属性名含特殊字符或动态属性名)
// 1. 访问属性名含特殊字符的属性
const product = {
"product-name": "手机",
price: 2999
};
console.log(product["product-name"]); // 输出手机(点语法无法访问,必须用方括号)
// 2. 动态访问属性(属性名存储在变量中)
const attrName = "price";
console.log(product[attrName]); // 输出29994.3 对象方法的调用
const user = {
name: "张三",
age: 22,
sayHello: function() {
console.log(`大家好,我是${this.name}`);
},
changeAge: (newAge) => {
user.age = newAge;
}
};
// 调用sayHello方法
user.sayHello(); // 输出大家好,我是张三
// 调用changeAge方法(传入参数)
user.changeAge(25);
console.log("修改后的年龄:", user.age); // 输出修改后的年龄:25五、实战落地:封装一个购物车数据管理模块
5.1 需求分析
添加商品:传入商品信息(名称、价格、数量),添加到购物车数组;
删除商品:根据商品名称删除购物车中的对应商品;
计算总价:遍历购物车数组,计算所有商品的总价;
筛选商品:根据传入的价格阈值,筛选出价格大于等于该阈值的商品。
5.2 完整代码实现
// 购物车管理模块(对象封装)
const cartManager = {
// 购物车数组(存储商品对象)
cart: [],
// 1. 添加商品方法
addProduct: function(name, price, quantity = 1) {
// 验证商品信息完整性
if (!name || !price) {
alert("商品名称和价格不能为空!");
return;
}
// 添加商品到购物车
this.cart.push({
name: name,
price: price,
quantity: quantity
});
console.log(`商品【${name}】添加成功!`);
},
// 2. 删除商品方法
deleteProduct: function(name) {
// 筛选出不等于目标名称的商品,重新赋值给cart(实现删除)
const newCart = this.cart.filter(product => product.name !== name);
if (newCart.length === this.cart.length) {
console.log(`未找到商品【${name}】`);
return;
}
this.cart = newCart;
console.log(`商品【${name}】删除成功!`);
},
// 3. 计算总价方法
calculateTotal: function() {
// 遍历购物车,计算总价(价格*数量求和)
const total = this.cart.reduce((sum, product) => {
return sum + product.price * product.quantity;
}, 0); // 初始值为0
console.log(`购物车总价:${total}元`);
return total;
},
// 4. 筛选商品方法(筛选价格>=阈值的商品)
filterProducts: function(minPrice) {
const filtered = this.cart.filter(product => product.price >= minPrice);
console.log(`价格>=${minPrice}元的商品:`, filtered);
return filtered;
}
};
// 实战测试
cartManager.addProduct("苹果", 5, 3); // 添加商品:苹果,5元/个,3个
cartManager.addProduct("香蕉", 3, 5); // 添加商品:香蕉,3元/个,5个
cartManager.addProduct("手机", 2999, 1); // 添加商品:手机,2999元/台,1台
cartManager.calculateTotal(); // 计算总价:5*3 + 3*5 + 2999*1 = 3039元
cartManager.filterProducts(100); // 筛选价格>=100元的商品(只有手机)
cartManager.deleteProduct("香蕉"); // 删除商品:香蕉
cartManager.calculateTotal(); // 重新计算总价:5*3 + 2999*1 = 3014元5.3 代码说明与运行效果
用对象cartManager封装所有购物车相关功能,cart数组存储商品数据,四个方法分别对应核心需求;
添加商品时验证参数完整性,避免无效数据;删除商品时用filter方法筛选,简洁高效;
计算总价用reduce方法(数组累加方法),比传统for循环更简洁;筛选商品复用filter方法,体现代码复用价值。
六、新手避坑指南
函数调用时注意参数数量:若函数定义了必填参数,调用时未传入,会导致参数值为undefined,引发逻辑错误;
数组方法的返回值:filter、map等方法会返回新数组,不会改变原数组,需用变量接收返回值才会生效;
对象方法中的this:普通函数形式的方法用this访问对象属性,箭头函数形式的方法this不指向当前对象,需直接用对象名访问;
数组索引从0开始:访问数组元素时注意索引范围,避免“索引越界”错误(比如访问arr[5]但数组只有5个元素,索引最大为4)。

