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开源项目进行同步,欢迎关注。
|
请发表评论