欢迎光临新沂市白事服务网
详情描述

1. 基本参数传递(值传递)

// 基本类型是值传递
function changeValue(x) {
    x = 10;  // 不影响外部变量
}

let num = 5;
changeValue(num);
console.log(num); // 5,不变

2. 对象/数组参数(引用传递)

// 对象和数组是引用传递
function changeObject(obj) {
    obj.name = "changed";  // 会影响原对象
}

let person = { name: "John" };
changeObject(person);
console.log(person.name); // "changed"

3. 避免意外修改参数的解决方案

方案1:使用默认参数

// ES6默认参数
function greet(name = "Guest", age = 18) {
    return `Hello ${name}, age ${age}`;
}

方案2:创建副本

function safeModify(obj) {
    // 创建副本
    const newObj = { ...obj };  // 浅拷贝
    newObj.name = "changed";
    return newObj;  // 返回新对象
}

// 数组同理
function safeArrayModify(arr) {
    return [...arr, "new item"];  // 返回新数组
}

方案3:使用解构赋值

// 解构参数
function processUser({ name, age = 25 } = {}) {
    return `${name} is ${age} years old`;
}

// 混合解构
function processData({ 
    name, 
    settings: { theme = 'light', notifications = true } = {} 
} = {}) {
    console.log(name, theme);
}

方案4:Rest参数

// 收集剩余参数
function sum(...numbers) {
    return numbers.reduce((acc, num) => acc + num, 0);
}

console.log(sum(1, 2, 3, 4)); // 10

4. 高级技巧

参数验证

function createUser({
    name,
    age,
    email,
    isAdmin = false
} = {}) {
    // 参数验证
    if (!name || typeof name !== 'string') {
        throw new Error('Name is required and must be a string');
    }
    if (age < 0) {
        throw new Error('Age cannot be negative');
    }

    return { name, age, email, isAdmin };
}

柯里化函数

// 函数柯里化
const multiply = (a) => (b) => a * b;
const double = multiply(2);
console.log(double(5)); // 10

惰性求值

function lazyCompute(value, computeFn = () => value) {
    return computeFn();
}

console.log(lazyCompute(5)); // 5
console.log(lazyCompute(null, () => 10 * 10)); // 100

5. 常见问题解决

Q1:如何设置可选参数?

// 方法1:使用默认值
function log(message, prefix = "LOG: ") {
    console.log(prefix + message);
}

// 方法2:检查undefined
function log(message, prefix) {
    const actualPrefix = prefix !== undefined ? prefix : "LOG: ";
    console.log(actualPrefix + message);
}

Q2:如何处理多个可选参数?

// 使用对象参数
function createElement({
    tag = 'div',
    text = '',
    className = '',
    onClick = null
} = {}) {
    const el = document.createElement(tag);
    el.textContent = text;
    el.className = className;
    if (onClick) el.onclick = onClick;
    return el;
}

Q3:参数顺序混乱?

// 使用命名参数模式
function connect({
    host = 'localhost',
    port = 8080,
    timeout = 5000,
    retry = 3
}) {
    console.log(`Connecting to ${host}:${port}`);
}

// 调用清晰明了
connect({ host: 'example.com', port: 3000 });

最佳实践建议:

优先使用解构参数提高代码可读性 对可能被修改的对象参数进行深拷贝(如果需要保持原对象不变) 使用默认参数替代复杂的条件检查 参数过多时使用对象参数 始终验证关键参数的类型和有效性

通过合理使用这些技巧,可以避免JavaScript函数参数处理中的常见问题。

相关帖子
如何帮助符合条件的老年人或亲友办理残疾人证与评估?
如何帮助符合条件的老年人或亲友办理残疾人证与评估?
从第一代到如今的身份证,它的设计经历了怎样的演变过程?
从第一代到如今的身份证,它的设计经历了怎样的演变过程?
生物育种如何应对未来人口增长带来的粮食压力?
生物育种如何应对未来人口增长带来的粮食压力?
新沂市多语言网站开发-电商网站建设,优秀开发团队
新沂市多语言网站开发-电商网站建设,优秀开发团队
新沂市网站优化公司|企业获客软件,专业设计团队
新沂市网站优化公司|企业获客软件,专业设计团队
货车能申请汽车抵押贷款吗?商用车申请条件与私家车大不同
货车能申请汽车抵押贷款吗?商用车申请条件与私家车大不同
传闻中的“峰谷分时电价”具体是如何划分时段并计算电费的?
传闻中的“峰谷分时电价”具体是如何划分时段并计算电费的?
听说部分省市分娩政策范围内费用个人
听说部分省市分娩政策范围内费用个人"零自付",符合条件的准妈妈该怎么备案?
开放麦台下坐的是不是全是同行,新手上去讲会不会被集体砸场?
开放麦台下坐的是不是全是同行,新手上去讲会不会被集体砸场?
保证金起步是一千元吗,具体数额到底由谁来定?
保证金起步是一千元吗,具体数额到底由谁来定?
对于老年群体逐渐出现的视力听力衰退,信息无障碍设计能提供哪些帮助?
对于老年群体逐渐出现的视力听力衰退,信息无障碍设计能提供哪些帮助?
税票贷资料填写与授权指南,规避信息错误导致申请审核被驳回
税票贷资料填写与授权指南,规避信息错误导致申请审核被驳回
企业税票贷全流程详解,从数据授权、线上审批到提款使用分步拆解
企业税票贷全流程详解,从数据授权、线上审批到提款使用分步拆解
身份证前六位能反查出详细家庭住址吗,普通人随便查别人算不算违法?
身份证前六位能反查出详细家庭住址吗,普通人随便查别人算不算违法?
零基础了解车抵贷相关知识,详解业务属性、分类及基础准入规则
零基础了解车抵贷相关知识,详解业务属性、分类及基础准入规则
现在普遍推广电子驾驶证,线下换领新证后电子凭证会自动更新吗?
现在普遍推广电子驾驶证,线下换领新证后电子凭证会自动更新吗?
工作或学习时遇到经期烦躁,如何快速调整状态以保证效率与专注力?
工作或学习时遇到经期烦躁,如何快速调整状态以保证效率与专注力?
稻谷、小麦、玉米、大豆的自给率为何差异这么大,水稻为什么能做到接近满自给?
稻谷、小麦、玉米、大豆的自给率为何差异这么大,水稻为什么能做到接近满自给?
超市和路边摊的本地菜长得差不多,价格和口感差别到底藏在哪儿?
超市和路边摊的本地菜长得差不多,价格和口感差别到底藏在哪儿?
护照换发申请提交后,如何查询实时的办理进度和状态?
护照换发申请提交后,如何查询实时的办理进度和状态?