Dart 运算符,Dart支持各种类型的运算符,并且其中的一些操作符还能进行重载。完整的操作符如表所示。
使用运算符时可以创建表达式,以下是运算符表达式的一些示例:
a++
a--
a + b
a = b
a == b
expr ? a : b
a is T
在表中,操作符的优先级由上到下逐个减小,上面行内的操作符优先级高于下面行内的操作符。例如,“乘法类型”操作符%的优先级比“等价”操作符==
要高,而==
操作符的优先级又比“逻辑与”操作符&&
要高。
注意使用运算符时的顺序,方法如下所示:
// 1.使用括号来提高可读性
if ((n % i == 0) && (d % i == 0))
// 2.难以阅读,但是和上面等价
if (n % i == 0 && d % i == 0)
提示 对于二元运算符,其左边的操作数将会决定使用的操作符的种类。例如,当使用一个Vector对象以及一个Point对象时,aVector + aPoint使用的+是由Vector定义的。
算术运算符
Dart支持的常用算术运算符如下所示:
示例代码如下:
assert(3 + 6 == 9);
assert(3-6 == -3);
assert(3 * 6 == 18);
assert(7 / 2 == 3.5); //结果是浮点型
assert(5~/ 2 == 2); //结果是整型
assert(5 % 2 == 1); //求余数
Dart还支持前缀和后缀递增和递减运算符,如下所示:
示例代码如下:
var a, b;
a = 0;
b = ++a; //在b获得其值之前自增a
assert(a == b); //1 == 1
a = 0;
b = a++; //在b获得值后自增a
assert(a != b); //1 != 0
a = 0;
b = --a; //在b获得其值之前自减a
assert(a == b); //-1 == -1
a = 0;
b = a--; //在b获得值后自减a
assert(a != b); //-1 != 0
关系运算符
等式和关系运算符的含义如下:
有时需要判断两个对象是否相等,请使用==运算符。
下面是使用每个等式和关系运算符的示例:
assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);
类型测试操作符
as、is和 is!
操作符在运行时用于检查类型非常方便,含义如下所示:
如果obj实现了T所定义的接口,那么obj is T将返回true。
使用as操作符可以把一个对象转换为指定类型,前提是能够转换。转换之前用is判断一下更稳妥。如下所示:
if (user is User) {
// 类型检测
user.name = 'Flutter';
}
如果能确定user是User的实例,则可以通过as直接简化代码:
(user as User).name = 'Flutter';
注意 上面两段代码并不相等。如果user的值为null或者不是一个User对象,第一段代码不会做任何事情,第二段代码会报错。
赋值操作符
可以使用=运算符赋值。要仅在变量为null时赋值,请使用??=
运算符。如下面代码所示:
// 赋值给a
a = value;
// 如果b为空,则将值分配给b;否则,b保持不变
b ??= value;
诸如+=之类的复合赋值运算符将操作与赋值相结合。以下是复合赋值运算符的工作方式:
逻辑运算符
可以使用逻辑运算符反转或组合布尔表达式,逻辑运算符如下所示:
示例代码如下:
if (!expr && (test == 1 || test == 8)) {
// ...TODO...
}
位运算符
通常所说的位运算为 <<
或 >>
移位运算,通过操作位的移动来达到运算的目的,而 &、|、^、~expr
也是操作位来达到运算的目的。具体含义如下所示:
示例代码如下:
final value = 0x22;
final bitmask = 0x0f;
assert((value & bitmask) == 0x02); //与
assert((value & ~bitmask) == 0x20); //与非
assert((value | bitmask) == 0x2f); //或
assert((value ^ bitmask) == 0x2d); //异或
assert((value << 4) == 0x220); //左移
assert((value >> 4) == 0x02); //右移
条件表达式
Dart有两个运算符,可用来简明地评估可能需要if-else
语句的表达式。如下代码即为一种条件表达式,也可以称为三元表达式。如果条件为真,则返回expr1,否则返回expr2:
condition ? expr1 : expr2
第二种如下所示,如果expr1为非空,则返回其值;否则,计算并返回expr2的值:
expr1 ?? expr2
级联操作
级联操作用两个点(..)表示,可对同一对象执行一系列操作。类似于JavaScript里Promise的then处理。级联操作的主要目的是简化代码,示例如下:
querySelector('#btnOK) //获取一个id为btnOK的按钮对象
..text = '确定' //使用它的成员
..classes.add('ButtonOKStyle')
..onClick.listen((e) => window.alert('确定'));
第一个方法调用querySelector
,返回一个按钮对象,然后再设置它的文本为“确定”,再给这个按钮添加一个样式'ButtonOKStyle'
,最后监听单击事件,事件弹出一个显示“确定”的警告。这个例子相当于如下操作:
var button = querySelector('#btnOK);
button.text = '确定';
button.classes.add(ButtonOKStyle');
button.onClick.listen((e) => window.alert('确定'));
注意 严格来说,级联的“双点”符号不是运算符,只是Dart语法的一部分。
评论前必须登录!
注册