结合性问题
问题1:三元运算符是有右结合性,那么下面代码为什么没有执行a1?
function a1() {
console.log('a1');
return 'a1';
}
function a2() {
console.log('a2');
return 'a2';
}
const text = a2() ? '3' : a1() ? '1' : '2';
console.log(text);
答:结合性不等于执行顺序。结合性是编译时的语法规则,而执行顺序是运行时的求值规则。
问题2:小括号的优先级最高,为什么下面代码没有先执行小括号的内容?
function a1() {
console.log('a1');
return 'a1';
}
function a2() {
console.log('a2');
return 'a2';
}
const text = a2() ? '3' : (a1() ? '1' : '2');
console.log(text);
答:
- 括号优先级最高:确保运算结构正确
- 短路求值更强大:决定代码是否真正执行
- 结构 ≠ 执行:有些代码在语法上存在,但运行时可能不会执行