Dart基础学习02--变量及内置类型
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
如果一个变量不允许改变的话可以使用final
和const
关键字来代替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类型的只只有true
或false
。值得注意的是在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--变量及内置类型的更多相关文章
- Dart基础学习03--方法的使用
1.本文主要讲一下Dart中的方法是怎么定义的,下面先看一个简单的例子: void printNumber(num number) { print('The number is $number.'); ...
- Dart基础学习01--走近Dart
什么是Dart 在Dart的官网上是这样介绍Dart的: Dart is an open-source, scalable programming language, with robust libr ...
- java基础学习02(简单的java程序)
简单的java程序 一.完成的目标 1. 理解java程序的基本组成 2. 如何对程序代码进行注释 3. java标识符的命名规则 4. 了解java中的关键字 5. 使用java定义变量或声明变量 ...
- T-SQL 基础学习 02
数据库设计 定义 数据库设计就是将数据库中的数据实体以及这些数据实体之间关系,进行规划和结构化的过程 在需求分析阶段,设计数据库的一般步骤 A. 收集相信 B. 标识实体 C. 标记每个实体需要存储的 ...
- Swift开发学习-02 变量和常量
本教程是笔者在自学IOS/Swift知识的总结,适用于通过对Objictive C编程的运用,并需要了解基于iOS程序的iPhone和iPad的程序员.做一个有bigger的’攻城狮‘,有尊严的工作, ...
- python基础学习笔记第二天 内建方法(s t r)
python的字符串内建函数 str.casefold()将字符串转换成小写,Unicode编码中凡是有对应的小写形式的,都会转换str.center()返回一个原字符串居中,并使用空格填充至长度 w ...
- c语言基础学习02
=============================================================================涉及到的知识点有:include有两种用法.{ ...
- Python基础学习之变量赋值
1.赋值操作符 Python语言中,等号(=)是主要的赋值操作符: >>> aInt=-100 >>> aString='this is a string' > ...
- ES6 - 基础学习(3): 变量的解构赋值
解构赋值概述 1.解构赋值是对赋值运算符的扩展. 2.它是一种针对数组或者对象进行模式匹配,然后对其中的变量进行赋值. 3.代码书写上显得简洁且易读,语义更加清晰明了:而且还方便获取复杂对象中的数据字 ...
随机推荐
- sql server使用sql插入中文字符串乱码问题
在插入语句前加N就行了 sb.Append(string.Format("update chapter set [content]=N'{0}' where Id ={1} ;", ...
- A Translation for Quaternion 一篇对四元数的翻译
一篇写的非常好的博客:http://www.cnblogs.com/lookof/archive/2012/02/24/2360749.html
- Lintcode---统计比给定整数小的数的个数
给定一个整数数组 (下标由 0 到 n-1,其中 n 表示数组的规模,数值范围由 0 到 10000),以及一个 查询列表.对于每一个查询,将会给你一个整数,请你返回该数组中小于给定整数的元素的数量. ...
- bashrc,bash_profile和/etc/profile
bashrc,bash_profile和/etc/profile 最近老出现在shell里面能跑的程序用鼠标双击app去不能跑.究其原因是因为环境变量的问题. 在类unix系统中一般有三个bash配置 ...
- 多线程-synchronized
引言 synchronized是Java线程同步中的一个重要的概念,synchronized是独占锁(互斥锁),同时也是可重入锁(可重入锁一定程度上避免了死锁的问题,内部是关联一个计数器,加一次锁计数 ...
- c++11 thread (目前我使用的ZThread库)
目前为止(2014-11-30),GCC其实已经基本上完全支持C++11的所有功能了,事实上从GCC4.7之后,就支持了-std=c++11选项,在4.7版本之前,也开始支持-std=c++0x的选项 ...
- CentOS6.5下Apache防止目录遍历
原先以为CentOS下的Apache应该是默认关闭目录遍历的... 然后拿自己网站试了一下发现想太多...汗 就去改下Apache的配置 首先Apache的配置文件在 /etc/httpd/conf/ ...
- FormatUtil类型格式转换
package cn.edu.hbcf.common.utils; import java.math.BigDecimal; import java.math.BigInteger; import j ...
- [转]所有编程皆为 Web 编程
Web编程还远远没有达到完美的境地.其实,还有点乱!没错,随便会写点代码的人就能三下两下地搞出一个糟糕的Web应用:也确实,99%的Web 应用都似狗屎一堆.但是,这也意味着,相当“聪明”的程序员们正 ...
- Makefile 实例实践
本文为原创文章,转帖需指明该文链接 目录结构如下: comm/inc/apue.h comm/errorhandler.c atexit.c Makefile 文件内容如下: apue.h #if ...