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

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函数参数处理中的常见问题。

相关帖子
如果对某些水果不耐受,是因为其中的果糖还是其他成分?
如果对某些水果不耐受,是因为其中的果糖还是其他成分?
海淀六年一学位优化后,房产学位被占用也能入学,具体会走哪种划片路径?
海淀六年一学位优化后,房产学位被占用也能入学,具体会走哪种划片路径?
如何帮助符合条件的老年人或亲友办理残疾人证与评估?
如何帮助符合条件的老年人或亲友办理残疾人证与评估?
从第一代到如今的身份证,它的设计经历了怎样的演变过程?
从第一代到如今的身份证,它的设计经历了怎样的演变过程?
生物育种如何应对未来人口增长带来的粮食压力?
生物育种如何应对未来人口增长带来的粮食压力?
2026年,是否有更智能、更安全的方式替代传统的纸质信息卡?
2026年,是否有更智能、更安全的方式替代传统的纸质信息卡?
办理房子抵押贷款流程中房子能住吗?抵押期间权益解析
办理房子抵押贷款流程中房子能住吗?抵押期间权益解析
面对墙壁和地面“冒水”的现象,正确的应急处理步骤应该是怎样的?
面对墙壁和地面“冒水”的现象,正确的应急处理步骤应该是怎样的?
2026年,是否有更便捷的官方数字平台可帮助劳动者查询和确认自己的薪酬记录?
2026年,是否有更便捷的官方数字平台可帮助劳动者查询和确认自己的薪酬记录?
2026年“身后一件事”联办服务,是否支持异地远程办理或委托他人代办?
2026年“身后一件事”联办服务,是否支持异地远程办理或委托他人代办?
职工离职后暂时未就业,期间能否继续提取公积金用于支付房租费用?
职工离职后暂时未就业,期间能否继续提取公积金用于支付房租费用?
定期进行的电梯安全检查与维护,主要能防范哪些可能导致运行异常的风险?
定期进行的电梯安全检查与维护,主要能防范哪些可能导致运行异常的风险?
连锁品牌的一家门店倒闭,其总部是否有责任承接消费者的预付款?
连锁品牌的一家门店倒闭,其总部是否有责任承接消费者的预付款?
最全经营贷款利率攻略,助企业找到最低利息贷款
最全经营贷款利率攻略,助企业找到最低利息贷款
建成后的高标准农田,后续的维护管护责任和资金由谁承担?
建成后的高标准农田,后续的维护管护责任和资金由谁承担?
从全球视角看,文字的统一与多样性在文化交流与融合中扮演着怎样的角色?
从全球视角看,文字的统一与多样性在文化交流与融合中扮演着怎样的角色?
在评价公共服务时,如何撰写具体、客观的评价内容以便于问题解决?
在评价公共服务时,如何撰写具体、客观的评价内容以便于问题解决?
企业税票贷主流还款方式详解,对比多款还款模式挑选适配周转方案
企业税票贷主流还款方式详解,对比多款还款模式挑选适配周转方案
中国共享单车的运营模式在海外市场推广时,进行了哪些本土化改良?
中国共享单车的运营模式在海外市场推广时,进行了哪些本土化改良?
从全职转为兼职或灵活就业,社保缴费基数应该如何衔接与重新计算?
从全职转为兼职或灵活就业,社保缴费基数应该如何衔接与重新计算?