一架梯子,一头程序猿,仰望星空!

Dart语言运算符


本章介绍Dart语言的运算符以及表达式,在运算符和表达式上Dart语言跟其他编程语言类似,主要包括下面几类:

  • 算数运算符
  • 关系运算符
  • 类型测试运算符
  • 赋值运算符
  • 逻辑运算符
  • 位运算符
  • 条件运算符
  • Cascade (级联调用)

这几类运算符,熟悉其他编程语言的人来说都比较熟悉了,唯一区别就是Cascade (级联调用)表达式,这种语法其他语言不一定有,下面一一介绍各种运算符的用法。

说明:编程语言的表达式,通常就是由运算符和变量,函数等元素组成的语法句子。

1. Cascade (级联调用)

我们先介绍跟其他语言有区别的级联调用的语法,级联调用主要用在对同一个对象连续调用的场景。

级联调用主要通过 .. (两个连续的点) 连续调用对象成员。

例子:

querySelector('#confirm') // 通过querySelector查询获得一个对象
  ..text = 'Confirm' // 设置对象text熟属性
  ..classes.add('important');  // 调用对象的classes属性的add函数

等价代码

// 通过querySelector查询获得一个对象
var button = querySelector('#confirm');
// 设置对象text熟属性
button.text = 'Confirm';
// 调用对象的classes属性的add函数
button.classes.add('important');

提示: 大家可以先忽略querySelector函数,以及返回对象的是干什么的,先关注语法。

2.赋值运算符

赋值运算符通常用于将表达式结果赋值给一个变量。

例子:

a = 100;

复合赋值运算符。

语法:a op= b 等价于 a = a op b
说明:op是各种运算符。

例子:

a *= 3; // 等价于 a = a * 3
a -= 3; // 等价于 a = a - 3
a += 3; // 等价于 a = a + 3
a /= 3; // 等价于 a = a / 3
a %= 3; // 等价于 a = a % 3

3.算数运算符

运算符说明
+
-
-expr算数取反
*
/
~/除法,结果取整
%求余
++支持前置自增和后置自增
-- 支持前置自减和后置自减

例子:

// a = 5
var a = 2 + 3;
// a1 = -1
var a1 = 2 - 3;
// a2 = 6
var a2 = 2 * 3;
// a3 = 2.5
var a3 = 5 / 2;
// 整除,a4 = 2
var a4 = 5 ~/ 2;
// 求余数 a5 = 1
var a5 = 5 % 2;
a++; // 相当于 a = a + 1
++a; 
a--; // 相当于 a = a - 1
--a;

说明:a++和++a这两种表达式区别是a++是先返回a的值,然后在加1, ++a则是先加1在返回a+1的值 ,如果单独写 a++和++a 结果没区别,如果用在复合表达式中或者赋值表达式中就有区别了。

4.关系运算符

运算符说明
==判断两个值是否相等
!=判断两个值是否不相等
>大于
<小于
>=大于等于
<=小于等于

关系运运算符常用于条件表达式中,判断条件是否成立。

例子:

if (a >= 1)) {
    // 代码
}

5.类型测试运算符

类型测试运算符主要用于检测一个变量跟一个对象类型的关系。

运算符说明
as用于类型转换,将一个对象类型转换成另外一种对象类型,一般用于子类对象转换成父类对象。
is用于检测一个变量是否属于某种对象类型
is!用于检测一个变量不属于某种对象类型

例子:

// 如果 emp变量是Person类型则条件为true
if (emp is Person) {
  // 忽略代码
}

// 永远返回true, 因为所有类型都继承了Object。
if (emp is Object) {
    // 忽略代码
}

说明:如果变量是某个类的子类的实例,那么这个变量也属于父类类型,is条件返回true。

6.逻辑运算符

运算符说明
!expr表达式条件取反
||逻辑或
&&逻辑与

常用于条件语句组合表达式,例子:

if (!done && (col == 0 || col == 3)) {
  // ..忽略代码..
}

7.位运算符

二进制位运算符

运算符说明
&
|
^异或
~expr按位取反
<<左移
>>右移

例子:

// a = 256
var a = 1 << 8;

8.条件运算符

在dart语言中有两种条件运算符。

语法1:

condition ? expr1 : expr2

condition 表达式为真,则执行并返回expr1的值, 否则执行expr2

语法2:

expr1 ?? expr2

如果expr1不等于null, 则执行expr1并返回expr1的值,否则执行并返回expr2的值。

例子:

// 如果isPublic为真,visibility = 'public' 否则 visibility = 'private'
var visibility = isPublic ? 'public' : 'private';

// 这种语法在处理参数默认值非常有用。
// 如果name不等于null, 则payerName = name 否则payerName = 'Guest'
String payerName = name ?? 'Guest';