Dart 运算符

Dart 运算符,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支持的常用算术运算符如下所示:
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还支持前缀和后缀递增和递减运算符,如下所示:
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

关系运算符

等式和关系运算符的含义如下:
Dart 运算符
有时需要判断两个对象是否相等,请使用==运算符。

下面是使用每个等式和关系运算符的示例:

assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);

类型测试操作符

as、is和 is! 操作符在运行时用于检查类型非常方便,含义如下所示:
Dart 运算符

如果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;

诸如+=之类的复合赋值运算符将操作与赋值相结合。以下是复合赋值运算符的工作方式:
Dart 运算符

逻辑运算符

可以使用逻辑运算符反转或组合布尔表达式,逻辑运算符如下所示:
Dart 运算符
示例代码如下:

        if (!expr && (test == 1 || test == 8)) {
          // ...TODO...
        }

位运算符

通常所说的位运算为 <<>> 移位运算,通过操作位的移动来达到运算的目的,而 &、|、^、~expr 也是操作位来达到运算的目的。具体含义如下所示:
Dart 运算符

示例代码如下:

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语法的一部分。

赞(0)

评论 抢沙发

评论前必须登录!