算术运算符

操作符 含义 例子
+ var a = 2 + 3;
- var a = 2 - 3;
-exper 负数 var a = -1;
* var a = 2 * 3;
/ 除,精确除法 var a = 5 / 2; // a的结果为 2.5
~/ 整除 var a = 5 ~/ 2; // a的结果为 2
% 取余 var a = 5 % 2; // a的结果为 1
++var var a = 1;
var b = ++a;// b 的结果为 2,a 的结果为 2
var++ var a = 1;
var b = a++;// b 的结果为 1,a 的结果为 2
--var var a = 1;
var b = —a;// b 的结果为 0,a 的结果为 0
var-- var a = 1;
var b = a—;// b 的结果为 1,a 的结果为 0

比较操作符

下面是 Dart 支持的判断是否相等和大小关系的操作符:

操作符 含义 例子
== 是否相等 assert(2 == 2);
!= 不等于 assert(2 != 3);
> 大于 assert(3 > 2);
< 小于 assert(2 < 3);
>= 大于等于 assert(3 >= 3);
<= 小于等于 assert(3 <= 3);

类型判断符

下面是 Dart 支持的检查运行时类型的操作符:

操作符 含义 例子
as 类型转换 (emp as Person).firstName = ‘Bob’;
is 判断是否是某个类型,如果是的话,就返回 true if (emp is Person) {
// 如果 emp 是 Person 类型
emp.firstName =’Bob’;
}
is! 判断是否不是某个类型,如果不是的话,就返回 true if (emp is! Person) {
// 如果 emp 不是 Person 类型
}

上面的例子中,如果 emp 是 null 的话,as 的例子就会抛异常,is 和 isn’t 的例子会返回 false.

赋值操作符

赋值操作符是 =。如果只想当被赋值的变量为空的时候才赋值,可以使用??=,例如:

  1. var a,b;
  2. a = 1; //使用 = 赋值
  3. b ??= 1; // 当 b 是空的话才赋值,否则不会赋值

= 还可以和其他操作符结合起来使用,例如:

+= -= *= /= ~/= %=
>>= <<= ^= &= ` =` ??=

这些组合起来的操作符,意思是先进行操作,然后在赋值,例如:

组合操作符 例子
+= a += b ; 就等效于 a = a + b;

逻辑运算符

下面是 Dart 支持的逻辑运算操作符:

操作符 含义 例子
!expr 反转表达式(将 false 改为 true,反之亦然) !(2 == 3);// 结果为 true
` ` 逻辑或 (2 == 2)
&& 逻辑与 (2 == 2)&& (3 == 3);// 结果为 true

按位与移位运算符

下面是 Dart 支持的按位与移位运算符:

操作符 含义 例子
& 按位与
对于每一个比特位,只有两个操作数相应的比特位都是1时,结果才为1,否则为0。
final value = 0x22;
final bitmask = 0x0f;
var result = value & bitmask;//结果为 0x02
` ` 按位或,对于每一个比特位,当两个操作数相应的比特位至少有一个1时,结果为1,否则为0。 final value = 0x22;
final bitmask = 0x0f;
var result = value
^ 按位异或,对于每一个比特位,当两个操作数相应的比特位有且只有一个1时,结果为1,否则为0。 final value = 0x22;
final bitmask = 0x0f;
var result = value ^ bitmask;//结果为 0x2d
~expr 按位非,反转操作数的比特位,即0变成1,1变成0。 final value = 0x22;
final bitmask = 0x0f;
var result = value & ~bitmask;//结果为 0x20
<< 左移 final value = 0x22;
final bitmask = 0x0f;
var result = value << 4;//结果为 0x220
>> 右移 final bitmask = 0x0f;
var result = value >> 4;//结果为 0x02

条件运算符

Dart 有两个运算符,可以让您使用更简单的表达式来代替可能需要 if-else 语句的表达式:

  1. condition ? expr1 : expr2
    如果 condition 是 true,返回 expr1,否则返回 expr2。
    当你需要根据一个 boolean 表达式来赋值时,可以使用 ? :,例如:
  1. var visibility = isPublic ? 'public' : 'private';
  1. expr1 ?? expr2
    如果 expr1 为 null,就返回 expr2 的值,否则返回 expr1 的值。
    如果需要根据一个 boolean 表达式是否为 null 来作为条件,可以使用 ??,例如:
  1. String playerName(String name) => name ?? 'Guest';

级联操作符

级联操作符是 .. 允许你对同一对象进行一系列的操作。除了函数调用,您还可以访问同一对象上的字段。这通常可以为您节省创建临时变量的步骤,并允许您编写更多流畅的代码。例如:

  1. querySelector('#confirm') // Get an object.
  2. ..text = 'Confirm' // Use its members.
  3. ..classes.add('important')
  4. ..onClick.listen((e) => window.alert('Confirmed!'));

querySelector() 返回一个 selector 对象,后面的 ..text..classes..onClick就是在 selector 对象上进行的。

其他操作符

还有其他的操作符:

操作符 含义 例子
() 函数调用 代表函数调用
[] 访问列表 引用列表中指定索引处的值
. 访问成员变量 访问表达式里的成员变量,例如 foo.bar,表示访问 foo 表达式里的 bar 成员变量
?. 有条件的成员变量访问 很像 .,但是左边的表达式可以为 null,例如 foo?.bar,如果 foo 为 null,则不会抛异常,而是返回 null,如果 foo 不为 null,则可以返回 bar


在说一下 Dart 里很好用但容易搞混的几个操作符:?.????=

  1. ?.

想要访问表达式的某个属性时,就可以使用这个,可以有效避免 NPE。
例如:

  1. var yourName = user?.name;

就等效于:

  1. var yourName;
  2. if(user == null){
  3. yourName = null;
  4. }else{
  5. yourName = user.name;
  6. }
  1. ??

在赋值时,可以使用 ??,若发现为空,可以为其赋默认值。 例如:

  1. var yourName = name ?? "Bob";

就是在为 yourName 赋值时,若 name 有值,就使用 name 的值,若 name 为空,则使用默认值 Bob,等效于:

  1. var yourName;
  2. if(name == null){
  3. yourName = "Bob";
  4. }else{
  5. yourName = name;
  6. }
  1. ??=

expr1 ??= expr2 等效于 expr1 = expr1 ?? expr2 就是判断 expr1 是否为null,如果为null的话,就使用默认值 expr2。 例如:

  1. user ??= User();

等效于:

  1. if(user == null) {
  2. user = User();
  3. }

参考

【1】Dart 中文网