函数形参与实参:为什么 object[prop] 能读到,object.prop 读不到
2026/11/6...大约 2 分钟
函数形参与实参
核心结论
object.prop里的prop是字面量的属性名,不是变量;object[prop]里的prop才按变量求值。想把「属性名」作为参数传进函数,只能用中括号。
一、问题现场
传入一个对象、直接读它的属性,这样写没问题:
function inputObj(object) {
const getValue = object.someProps; // 读的是名为 someProps 的属性
}但一旦属性名本身也作为参数传进来,就会踩坑:
function getObjAndProp(object, prop) {
const getValue = object.prop; // ✗ 读的是名为 "prop" 的属性
}JavaScript 不会把 prop 当变量,而是当成字符串键名 "prop",于是去找对象里名字叫 prop 的属性 —— 对象上根本没有这个键,得到 undefined。而 prop 只是形参,它的值(实参)根本没被用上。
二、正确写法
function getObjAndPropCorrectly(object, prop) {
const getValue = object[prop]; // ✓ 按 prop 的值取属性
}中括号内的表达式会被求值,prop 解析为变量 → 取到实参 → 用它作为属性名。这与「对象键名不加引号也是字符串」是同一套规则的两面:
let user1 = '张三';
let grade = {
user1: 100, // 键是字符串 "user1"
[user1]: 200 // 键是变量 user1 的值 "张三"
};
// { user1: 100, '张三': 200 }三、形参与实参的基本关系
| 含义 | 何时确定 | |
|---|---|---|
| 形参(formal parameter) | 函数定义里声明的名字 | 写代码时 |
| 实参(actual argument) | 调用时真正传入的值 | 运行时 |
- 实参少于形参 → 缺的形参是
undefined(ES6 后可用默认值param = 默认值); - 实参多于形参 → 多出来的只能通过
arguments(非箭头函数)或...rest拿到; - 箭头函数没有自己的
arguments,要用 rest 参数。
四、这条规则在哪都会遇到
- 动态取值:
obj[key]、arr[i]、map.get(key)的同构写法; - 表单/配置驱动代码:字段名来自配置,只能
record[fieldName]; - 计算属性名:
{ [dynamicKey]: value }; - 模板/序列化:
JSON与一切「按名字取值」的场景。
一句话记:点号是写死的键,中括号是算出来的键。
