算术运算符
操作符 | 含义 | 例子 |
---|---|---|
+ |
加 | 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.
赋值操作符
赋值操作符是 =
。如果只想当被赋值的变量为空的时候才赋值,可以使用??=
,例如:
var a,b;
a = 1; //使用 = 赋值
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 语句的表达式:
condition ? expr1 : expr2
如果 condition 是 true,返回 expr1,否则返回 expr2。
当你需要根据一个 boolean 表达式来赋值时,可以使用? :
,例如:
var visibility = isPublic ? 'public' : 'private';
expr1 ?? expr2
如果 expr1 为 null,就返回 expr2 的值,否则返回 expr1 的值。
如果需要根据一个 boolean 表达式是否为 null 来作为条件,可以使用??
,例如:
String playerName(String name) => name ?? 'Guest';
级联操作符
级联操作符是 ..
允许你对同一对象进行一系列的操作。除了函数调用,您还可以访问同一对象上的字段。这通常可以为您节省创建临时变量的步骤,并允许您编写更多流畅的代码。例如:
querySelector('#confirm') // Get an object.
..text = 'Confirm' // Use its members.
..classes.add('important')
..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 里很好用但容易搞混的几个操作符:?.
、 ??
、??=
?.
想要访问表达式的某个属性时,就可以使用这个,可以有效避免 NPE。
例如:
var yourName = user?.name;
就等效于:
var yourName;
if(user == null){
yourName = null;
}else{
yourName = user.name;
}
??
在赋值时,可以使用 ??
,若发现为空,可以为其赋默认值。 例如:
var yourName = name ?? "Bob";
就是在为 yourName 赋值时,若 name 有值,就使用 name 的值,若 name 为空,则使用默认值 Bob,等效于:
var yourName;
if(name == null){
yourName = "Bob";
}else{
yourName = name;
}
??=
expr1 ??= expr2
等效于 expr1 = expr1 ?? expr2
就是判断 expr1 是否为null,如果为null的话,就使用默认值 expr2。 例如:
user ??= User();
等效于:
if(user == null) {
user = User();
}
参考
【1】Dart 中文网