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. ubuntu安装Skype 4.3

    Install Skype 4.3 Step 1: Remove previous version sudo apt-get remove skype skype-bin:i386 skype:i38 ...

  2. C# Oracle.ManagedDataAccess 批量更新表数据

    这是我第一次发表博客.以前经常到博客园查找相关技术和代码,今天在写一段小程序时出现了问题, 但在网上没能找到理想的解决方法.故注册了博客园,想与新手分享(因为本人也不是什么高手). vb.net和C# ...

  3. mac ssh 命令

    https://www.cnblogs.com/littleBit/p/5362806.html 1.终端命令 1.打开Mac的命令终端,检查是不是用root登陆,如果不是的话,就输入命令:sudo ...

  4. 如何在mysql下实现事务的提交与回滚

    最近要对数据库的数据进行一个定时迁移,为了防止在执行过程sql语句因为某些原因报错而导致数据转移混乱,因此要对我们的脚本加以事务进行控制. 首先我们建一张tran_test表 CREATE TABLE ...

  5. linux 从百度网盘下载文件的方法

    linux 从百度网盘下载文件的方法 发表于2015 年 月 日由shenwang 方法1.wget wget是在Linux下开发的开放源代码的软件,作者是Hrvoje Niksic,后来被移植到包括 ...

  6. 天猫 小游戏 24 point

    游戏规则:给你四个整数,当然他给的是有解的,然后用' +  -  *   /   (  )   ,这几种符号任意组合,使运算结果等于24; 用代码快速解决问题,呵呵... #include<io ...

  7. 【Objective-C】05-第一个OC的类

    OC是一门面向对象的语言,因此它也有类.对象.静态\动态方法.成员变量的概念.这讲就来创建第一个OC的类. 一.语法简介 1.类 在Java中,我们用1个.java文件就可以描述清楚一个类:在OC中, ...

  8. powershell文件权限操作

    获取文件或文件夹访问权限: Get-Acl -Path <File or Folder Path> | Format-List 修改文件访问权限: 修改文件访问权限需要用到Set-Acl命 ...

  9. 由于没有发现潜在的递归导致MySQL链接数溢出:MySQLNonTransientConnectionException: Data source rejected establishment of connection, message from server: "Too many connec

    DAOProxy的代码:下面代码中红色高亮的就是出问题的地方,DAOFactory中会构造一个PersonDAOProxy,调用listPersons或者addPerson显然会导致递归,从而导致My ...

  10. eclipse配置代码自动补全auto-completion

    你如果使用的是JAVA EE的模式,就这样配置: 1. Window>Preferences>Java>Editor>Content Assist>Auto Activa ...