为何JavaScript函数实参与形参不进行校验?
JavaScript函数参数不校验的原因
JavaScript作为动态弱类型语言,和Java这类静态强类型语言的参数机制有着本质区别,这就是你看到实参与形参不匹配却仍能执行的核心原因:
- 无强制参数数量校验:JS函数定义时的形参只是“占位符”,调用时传入的实参数量完全不受限制。哪怕定义时没有形参,像你例子里的
display(),调用display(12)也不会报错——多传的参数会被存在函数内部的arguments对象(ES6后也可用...rest参数获取)里,只要函数逻辑没用到这些多余参数,就不会影响执行。 - 缺省参数自动设为undefined:如果调用时传的实参比形参少,没被赋值的形参会自动被设为
undefined,而非直接报错。比如function fn(a) { console.log(a) },调用fn()会打印undefined,程序依然正常运行。 - 编译阶段无参数检查:Java这类语言在编译阶段就会严格校验方法的参数数量、类型是否匹配,不匹配直接编译失败。但JS没有这个环节,参数校验仅在运行时进行,且只有当你在函数逻辑里用到不符合预期的参数时才可能出错(比如对
undefined调用方法),否则函数会正常执行。
再举个直观例子:
function showInfo(name) { console.log(`Hello, ${name || 'Guest'}`); } // 以下调用全部合法 showInfo(); // 打印 Hello, Guest showInfo('Alice'); // 打印 Hello, Alice showInfo('Bob', 25); // 打印 Hello, Bob(多余的25被忽略)
内容的提问来源于stack exchange,提问作者Ankit
相关产品推荐
相关产品推荐

