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 | 如果对象是指定类型则返回 true | employee is Person |
| is! | 如果对象是指定类型则返回 false | employee 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.
}
}
复制代码
往期精彩推荐
如果读者觉得文章还可以,不防一键三连:关注➕点赞➕收藏
分类:
标签:
文章被收录于专栏:
flutter
Flutter 相关的文章
关注专栏
多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享,你想要的,这里都有!
评论
相关推荐
-
4年前
- **8888
- **48
- **2
-
3年前
Flutter第1天--初始分析+Dart方言+Canvas简绘
- **2.1w
- **168
- **21
-
4年前
我看完掘金上的227篇文章,总结出一份 Flutter 入门教程
- **3.3w
- **1447
- **47
-
3年前
- **9355
- **181
- **7
-
3年前
Flutter 知识梳理 (Dart) - Dart 中 static, final, const 区别
- **1.5w
- **39
- **2
-
4年前
- **1.0w
- **185
- **7
-
4年前
Flutter KO React Native? 让时间去决定吧...
- **2.3w
- **67
- **27
-
3年前
- **1.7w
- **68
- **23
-
9月前
Flutter PlatformView 在闲鱼直播业务中的实践
- **1.3w
- **21
- **1
-
4年前
从0开始写一个基于Flutter的开源中国客户端(2)——Dart语法基础
- **9996
- **151
- **11
-
4年前
[译] 为 JavaScript 程序员准备的 Flutter 指南
- **1.3w
- **88
- **6
-
4年前
Flutter代码模板,解放双手,提高开发效率必备| 掘金技术征文
- **1.2w
- **211
- **20
-
4年前
Flutter完整开发实战详解(一、Dart语言和Flutter基础) | 掘金技术征文
- **13.3w
- **1593
- **140
-
4年前
[译] Flutter,什么是 Widgets、RenderObjects 和 Elements?
- **4021
- **23
- **5
-
3年前
- **1.6w
- **73
- **16
-
3年前
Flutter: PageView/TabBarView等控件保存状态的问题解决方案
- **1.6w
- **44
- **14
-
4年前
- **8919
- **24
- **评论
-
2月前
- **9041
- **6
- **评论
-
3年前
- **3.0w
- **430
- **16
-
7月前
- **1.3w
- **32
- **8
相关文章
目录
下一篇
稀土掘金浏览器插件——你的一站式工作台
多内容聚合浏览、多引擎快捷搜索、多工具便捷提效、多模式随心畅享,你想要的,这里都有。
\