原文:https://www.dartlang.org/guides/language/language-tour
Dart基本数据类型
- num
- string
- boolean
- list(array)
- set
- map
- run
- symbol
你可以用文字初始化这些对象。例如:'this is a string'是一个string
文字,true
是一个布尔文字。
在Dart中每个变量都指向一个对象(一个类的实例),你通常可以用构造函数来初始化变量。一些内置类型有它们自己的构造函数。例如:你可以用Map()
来创建一个map。
Dart 数字有两种类型:
int:
整型值不大于64bit,这取决于平台。再Dart VM上,int的范围时-263 to 263 - 1,Dart 编译成JavaScript int的范围是 -253 to 253 - 1。
double:
双精度浮点数字,由IEEE 754定义。
int
和double
都是num
的子类型,num包括基本运算符如:+ - / *,abs(),ceil(),floor()和其他方法。位运算符例如>>
被定义在int类中。
下面是定义一个整型变量:
var x=1;
var hex=0xDEADBEFF;
如果一个数字包含小数点,它就是一个double类型,下面是定义一个double变量:
var y=1.1;
var exponents=1.42e5;
Dart 2.1中,整型变量会自动转换成double:
double z=1;//在Dart2.1之前这样定义会发生错误
下面是怎么将string变成一个数字,反之亦然:
//string->int
var one=int.parse('1');
var onPointOne=double.parse('1.1');
//int->string
String oneAsString=1.toString();
//double->string
String piAsString=3.14159.toStringAsFixed(2);
assert(piAsString=='3.14');
整型变量位运算举例:
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
文字数字是编译时常量。许多算术表达式也是编译时常量,只要它们的操作数是编译时常量。
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
字符串
一个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.";
你可以用${表达式}
把一个值的表达式放在一个字符串中。如果这个表达式是一个标识符,一可以省略{},可以用toString()
方法来获得一个对象对应的字符串。
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!');
==
运算符用来比较两个对象是否相等,两个字符串是否相等取决于它们的单元序列是否一致。
你可以用+
或者两个相邻的字符串将它们拼接起来:
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
前缀来创建一个“raw”字符串:
var s = r'In a raw string, not even \n gets special treatment.';
文字字符串是编译时常量,只要他们的内插值表达式是编译时常量:
// These work in a const string.
const aConstNum = 0;
const aConstBool = true;
const aConstString = 'a constant string';
// These do NOT work in a const string.
var aNum = 0;
var aBool = true;
var aString = 'a string';
const aConstList = [1, 2, 3];
const validConstString = '$aConstNum $aConstBool $aConstString';
// const invalidConstString = '$aNum $aBool $aString $aConstList';
布尔
为了表示boolean值,Dart有个叫bool
的类型。只有true
和false
是bool类型,它们都是编译时常量。
Dart的类型安全是指,你不能用if (nonbooleanValue)
或者assert (nonbooleanValue)
,取而代之的是,明确的检查值:
// Check for an empty string.
var fullName = '';
assert(fullName.isEmpty);
// Check for zero.
var hitPoints = 0;
assert(hitPoints <= 0);
// Check for null.
var unicorn;
assert(unicorn == null);
// Check for NaN.
var iMeantToDoThis = 0 / 0;
assert(iMeantToDoThis.isNaN);
列表
可能每个编程语言最共同的集合就是array,或者对象的有序组。在Dart中数组是List。
var list = [1, 2, 3];
创建一个编译时常量的list,在它的list文字前面加上const
:
var constantList = const [1, 2, 3];
// constantList[1] = 1; // Uncommenting this causes an error.
集合
var halogens = {'fluorine', 'chlorine', 'bromine', 'iodine', 'astatine'};
var names = <String>{};
// Set<String> names = {}; // This works, too.
// var names = {}; // Creates a map, not a set.
添加:
var elements = <String>{};
elements.add('fluorine');
elements.addAll(halogens);
To create a set that’s a compile-time constant, add const before the set literal:
final constantSet = const {
'fluorine',
'chlorine',
'bromine',
'iodine',
'astatine',
};
// constantSet.add('helium'); // Uncommenting this causes an error.
Maps
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
用构造函数创建map:
var gifts = Map();
gifts['first'] = 'partridge';
gifts['second'] = 'turtledoves';
gifts['fifth'] = 'golden rings';
var nobleGases = Map();
nobleGases[2] = 'helium';
nobleGases[10] = 'neon';
nobleGases[18] = 'argon';
Dart2 可以在创建对象时省略
new
To create a map that’s a compile-time constant, add const before the map literal:
final constantMap = const {
2: 'helium',
10: 'neon',
18: 'argon',
};
// constantMap[2] = 'Helium'; // Uncommenting this causes an error.
Runes
在Dart中runes是UTF-32字符串。
符号(Symbols)
一个Symbol对象代表一个操作符或者一个Dart程序中声明的标识符. 你可能永远都不会使用符号, 但它们对于通过名称引用标识符的API非常有用,because minification changes identifier names but not identifier symbols.
为了获得一个符号或标识符,使用符号文字,仅需在 #
后边跟标识符:
#radix
#bar
符号文字是编译时常量。