条件运算符的结合性


本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/11/10/%E6%9D%A1%E4%BB%B6%E8%BF%90%E7%AE%97%E7%AC%A6%E7%9A%84%E7%BB%93%E5%90%88%E6%80%A7/

摘要

本文主要讲述了:

  1. 什么是条件运算符
  2. 优先级和结合性
  3. 条件运算符的右结合性
  4. 条件运算符的左结合性

正文

什么是条件运算符

条件运算符是 JavaScript 中仅有的拥有 3 个操作数的运算符。

示例:若condition为 Truthy,则result1;若condition为 Falsy,则result2

1
2
var condition = false;
var result = condition ? 1 : 2;

条件运算符可以视作条件语句的语法糖。

上述示例和以下写法是等效的。

1
2
3
4
5
6
7
var condition = false;
var result;
if (condition) {
result = 1;
} else {
result = 2;
}

注意:在条件运算符内部,不管优先级如何,总是先执行条件语句,然后再根据条件语句的运算结果,执行对应的表达式。

示例:依次输出:”foo”、1

1
2
3
4
5
6
function foo() {
console.log('foo');
return true;
}

foo() ? 1 * 2 : 1 + 2;

在这个示例中,虽然*+的优先级比条件运算符高,但还是先执行条件语句,即foo()

优先级和结合性

在计算机编程语言中,运算符存在两个特性,优先级和结合性。

优先级

优先级表示执行顺序的先后,优先级高的运算符先执行。

示例:

1
var result = 1 + 2 * 3;

由于乘法的优先级比加法高,所以上述示例可以看作:

1
var result = 1 + 2 * 3;

结合性

若运算符具有相同的优先级,由结合性来决定运算符的分组方式。

左结合为从左到右分组,右结合为从右到左分组。

左结合

示例:

1
var result = 1 + 1 - 1;

由于加法和减法的优先级相同,且都是左结合,所以上述示例可以看作:

1
var result = 1 + 1 - 1;

右结合

示例:

1
2
3
var foo;
var bar;
foo = bar = 1;

由于赋值运算符是右结合,所以上述示例可以看作:

1
2
3
var foo;
var bar;
foo = bar = 1;

条件运算符的右结合性

在 JavaScript 中,条件运算符是右结合的。

注意:在条件运算符内部,不管优先级如何,总是先执行条件语句,然后再根据条件语句的运算结果,执行对应的表达式。

示例:依次输出:”foo”、1

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
function foo() {
console.log('foo');
return true;
}

function bar() {
console.log('bar');
return false;
}

// 相当于:foo() ? 1 : (bar() ? 2 : 3)
let result = foo() ? 1 : bar() ? 2 : 3;

// 输出:1
console.log(result);

在上述示例中,根据右结合性,(bar() ? 2 : 3)可以被看作一个整体,作为foo()else语句。在执行顺序上,虽然()的优先级比条件运算符高,但还是先执行条件语句,即foo()

条件运算符的左结合性

在 PHP 中,条件运算符是左结合的。

注意:在条件运算符内部,不管优先级如何,总是先执行条件语句,然后再根据条件语句的运算结果,执行对应的表达式。

示例:依次输出:”foo”、2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
function foo()
{
echo 'foo';
return TRUE;
}

function bar()
{
echo 'bar';
return FALSE;
}

// 相当于:(foo() ? 1 : bar()) ? 2 : 3
$result = foo() ? 1 : bar() ? 2 : 3;

// 输出:2
echo $result;

在上述示例中,根据左结合性,(foo() ? 1 : bar())可以被看作一个整体,作为条件语句。

参考资料

本文作者: jsweibo

本文链接: https://jsweibo.github.io/2019/11/10/%E6%9D%A1%E4%BB%B6%E8%BF%90%E7%AE%97%E7%AC%A6%E7%9A%84%E7%BB%93%E5%90%88%E6%80%A7/


本文对你有帮助?请支持我


支付宝
微信