Dart基础学习02--变量及内置类型

Dart中的变量

首先看一个变量的定义和赋值

var name = 'Bob';

在Dart中变量名都是引用,这里的name就是一个指向值为Bob的字符串的引用。

默认值

在Dart中没有初始化的变量都有一个默认值null,哪怕是int型的变量它的初始值也是null,因为在Dart中int也是一个对象。

int lineCount;
assert(lineCount == null);
注意:这里引入一个Dart的重点知识,在Dart中任何可以放入变量中的都属于`对象`,而对象又都是`类`的一个实例。即使是数字,方法,null也都是对象,并且所有的对象都继承自`Object`这个类。

可选类型

在Dart中,可以选择使用静态类型来定义变量,如下:

String name = 'Bob';

这样做的好处有以下几点:

1.变量可以更好的表达你的意图。

2.编辑器或编译器可以通过变量的静态类型来检测代码中未知饿的错误。

final 和 const

如果一个变量不允许改变的话可以使用finalconst关键字来代替var或者其他静态类型。其中final类型的变量只能被赋值一次,而const类型的为编译时常量自然也无法改变其值。

一个用final定义的顶级变量或类成员变量只有在它第一次被使用的时候才会初始化。

final name = 'Bob'; // 也可以写作: final String name = 'Bob';
// name = 'Alice'; // 这一步会报错
注意:final的这种懒惰型初始化方法可以有效的提升程序运行速度。

如果你想要让你的变量是编译时常量的话就可以使用const关键字,但需要注意的是如果这个变量是一个类的成员变量的话就必须要使用static const。原因是如果没有声明一个类的对象事例的话,类的成员变量是不存在的,既然不存在自然就无法将其作为编译时常量了。更近一步说,只有在程序运行且声明了类的对象实例的情况下,其成员变量才是存在的。使用static修饰成员变量的话此变量就与对象实例无关了而可以直接通过类来获得。

const bar = 1000000;       // 压力单位 (dynes/cm2)
const atm = 1.01325 * bar; // 标准大气压

Dart的内置类型

Dart支持的内置数据类型有:数字,字符串,布尔,数组,集合等。

数字类型

Dart提供两种数字类型:

int

整型,范围在 -2^53 to 2^53.

double

64位双精度浮点类型,采用 IEEE 754标准。

int和double都是num的子类,num类型之间的基本操作有+,-,*,/和位操作<<,>>。另外num对象有abs(),ceil(),floor和一些其他的运算方法。如果以上这些方法还满足不了你的话,你可以使用Math库。

下面是一些整形变量的定义:

var x = 1;
var hex = 0xDEADBEEF;
var bigInt = 34653465834652437659238476592374958739845729;

下面是一下双精度型变量的定义:

var y = 1.1;
var exponents = 1.42e5;

你也可以使用下面这些方法将字符串转换为数字类型:

// String -> int
var one = int.parse('1');
assert(one == 1); // String -> double
var onePointOne = double.parse('1.1');
assert(onePointOne == 1.1); // int -> String
String oneAsString = 1.toString();
assert(oneAsString == '1'); // double -> String
String piAsString = 3.14159.toStringAsFixed(2);
assert(piAsString == '3.14');

int类型支持按位操作如<<,>>,&,|,看一下下面几个例子:

assert((3 << 1) == 6);  // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111

字符串类型

在Dart中字符串采用utf-16的编码格式。可以使用单引号'或双引号"来创建变量。

var s1 = 'Single quotes work well for string literals.';
var s2 = "Double quotes work just as well.";
var s3 = 'It\'s easy to escape the string delimiter.';
var s4 = "It's even easier to use the other delimiter.";

在Dart中可以使用${expression}作为作为字符串的插值,若expression 只是一个变量标识符的话可以省略{}。

var s = 'string interpolation';

assert('Dart has $s, which is very handy.' ==
'Dart has string interpolation, ' +
'which is very handy.');
assert('That deserves all caps. ' +
'${s.toUpperCase()} is very handy!' ==
'That deserves all caps. ' +
'STRING INTERPOLATION is very handy!');
注意:在Dart中用`==`来判断两个对象是都等效。两个字符串等效的条件是他们包含相同的字符串。

在Dart中可以将几个字符串靠在一起或使用+来连接它们:

var s1 = 'String ' 'concatenation'
" works even over line breaks.";
assert(s1 == 'String concatenation works even over '
'line breaks.'); var s2 = 'The + operator '
+ 'works, as well.';
assert(s2 == 'The + operator works, as well.');

另外还可以使用三个"来定义多行的字符串:

var s1 = '''
You can create
multi-line strings like this one.
'''; var s2 = """This is also a
multi-line string.""";

可以使用r来定义一些原生字符串(转义字符无效):

var s = r"In a raw string, even \n isn't special.";

布尔类型

在Dart中使用bool标识布尔类型。bool类型的只只有truefalse。值得注意的是在Dart中只有true会被当作是正确,而false或者其他数字,null等都会被当作false。

下面这段代码,在Dart中if条件是不成立的。应为name是一个对象。

var name = 'Bob';
if (name) {
// Prints in JavaScript, not in Dart.
print('You have a name!');
}

下面这段代码中的Dart会进入else段,而JavaScript则会进入if段:

if (1) {
print('JS prints this line.');
} else {
print('Dart in production mode prints this line.');
}

数组

在Dart中使用List来表示数组,这个是比较让我们不能接受的一个设计。不多说看具体怎么用吧:

var list = [1, 2, 3];
//List list = [1, 2, 3];
assert(list.length == 3);
assert(list[1] == 2);

在List中的单位也是从0开始的。

键值集合

在Dart中使用Map来表示键值类集合。其中的键值可以是任何对象且键不能重复。

下面看一下Map的具体用法:

