打下坚实基础:学习 Dart 中的变量与操作符

3,197 阅读5分钟

介绍

Dart是什么?

Dart是一门新的编程语言,如同JAVA、PHP一样,是为了解决编写应用程序中的一些实际问题而被造轮子发明出来的,而这个造轮子的人就是 Google。可能大家都熟悉Google 的另一个轮子Golang,而对 Dart 听闻甚少,其实Dart 的出生跟Go很相近,只是由于它的星途比起Go来说有点坎坷,一直没有被广大开发者重视,相关的技术文章和应用比较匮乏,也就一直蒙尘在泛泛语言之中。

使用 Dart 可以做什么?

登录 Dart 的官网,你可以很清楚的看到 Dart 的创作者将 Dart 明确的分成了三个方向: 移动开发、DartVM 命令行程序(Server 端)、浏览器(前端)。

没基础不要紧张

对于没有基础的同学也不要紧张,咱也是最近开始学。学习过 JavaScript 或者 Java/Kotlin 的人,在学习 Dart 上几乎是没什么难度的,Dart 综合了动态语言和静态语言的特性,尽管Dart是强类型的,但类型声明是可选的,因为Dart可以推断类型

变量的声明

注意:未初始化的变量的初始值为 null,即使是数字类型的变量,最初也是 null,因为数字在Dart中都是对象。一切皆对象 null 也是对象 在线运行Dart代码

var name = "zhangsan";		// 隐式声明(变量的类型会自动推断)

// 通过指定类型的方式
String name = "zhangsan";	// 显示声明
Object  name = "zhangsan";	// 通用对象声明
dynamic name =  "zhangsan"; // 动态对象声明,这里dynamic和Object是等价的,二者钧可被赋值为其他类型的对象
final name = "zhangsan";  	// 不可变对象
...

修饰符 static final const

static

用于修饰成员变量,这个变量是属于类的,而不是属于对象的,除此之外没有其他别的含义了 static 修饰符的使用方式和 Java 类似。 static 变量直到运行期被使用时才会实例化

final

用于修饰变量,表示单赋值(single-assignment),使用 final 修饰的变量必须进行初始化,一旦被赋值之后,不能够再次被赋值,否则编译会报错

final name = "zhangsan";       // 正确
name = "lisi";   			   // 错误

const

Dart 中 const 是用来修饰某个值的

var list =  const [1,2,2,3,4];  	// 正确
var list = [1,2,3,4];            	// 正确(使用const赋值声明,const可省略) 

// const需要是编译时常量
const time = new DateTime.now();	//错误

finalconst 的共同点:

声明的类型可以省略 - 初始化后不能再赋值 - 不能和var一起使用

更多详情请查阅 官方文档

内置类型

Number 数值

intdoubleNumbers 的子类:

int testInt = 18; 		// int 整数值
double testDouble = 2.0 // 64-bit 双精度浮点数		

String 字符串

  1. Dart 字符串是UTF-16编码的字符序列,可以使用单引号或者双引号来创建字符串

  2. 可以使用三个单引号或者双引号创建多行字符串对象

  3. 可以使用 r 前缀创建 "原始raw" 字符串

  4. 可以在字符串中使用表达式: ${expression}, 如果表达式是一个标识符,可以省略 {},如果表达式的结果为一个对象,则 Dart 会调用对象的 toString() 函数来获取一个字符串

String testString1 = 'string 1';
String testString2 = "string 2";
String testString3 = '''
					String 1
					String 3 
					''';
String testString4 = r'String 4\n String 5';


class Expression{

  String getString() => 'getString';

  @override
  String toString() {
    return 'This is in getString class';
  }
}

void main() {
  var expression = new Expression();
  print(expression);
  print('String: ${expression.getString()}');   // getString
}

Boolean 布尔值

bool 这个类型有些特殊,在 Java 中未定义是 false,而在 Dart 里 bool 对象未初始化的默认是 null

bool status;   
print(status);  // null

List 列表(数组)

  1. Dart 中可以直接打印 List 包含 List 的元素,List 也是对象。Java 中直接打印 List 结果是地址值

  2. Dart 中 List 的下标索引和 Java 一样从0开始

  3. Java 一样支持泛型

    List<String> arrList;
    
  4. 有增删改查、支持倒序、自带排序、洗牌,可以使用 + 将 两个 List 合并

    List a = [1, 2, 3];
    List b = [4, 5, 6];
    List c = a + b;
    print(c);  // [1, 2, 3, 4, 5, 6];
    

Map 集合(字典)

Java 类似,映射是无序的键值对。常用的两种定义方式

var test = Map();
var test2 = {
    "a": "b",
    "c": "d"
};

Map 的 keyvalue 类型是可以指定的

var test3 = Map<int, String>();
test3[1] = "map 1";    // 正确
test3["2"] = "map 2";  // 错误,类型不正确

注意:key 必须是唯一的

Set 集合

Set 是没有顺序且不能重复的集合,所以不能通过索引去获取值

var test = Set();
test.add(1);
test.add(1);  // 重复元素无效

Runes 符号字符

Runes 是 UTF-32 编码的字符串。它可以通过文字转换成符号表情或者代表特定的文字

Runes runes = Runes('\u{1f605} \u6211');
var str = String.fromCharCodes(runes);  
print(str);  // 😅

Symbol 标识符

这个更不常用。Symbol 标识符,主要是反射用,现在 mirrors 模块已经被移除

类型转换与操作符

数值字符串 相互转换的方法

字符串转整数使用 int.parse()

String testString = '1234';
int testInt = int.parse(testString);

字符串转浮点数使用 double.parse()

String testString = 123.123; 
double testDouble = double.parse(testString);

数值转字符串使用 toString()

int testInt = 1234;
String testString = testInt.toString();

操作符

描述运算符
后缀操作expr++ expr-- () [] . ?.
前缀操作-expr !expr ~expr ++expr --expr
乘除* / % ~/
加减+ -
位移<< >>
按位与&
按位异或
按位或|
类型操作>= > <= < as is is!
想等== !=
逻辑与&&
逻辑或||
是否为空??
三目运算expr1 ? expr2 : expr3
级联..
赋值= *= /= ~/= %= += -= <<= >>= &= ^=

一些基本实例:

a++ 
a--
a + b 
a = b
c ? a : b
a is T    
    
if (n % i == 0 && d % i == 0)
if (n % i == 0 || d % i == 0)
    
2 + 3 == 5
2 - 3 == -1
2 * 3 == 6
5 / 2 == 2.5 // 结果是double类型
5 ~/ 2 == 2  // 结果是一个整数
5 % 2 == 1   // 余数

2 == 2   // true
2 != 3   // true
3 > 2    // true
2 < 3    // true
3 >= 3   // true
2 <= 3   // true

b ??= value	// 如果b为空,则将值分配给b;否则,b保持不变       
a *= 3	// 赋值且相乘 a = a * 3
   
.....