在 javascript 中,成员访问运算符(`.` 和 `[]`)的优先级确实是最高的之一,仅次于函数调用 `()`、new 表达式以及可选链 `?.`。这意味着在包含多种运算符的复杂表达式中,引擎会优先执行属性或索引的访问操作,然后再处理赋值、算术或逻辑运算。

a.b.c = d + e 是如何解析的?
该表达式会被解析为 (a.b.c) = (d + e)。成员访问运算符 . 的优先级高于赋值运算符 = 和加法运算符 +。因此,JavaScript 引擎首先计算左侧的目标对象路径 a.b.c,确定要修改的具体属性,然后计算右侧的值 d + e,最后将结果赋值给目标属性。

const a = { b: { c: 10 } };
let d = 5;
let e = 5;
a.b.c = d + e;
console.log(a.b.c); // 输出 10
在这个例子中,a.b.c 先被解析为对 a 对象的 b 属性的 c 属性的引用。接着 d + e 计算出 10。最后将 10 赋值给 a.b.c。如果优先级不同,比如赋值先于成员访问,那么表达式将变得毫无意义,因为无法对一个数值进行成员访问。
obj[key] = func() 的执行顺序是怎样的?
该表达式的执行顺序是:先执行函数调用 func() 获取返回值,再解析 obj[key] 确定目标位置,最后执行赋值。虽然成员访问 [] 和函数调用 () 具有相同的最高优先级,但赋值运算符 = 的优先级远低于它们。因此,引擎会先独立计算右侧的函数调用和左侧的成员访问,完成后再进行赋值操作。

const obj = {};
function getValue() {
return 'dynamic';
}
const key = 'name';
obj[key] = getValue();
console.log(obj.name); // 输出 dynamic
这里 getValue() 先执行并返回字符串 'dynamic'。同时 obj[key] 解析为 obj['name']。最后将 'dynamic' 赋值给 obj.name。这种优先级规则确保了在赋值之前,所有的源数据和目标位置都已经被正确计算和定位。
当成员访问遇到空值时会发生什么?
如果成员访问的路径中包含 null 或 undefined,且不使用可选链 ?.,程序会抛出 TypeError。例如 a.b.c 中,如果 a.b 是 null,尝试访问 c 就会报错。这是因为成员访问运算符要求左操作数必须是一个有效的对象引用。如果使用可选链 ?.,则会在遇到空值时短路返回 undefined,而不会抛出错误。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