var gifts = {
// Keys Values
'first' : 'partridge',
'second': 'turtledoves',
'fifth' : 'golden rings'
}; var nobleGases = {
// Keys Values
2 : 'helium',
10: 'neon',
18: 'argon',
};

同样可以使用构造方法来定义Map:

var gifts = new Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings'; var nobleGases = new Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';

往Map中添加新键值:

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds'; // Add a key-value pair

Map中检索键所对应的值:

var gifts = {'first': 'partridge'};
assert(gifts['first'] == 'partridge');
assert(gifts['second'] == null);

获得Map中键值对的个数:

var gifts = {'first': 'partridge'};
gifts['fourth'] = 'calling birds';
assert(gifts.length == 2);

从Map中移除键值对:

var nobleGases = {54: 'xenon'};

assert(nobleGases[54] == 'xenon');

// containsKey方法可以用于判断是否包含某个Key
assert(nobleGases.containsKey(54)); nobleGases.remove(54);
assert(!nobleGases.containsKey(54));

Map的更多用法可以参考Maps

所有Dart学习内容和相关源码都会在github上的DartNovel开源项目进行同步,欢迎关注。

Dart基础学习02--变量及内置类型的更多相关文章

  1. Dart基础学习03--方法的使用

    1.本文主要讲一下Dart中的方法是怎么定义的,下面先看一个简单的例子: void printNumber(num number) { print('The number is $number.'); ...

  2. Dart基础学习01--走近Dart

    什么是Dart 在Dart的官网上是这样介绍Dart的: Dart is an open-source, scalable programming language, with robust libr ...

  3. java基础学习02(简单的java程序)

    简单的java程序 一.完成的目标 1. 理解java程序的基本组成 2. 如何对程序代码进行注释 3. java标识符的命名规则 4. 了解java中的关键字 5. 使用java定义变量或声明变量 ...

  4. T-SQL 基础学习 02

    数据库设计 定义 数据库设计就是将数据库中的数据实体以及这些数据实体之间关系,进行规划和结构化的过程 在需求分析阶段,设计数据库的一般步骤 A. 收集相信 B. 标识实体 C. 标记每个实体需要存储的 ...

  5. Swift开发学习-02 变量和常量

    本教程是笔者在自学IOS/Swift知识的总结,适用于通过对Objictive C编程的运用,并需要了解基于iOS程序的iPhone和iPad的程序员.做一个有bigger的’攻城狮‘,有尊严的工作, ...

  6. python基础学习笔记第二天 内建方法(s t r)

    python的字符串内建函数 str.casefold()将字符串转换成小写,Unicode编码中凡是有对应的小写形式的,都会转换str.center()返回一个原字符串居中,并使用空格填充至长度 w ...

  7. c语言基础学习02

    =============================================================================涉及到的知识点有:include有两种用法.{ ...

  8. Python基础学习之变量赋值

    1.赋值操作符 Python语言中,等号(=)是主要的赋值操作符: >>> aInt=-100 >>> aString='this is a string' > ...

  9. ES6 - 基础学习(3): 变量的解构赋值

    解构赋值概述 1.解构赋值是对赋值运算符的扩展. 2.它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值. 3.代码书写上显得简洁且易读,语义更加清晰明了:而且还方便获取复杂对象中的数据字 ...

随机推荐

  1. join和countDownLatch原理及区别详解

    先上结论 原理 join 原理:在当前线程中调用另一个线程线程 thread 的 join() 方法时,会调用该 thread 的 wait() 方法,直到这个 thread 执行完毕(JVM在 ru ...

  2. 【原创】k8s源代码分析-----kubelet(8)pod管理

    本文QQ空间链接:http://user.qzone.qq.com/29185807/blog/1460540474 本文csdn博客链接:http://blog.csdn.net/screscent ...

  3. JavaScript正则表达式基础知识汇总

    一.创建正则对象: 1.构造函数RegExp创建正则对象 var pattern = new RegExp('s$'); //pattern匹配以s结尾的字符串 2.使用正则直接量 var patte ...

  4. MySQL监控脚本

    zabbix监控mysql时自定key用到的脚本 #!/usr/bin/env python #-*- coding: UTF-8 -*- from __future__ import print_f ...

  5. 【转载】 使用rman进行坏块修复(ORA-01578、ORA-01110)

    [转自]http://blog.itpub.net/21256317/viewspace-1062055/ 使用rman进行坏块修复(ORA-01578.ORA-01110) 2012年的一天,处理的 ...

  6. atitit.信息系统方案规划 p71.doc

    [信息系统方案规划 ] 版本 v2 2015-7-1 变更记录 日期 修改人 版本 变更事由 说明 2015.07 艾龙 1.0 初创 2015.07 艾龙 2.0 添加接口 1. 业务功能与流程设计 ...

  7. (2.1)Smali系列学习之基础语法

    一.什么是Smali?Smali,Baksmali分别是指安卓系统里的Java虚拟机(Dalvik)所使用的一种dex格式文件的汇编器,反汇编器.其语法是一种宽松式的Jasmin/dedexer语法, ...

  8. 记centos 安装 mysql5.7.23.tar.gz教程

    1.下载tar包,这里使用wget从官网下载 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.22-linux-glibc2. ...

  9. php调用C代码的实现方法

    在php程序中需要用到C代码,应该是下面两种情况: 1 已有C代码,在php程序中想直接用2 由于php的性能问题,需要用C来实现部分功能 针对第一种情况,最合适的方法是用system调用,把现有C代 ...

  10. springbatch操作DB

    一.需求分析 使用Spring Batch对DB进行读写操作: 从一个表中读取数据, 然后批量的插入另外一张表中. 二.代码实现 1. 代码结构图: 2. applicationContext.xml ...