Dart -运算符

122 阅读14分钟

Dart 知识点 - 运算符

上一篇,我们讲了 Dart 知识点 - 数据类型,本文我们来讲讲 Dart 知识点 - 运算符。 运算符是一个很基础但是很重要的知识点~

算术运算符

运算符描述示例
+int a += 1; // 等价于 int a = a + 1; 下面雷同
-int a -=1;
-表达式一元减号码(或者说负号),使表达式后面的值翻过来int a = 1; a = -a;
*int a *= 2;
/int a /= 2
~/除并取整int a ~/= 2
%取模int a %= 2
var++自增int a = 1; int b = a++; // b 值为 1
++var自增int a = 1; int b = ++a; // b 值为 2
var--自减int a = 1; int b = a--; // b 值为 1
--var自减int a = 1; int b = --a; // b 值为 0
int a = 11;
print(a / 2); // 5.5
print(a ~/ 2); // 5
print(a % 2);  // 1
复制代码

思考下🤔 自增自减的结果为什么会不同呢?

答案(点击展开)

关系运算符

假设变量 a 和 变量 b 都为 int 类型。

运算符描述示例
==相等a == b,返回布尔值
!=不等于a != b,返回布尔值
大于a > b,返回布尔值
<小于a < b,返回布尔值
>=大于等于a >= b,返回布尔值
<=小于等于a <= b,返回布尔值

嗯,这没什么好进行代码展示的,很中规中矩的内容

类型判断运算符

运算符描述示例
as类型转换employee as Person,Person 是一个类
is如果对象是指定类型则返回 trueemployee is Person
is!如果对象是指定类型则返回 falseemployee is! Person
void main() {
  var jimmy = Person();
  var animal = Animal();
  print(jimmy.name); // Jimmy
  print(jimmy is Person); // true
  print(jimmy is! Animal); // true
  print(jimmy as Person); // Instance of 'Person'
  print(jimmy as Animal); // 报错:Uncaught Error: TypeError: Instance of 'Person': type 'Person' is not a subtype of type 'Animal'
}

class Person {
  String name = 'Jimmy';
}
class Animal {
  final String name = 'Lion';
}
复制代码

obj is Object 总为 true,因为所有类都是 Object 的子类

使用 as 运算符将对象强制转换为特定的类型,通常可以认为是 is 或 is! 类型判定后,被判定对象调用函数的一种缩写形式。比如上面的代码 jimmy as Person 改写如下:

if(jimmy is Person) {
  jimmy.name = 'Jimmy Pang';
}
// 使用 as 运算符进行缩写
(jimmy as Person).name = 'Jimmy Pang';
复制代码

上面的代码并非等价。如果 jimmy 为 null 或者不是 Person 对象,jimmy.name = 'Jimmy Pang'; 将不会执行,而 (jimmy as Person).name = 'Jimmy Pang'; 就会跑出异常(见上 print(jimmy as Animal); 部分)

赋值运算符

上面我们已经接触过了 =+= 等。也就是赋值运算符的两种方式:

  • 使用 = 来赋值
  • 使用 ??= 来赋值(??表示其他运算符),称为复合运算符

简单举例:

运算符描述示例
/=除后赋值a /= 2;,等价于 a = a / 2;

逻辑运算符

使用逻辑运算符我们可以反转或者组合布尔表达式。

运算符描述示例
!对表达式结果取反,结果是布尔值bool flag = false; if(!flag){} else {}
¦¦逻辑或a ¦¦ b
&&逻辑与a && b && c
bool a = false;
bool b = true;
var c = a || b;
print(c); // true
var d = !a && b;
print(d); // true
复制代码

位运算符

假设我们有两个 int 类型的变量:

int a = 1;
int b = 2;
复制代码
运算符描述示例
&按位与a & b,结果是 0
¦按位或a ¦ b,结果是 3
^按位异或a ^ b,结果是 3
~按位取反(0 变 1, 1 变 0)~a,结果是 4294967294
<<位左移a << 1,结果是 2
>>位右移b >> 1,结果是 1

嗯,也许你还不是很理解,我们拿 ~a 举个例子吧,它的结果是 4294967294?我们先来思考下🤔

答案(点击展开)

条件表达式

Dart 中有两个特殊的运算符来代替 if-else 语句:

  • 条件 ? 表达式1 : 表达式2 (三目运算符)
  • 表达式1 ?? 表达式2
// 根据布尔值进行判断
var visibility;
bool isPublic = true;
if(isPublic) {
  visibility = 'public';
} else {
  visibility = 'private';
}
// 等价为
var visibility = isPublic ? 'public' : 'private';
复制代码
// 如果赋值判定是否为 `null` 则考虑使用 `??`
String playerName(String? name) {
  if(name != null) {
    return name;
  } else {
    return 'Guest';
  }
}
// 其实我们可以这么写
String playerName(String? name) => name ?? 'Guest';
复制代码

级联运算符

级联运算符目前有两个:

  • ..
  • ?.. 如果对象为空情况,但是 ?.. 要第一个开始调用(这个有点尴尬,读者自行验证)

If the object that the cascade operates on can be null, then use a null-shorting cascade (?..) for the first operation. Starting with ?.. guarantees that none of the cascade operations are attempted on that null object.

可以让我们在同一个对象上连续调用该对象的多个变量或者方法。

void main() {
  var person = Person()
    ?..country = 'China'
    ..sayHi();
}

class Person {
  final String name = 'Jimmy';
  String country = '';
  sayHi() {
    print('Hello ' +  this.name + '.'); // Hello Jimmy.
  }
}
复制代码

往期精彩推荐

如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏

分类:

iOS

标签:

iOSFlutterDart

文章被收录于专栏:

cover

flutter

Flutter 相关的文章

关注专栏

安装掘金浏览器插件

多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享,你想要的,这里都有!

前往安装

评论

相关推荐

下载稀土掘金APP

一个帮助开发者成长的社区

相关文章

纯 CSS 实现十个还不错的 Loading 效果

101点赞

 

 · 

 

12评论

JavaScript 事件循环机制

66点赞

 

 · 

 

15评论

10个JS优化小技巧

250点赞

 

 · 

 

49评论

前端仔学学设计模式--单例模式

23点赞

 

 · 

 

6评论

10 个不错的 CSS 小技巧

794点赞

 

 · 

 

68评论

目录

下一篇


Dart 知识点 - 数据类型

稀土掘金浏览器插件——你的一站式工作台

多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享,你想要的,这里都有。

\