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

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

相关帖子
如果对某些水果不耐受,是因为其中的果糖还是其他成分?
如果对某些水果不耐受,是因为其中的果糖还是其他成分?
海淀六年一学位优化后,房产学位被占用也能入学,具体会走哪种划片路径?
海淀六年一学位优化后,房产学位被占用也能入学,具体会走哪种划片路径?
如何帮助符合条件的老年人或亲友办理残疾人证与评估?
如何帮助符合条件的老年人或亲友办理残疾人证与评估?
从第一代到如今的身份证,它的设计经历了怎样的演变过程?
从第一代到如今的身份证,它的设计经历了怎样的演变过程?
生物育种如何应对未来人口增长带来的粮食压力?
生物育种如何应对未来人口增长带来的粮食压力?
写字楼门店房抵押贷款需要婚姻证明吗?已婚未婚申请条件差异
写字楼门店房抵押贷款需要婚姻证明吗?已婚未婚申请条件差异
小区房子抵押贷款征信要求和消费贷征信要求有什么区别?解析
小区房子抵押贷款征信要求和消费贷征信要求有什么区别?解析
贷款买大货车需要买全险吗?险种选择省钱技巧
贷款买大货车需要买全险吗?险种选择省钱技巧
小区房子抵押贷款对借款人职业有什么条件?职业类型与审批关系解析
小区房子抵押贷款对借款人职业有什么条件?职业类型与审批关系解析
未来,公众满意度调查是否会更加注重长期跟踪与动态反馈机制?
未来,公众满意度调查是否会更加注重长期跟踪与动态反馈机制?
银行查消费贷用途会实地走访吗?贷后管理频率与合规使用正面清单
银行查消费贷用途会实地走访吗?贷后管理频率与合规使用正面清单
商业银行房产抵押贷全解析:消费与经营双用途,额度最高千万,期限长达十年
商业银行房产抵押贷全解析:消费与经营双用途,额度最高千万,期限长达十年
逾期后信用贷额度会清零吗?逾期还款对授信额度的打击
逾期后信用贷额度会清零吗?逾期还款对授信额度的打击
商品房贷款费用可以抵扣利息吗?费用与利息关系说明
商品房贷款费用可以抵扣利息吗?费用与利息关系说明
商铺门面房抵押银行贷款额度国有银行和商业银行有什么区别?对比
商铺门面房抵押银行贷款额度国有银行和商业银行有什么区别?对比
汽车贷款额度与微信分?社交信用对额度的影响
汽车贷款额度与微信分?社交信用对额度的影响
债务优化重组条件不符合怎么办?不符合条件应对方法说明
债务优化重组条件不符合怎么办?不符合条件应对方法说明
过桥垫资费用一线城市是多少?北上广深收费标准对比解析
过桥垫资费用一线城市是多少?北上广深收费标准对比解析
公司债务优化重组流程常见坑有哪些?避坑指南与注意事项
公司债务优化重组流程常见坑有哪些?避坑指南与注意事项
小区房子抵押贷款还款方式怎么选?等额本息与先息后本哪种更划算
小区房子抵押贷款还款方式怎么选?等额本息与先息后本哪种更划算