目录
算数运算符
关系运算符
类型测试运算符
位运算符
逻辑运算符
赋值运算符
其他的运算符
Dart2的运算符其实跟Java很像,我们简单梳理一下即可。
算数运算符有:+(加)、-(减)、*(乘)、/(除)、~/(除,但结果返回整数)、-expr(负号)以及%(取余)。
另外,还有一元运算符 ++ 和 --,这个在许多语言中都有,定义也是一样。
下面是一些例子。
print(1 + 1); // 2
print(2 - 1); // 1
print(2 * 10); // 20
print(14 / 5); // 2.8
print(14 ~/ 5); // 2
print(-(1 + 1)); // -2
print(14 % 5); // 4
var v = 2;
print(v ++); // 2 var++表达式,先返回值,再进行加1运算
print(++ v); // 4 ++var表达式,先进行加1运算,再返回值
print(v--); // 4 var--表达式,先返回值,再进行减1运算
print(--v); // 2 --var表达式,先进行减1运算,再返回值
关系运算符有:==(等于)、!=(不等于)、>(大于)、<(小于)、>=(大于等于)和<=(小于等于)。
print(1 == 1); // true
print(1 != 1); // false
print(2 > 1); // true
print(2 < 1); // false
print(2 >= 1); // true
print(2 <= 1); // false
// == 和 != 不仅仅可以做数值的比较,也可以做对象的比较
// 而且==和!= 都可以进行运算符的重写,过于重写,本章不做讨论
print(null == null); // true
print(null != null); // false
print("a" == "a"); // true
类型测试运算符有:is(判断是否某一类)、is!(判断是否不是某一类)和as(将对象作为某一类运行)。
var testInt = 123;
print(testInt is String); // false
print(testInt is! String); // true
print(testInt is num); // true int是num的子类
print(testInt is int);// true
// as 只能用于子类和父类之间转换使用
print((testInt as num) is num); // true。将testInt作为num运行
print((testInt as double) is double); // 报错。double不是int的子类型
位运算符有:&(按位与)、|(按位或)、^(按位异或)、~(按位取反)、<<(按位左移)和>>(按位右移)。
// 我们直接将官网的实例拿了过来
final value = 0x22;
final bitmask = 0x0f;
print((value & bitmask) == 0x02); // true, AND
print((value & ~bitmask) == 0x20); //true, AND NOT
print((value | bitmask) == 0x2f); //true, OR
print((value ^ bitmask) == 0x2d); //true, XOR
print((value << 4) == 0x220); // true, Shift left
print((value >> 4) == 0x02); // true, Shift right
逻辑运算符有:&&(与)、||(或)、!(非)。
var a = 12;
print(a > 10 && a < 11); // false
print(a > 10 || a < 11); // true
print(!(a > 10)); // false
赋值运算符有:=(赋值)。
另外还有与其他的运算符,组合成运算符,比如 +=(加等),a += 1 相当于 a = a+1。
var a = 1;
print(a += 1); // 2
print( a -= 1); // 1
?? (是否为空)、expr? val1:val2(三元运算符)、..(级联运算符)、.(成员访问)、?.(有条件的成员访问)、()(函数调用)、[](列表索引的值)
var nullVar;
var intVar = 12;
// 如果 nullVar是空,则赋值intVar
nullVar ??= intVar;
print(nullVar); // 12
// 如果intVar大于10则返回a否则返回b
var strVar = intVar > 10 ? "a": "b";
print(strVar); // a
// .. 允许你在同一个对象上连续进行操作
var listVar = [1, 2, 3, 4];
listVar.toSet() // 返回一个set对象
..add(5) // 继续操作上一个set对象
..add(1); // 继续操作上一个set对象
// 相当于
var setVar = listVar.toSet();
setVar.add(5);
setVar.add(1);
// ?. 允许左侧的对象为空
var mapVar;
print(mapVar?.length); // null
print(mapVar.length); // 报错,mapVar是空
print(setVar?.length); // 5