掌握这些Dart语法-运算符,成为移动互联网开发者的必备技能

发表时间: 2018-12-01 15:47

欢迎关注『郝先生头条号』,第一时间获得最新文章

上篇文章移动互联网开发者,必须掌握这些Dart语法-数据类型中介绍了dart语法数据类型部分,这篇继续讲解dart语法运算符。

final和const

首先补充两个关键字final和const,定义变量时适当使用这两个关键字,可以让我们写出的程序更加健壮。

  • final

① 必须初始化,且不可修改

例:

final String a = "必须初始化,且不可修改";

final double b = 3.14;

final c = "必须初始化,且不可修改";

final d = 3.14;

② 如果定义为类变量,请使用static修饰

例:

static final String a = "必须初始化,且不可修改";

  • const

① 必须初始化,且不可修改,编译成常量

例:

const String a = "必须初始化,且不可修改,编译成常量";

const double b = 3.14;

const c = "必须初始化,且不可修改,编译成常量";

const d = 3.14;

② 如果定位为类常量,请使用static修饰

例:

static const double a = 3.14;

运算符(Operators)总览

Dart提供了非常全面的运算符,接下来我们认识一下开发中常用的一些运算符。

运算符拥有优先级,遵循一定的结合律,建议大家没有把握的情况下,要多使用括号"()"保证计算结果的正确性。

位操作符使用得当可以写出更加高效的程序,如果计算机基础不是太好的同学,去回顾一下计算机基础知识,理解计算机底层是如果处理数据,为什么说位操作符更加高效。参加过知名互联网公司面试的朋友,可能会碰到不使用加减乘除(+-*/)进行算数的题目,这类题目便是考察位操作的题目。

位移操作符中,大家要特别注意右移操作符,包括算数右移和逻辑右移,其中算数右移需要考虑符号位,而逻辑右移反之。

巧用条件运算符(?:)可以写成更加简洁的程序,且更加符合x86-64处理器汇编规则,大家可以编写一段使用条件运算符的C语言程序,然后使用GCC编译器汇编出汇编代码,一看究竟。

算术运算符(Arithmetic Operators)

  • 加减乘除

例:

int a = 2 + 8;

double b = 39.8 - 12.3;

int c = 2 * 5;

int d = 10 / 5;

  • 取整

例:

int a = 5 ~/ 2; // 结果:2

  • 取模

类似数学上的取余数

例:

int a = 5 % 2; // 结果:1

  • 自增/自减

例:

int a = 1;

a++; // 结果:2

a--; // 结果:1

比较运算符(Equality And Relational Operators)

特别注意的地方是,等号(==)运算符运用于两个引用类型的对象比较时,比较的是对象的值是否相等,如果要比较两个引用类型的地址是否相等时,需要使用identical()方法。

拓展知识:

  • javascript中使用双等号(==)进行宽泛比较是否相等,使用三等号(===)进行严格比较是否相等,比如:"2" == 2结果是true,而"2" === 2结果是false。
  • java中使用isEqual()等方法判断两个对象是否完全相等
  • Objective-C中使用isEqualToString()方法比较两个字符串是否相等。

类型判定运算符(Type Test Operators)

这类符号在面向对象编程语言中特别又有,因为我们常常使用里氏替换原则编写出十分灵活的代码。在实际使用对象时,判断对象的类型,然后进一步使用,可以帮助我们减少程序崩溃的问题。

  • as

如果我们十分确定一个对象是某种类型时,我们可以使用as将该对象转换为真正的类型。通常可以这样做:

例:

(a as AClass).name = "abc";

但是假如a不是AClass类型,或者为空(null),那么很有可能上述代码会抛出异常,所以在不确定a的类型的情况下,还是建议使用下面的写法。

if (a is AClass) {

a.name = "abc";

}

赋值运算符(Assignment Operators)

  • 赋值(=)

右侧值赋值给左侧变量

例:

int a = 32;

String b = "赋值";

  • 判空赋值(??=)

这个运算符在其他语言中比较少见,也就是如果左侧变量为空(null)时,才将右侧的值赋值给左侧变量

例:

int a = null;

a ??= 8; // 结果:8。即如果a是空(null),将8赋值给a;如果a非空,那么a保持原来的值

a ?? = 30; // 结果:还是8

  • 复合运算符(+=、*=等)

例:int a = 2;

a += 1 // 结果:3。相当于 a = a + 1;

逻辑运算符(Logic Operators)

  • 或(||)运算符、与(&&)运算符

① 常常使用它们的“短路特性”做条件过滤,即第一个条件(a)满足时,将不进行第二个条件(b)的判断

例:

if (a || b) {

// 如果a和b有一个为true,就会进入该语句

}

if (a && b) {

// 如果a和b都为true,才会进入该语句

}

② if语句中常常使用!a代替a == false

例:

if (a == false) {}

if (!a) {}

位运算符(Bitwise And Shift Operators)

  • 按位与(&)
  • 按位或(|)
  • 按位异或(^)
  • 按位取反(~)
  • 左移位(<<)
  • 右移位(>>)

尽管日常编程中不太常用位操作,但是在底层开发、框架编写者或者汇编语言中,将经常接触它。对于追求进步的我们,可以花费一些时间复习一下二进制进制转换和位操作相关知识。

条件表达式(Conditional Expressions)

对于比较简单的条件语句,我们经常采用这种方式书写,因为更加简洁高效。

  • condition ? expression1 : expression2

如果condition为true,那么执行expression1,否则执行expression2

例:

bool a = true;

int b = a ? 1 : 2; // 结果:b = 1

  • expression1 ?? expression2

如果expression1非空(non-null),返回expression1的值,否则执行expression2并返回该值

例:

String a = "abc";

String b = a ?? "默认值"; // 结果:b = "默认值"

级联运算符(Cascade Notation(..))

可以在同一个对象上连续调用函数或访问成员变量。

例:

Person p = new Person();

p.name = "郝先生";

p.age = 18;

p.gender = "Mr."

使用级联方式:

p.name = "郝先生"

..age = 18

..gender = "Mr.";

其他运算符

  • 访问列表元素符([])

例:

List a = ["First", "Second", "Third"];

a[1]; // 结果:"Second"

  • 访问成员变量符(.)

例:

Person p = new Person();

p.name; // 获取成员变量name的值

  • 访问非空成员变量(?.)

符号左侧的操作对象不为空(null)时,才能返回成员变量的值。

例:

Person p = new Person();

p?.name; // 如果p为空(null)时,返回null,否则返回name

  • 拓展

swift中也有类似访问非空成员变量的语法,那里称为可选类型(optional),使用时需要拆箱操作,通常可以使用guard语法访问变量,这机制符合了苹果公司官方宣称的swift是一门安全语言的理念。

结语

各种编程语言运算符类似,只是语法上的稍微差异,dart编程语言增加了一些便于使用的小小特性,大家可以对比着练习一下,相信很快就能掌握。

下篇预告

移动互联网开发者,必须掌握这些Dart语法-流程控制(Control Flow Statements)

欢迎转发,欢迎收藏,欢迎关注『郝先生谈技术』