Dart汇总请点击这里
操作符
Dart 定义的运算符。
Description | Operator |
---|---|
unary postfix | expr++ expr-- () [] . ?. |
unary prefix | -expr !expr ~expr ++expr --expr |
multiplicative | * / % ~/ |
additive | + - |
shift | << >> >>> |
bitwise AND | & |
bitwise XOR | ^ |
bitwise OR | |
relational and type test | >= > <= < as is is! |
equality | == != |
logical AND | && |
logical OR | |
if null | ?? |
conditional | expr1 ? expr2 : expr3 |
cascade | … |
assignment | = *= /= += -= &= ^= etc. |
创建表达式的时候会用到运算符。 下面是一些运算符表达式的实例:
a++
a + b
a = b
a == b
c ? a : b
a is T
在 运算符表
中, 每一行的运算符优先级,由上到下依次排列,第一行优先级最高,最后一行优先级最低。 例如 %
运算符优先级高于==
, 而`` == 高于&&
。 根据优先级规则,那么意味着以下两行代码执行的方式相同:
// 括号可以提高可读性。
if ((n % i == 0) && (d % i == 0)) ...
// 可读性差,但是是等效的。
if (n % i == 0 && d % i == 0) ...
警告: 对于有两个操作数的运算符,运算符的功能由左边的操作数决定。 例如, 如果有两个操作数 Vector 和 Point, aVector + aPoint 使用的是 Vector 中定义的 + 运算符。
算术运算符
Dart 支持常用的运算运算符,如下表所示:
Operator | Meaning |
---|---|
+ | Add |
– | Subtract |
-expr | Unary minus, also known as negation (reverse the sign of the expression) |
* | Multiply |
/ | Divide |
~/ | Divide, returning an integer result |
% | Get the remainder of an integer division (modulo) |
示例:
assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // 结果是双浮点型
assert(5 ~/ 2 == 2); // 结果是整型
assert(5 % 2 == 1); // 余数
assert('5/2 = ${5 ~/ 2} r ${5 % 2}' == '5/2 = 2 r 1');
Dart 还支持前缀和后缀,自增和自减运算符。
Operator | Meaning |
---|---|
++var | var = var + 1 (expression value is var + 1) |
var++ | var = var + 1 (expression value is var) |
- -var | var = var – 1 (expression value is var – 1) |
var- - | var = var – 1 (expression value is var) |
示例:
var a, b;
a = 0;
b = ++a; // a自加后赋值给b。
assert(a == b); // 1 == 1
a = 0;
b = a++; // a先赋值给b后,a自加。
assert(a != b); // 1 != 0
a = 0;
b = --a; // a自减后赋值给b。
assert(a == b); // -1 == -1
a = 0;
b = a--; // a先赋值给b后,a自减。
assert(a != b); // -1 != 0
关系运算符
下表列出了关系运算符及含义:
Operator | Meaning |
---|---|
== | Equal; see discussion below |
!= | Not equal |
> | Greater than |
< | Less than |
>= | Greater than or equal to |
<= | Less than or equal to |
要测试两个对象x和y是否表示相同的事物, 使用 ==
运算符。 (在极少数情况下, 要确定两个对象是否完全相同,需要使用 identical()
函数。) 下面给出 ==
运算符的工作原理:
-
如果 x 或 y 可以 null,都为 null 时返回 true ,其中一个为 null 时返回 false。
-
结果为函数 x.==(y) 的返回值。 (如上所见, == 运算符执行的是第一个运算符的函数。 我们甚至可以重写很多运算符,包括 ==, 运算符的重写,参考 重写运算符。)
这里列出了每种关系运算符的示例:
assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);
类型判定运算符
as
,is
, 和 is!
运算符用于在运行时处理类型检查:
Operator | Meaning |
---|---|
as | Typecast (也被用于指定库前缀) |
is | True if the object has the specified type |
is! | False if the object has the specified type |
例如, obj is Object
总是true
。 但是只有 obj
实现了 T
的接口时,obj is T
才是true
。
使用 as
运算符将对象强制转换为特定类型。 通常,可以认为是 is
类型判定后,被判定对象调用函数的一种缩写形式。 请考虑以下代码:
if (emp is Person) {
// Type check
emp.firstName = 'Bob';
}
使用 as 运算符进行缩写:
(emp as Person).firstName = 'Bob';
提示: 以上代码并不是等价的。 如果 emp 为 null 或者不是 Person 对象, 那么第一个 is 的示例,后面将不会执行; 第二个 as 的示例会抛出异常。
赋值运算符
使用 =
为变量赋值。 使用 ??=
运算符时,只有当被赋值的变量为 null 时才会赋值给它。
// 将值赋值给变量a
a = value;
// 如果b为空时,将变量赋值给b,否则,b的值保持不变。
b ??= value;
复合赋值运算符(如 += )将算术运算符和赋值运算符组合在了一起。
= | –= | /= | %= | >>= | ^= |
---|---|---|---|---|---|
+= | *= | ~/= | <<= | &= | I= |
以下说明复合赋值运算符的作用:
~ | Compound assignment | Equivalent expression |
---|---|---|
For an operator op: | a op= b | a = a op b |
Example: | a += b | a = a + b |
以下示例使用赋值和复合赋值运算符:
var a = 2; // 使用 = 赋值
a *= 3; // 赋值并做乘法运算: a = a * 3
assert(a == 6);
逻辑运算符
逻辑操作符可以反转或组合布尔表达式。
Operator | Meaning |
---|---|
!expr | inverts the following expression (changes false to true, and vice versa) |
II | logical OR |
&& | logical AND |
下面是关于逻辑表达式的示例:
if (!done && (col == 0 || col == 3)) {
// ...Do something...
}
按位和移位运算符
在 Dart 中,可以单独操作数字的某一位。 通常情况下整数类型使用按位和移位运算符来操作。
Operator | Meaning |
---|---|
& | AND |
I | OR |
^ | XOR |
~expr | Unary bitwise complement (0s become 1s; 1s become 0s) |
<< | Shift left |
>> | Shift right |
下面是关于按位和移位运算符的示例:
final value = 0x22;
final bitmask = 0x0f;
assert((value & bitmask) == 0x02); // AND
assert((value & ~bitmask) == 0x20); // AND NOT
assert((value | bitmask) == 0x2f); // OR
assert((value ^ bitmask) == 0x2d); // XOR
assert((value << 4) == 0x220); // Shift left
assert((value >> 4) == 0x02); // Shift right
条件表达式
Dart有两个运算符,有时可以替换if-else
表达式, 让表达式更简洁:
condition ? expr1 : expr2
如果条件为 true, 执行 expr1 (并返回它的值): 否则, 执行并返回 expr2 的值。
expr1 ?? expr2
如果 expr1 是 non-null, 返回 expr1 的值; 否则, 执行并返回 expr2 的值。
如果赋值是根据布尔值, 考虑使用 ?:。
var visibility = isPublic ? 'public' : 'private';
如果赋值是基于判定是否为 null, 考虑使用 ??。
String playerName(String name) => name ?? 'Guest';
下面给出了其他两种实现方式, 但并不简洁:
// Slightly longer version uses ?: operator.
String playerName(String name) => name != null ? name : 'Guest';
// Very long version uses if-else statement.
String playerName(String name) {
if (name != null) {
return name;
} else {
return 'Guest';
}
}
级联运算符 (…)
级联运算符 (…) 可以实现对同一个对像进行一系列的操作。 除了调用函数, 还可以访问同一对象上的字段属性。 这通常可以节省创建临时变量的步骤, 同时编写出更流畅的代码。
考虑一下代码:
querySelector('#confirm') // 获取对象。
..text = 'Confirm' // 调用成员变量。
..classes.add('important')
..onClick.listen((e) => window.alert('Confirmed!'));
第一句调用函数 querySelector() , 返回获取到的对象。 获取的对象依次执行级联运算符后面的代码, 代码执行后的返回值会被忽略。
上面的代码等价于:
var button = querySelector('#confirm');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));
级联运算符可以嵌套,例如:
final addressBook = (AddressBookBuilder()
..name = 'jenny'
..email = 'jenny@example.com'
..phone = (PhoneNumberBuilder()
..number = '415-555-0100'
..label = 'home')
.build())
.build();
在返回对象的函数中谨慎使用级联操作符。 例如,下面的代码是错误的:
var sb = StringBuffer();
sb.write('foo')
..write('bar'); // Error: 'void' 没哟定义 'write' 函数。
sb.write() 函数调用返回 void, 不能在 void 对象上创建级联操作。
提示: 严格的来讲, “两个点” 的级联语法不是一个运算符。 它只是一个 Dart 的特殊语法。
其他运算符
大多数剩余的运算符,已在示例中使用过:
Operator | Name | Meaning |
---|---|---|
() | Function application | Represents a function call |
[] | List access | Refers to the value at the specified index in the list |
. | Member access | Refers to a property of an expression; example: foo.bar selects property bar from expression foo |
?. | Conditional member access | Like ., but the leftmost operand can be null; example: foo?.bar selects property bar from expression foo unless foo is null (in which case the value of foo?.bar is null) |