/**
* Built-in types (Dart内置的类型)
*/
/**
* Dart内置支持下面这些类型:
* numbers;
* strings;
* booleans;
* lists(也被称之为arrays);
* maps;
* runes(用于在字符串中表示Unicode字符);
* symbols;
* 由于Dart中每个变量引用的都是一个对象(一个类的实例),通常使用构造函数来初始化变量。
*
*/
void main() {
/**
* Numbers(数值)
*
* Dart支持两种类型的数字:
*
* int:整数值,其取值通常位于-2^53和2^53之间。
* double:64-bit(双精度)浮点数,符合IEEE754标准。
* int和double都是num的子类。num类型定义了基本的操作符,例如+,-,/,*,还定义了abs(),ceil()和floor()等函数。
*
* 注意:不在-2^53到2^53范围内的整数在Dart中的行为和JavaScript中表现不一样。原因在于Dart具有任意精度的整数,而JavaScript没有。
*/
// 整数是不带小数点的数字,下面是一些定义整数的方式:
var x = 1;
var hex = 0xDEADBEEF;
var bigInt = 123456789098765432;
// 如果一个数带小数点,则其为double,下面是定义double的一些方式:
var y = 1.1;
var exponents = 1.42e5;
// 下面是字符串和数字之间的转换方式:
var one = int.parse('1'); // String -> int
assert(one == 1);
var onePointOne = double.parse('1.1'); // String -> double
assert(onePointOne == 1.1);
String oneAsString = 1.toString(); // int -> String
assert(oneAsString == '1');
String piAsString = 3.14159.toStringAsFixed(2); // double -> String
assert(piAsString == '3.14');
// 整数类型支持传统的位移操作符:<<, >>, AND(&), OR(1),例如:
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 = msPerSecond * secondsUntilRetry;
/**
* Strings(字符串)
*/
// Dart字符串是UTF-16编码的字符序列。可以使用单引号,或者双引号来创建字符串
var s1 = 'single quotes';
var s2 = "double quotes";
var s3 = 'It\'s easy to escape the string delimiter';
var s4 = "It's even easier to use the other delimiter";
// 可以在字符串中使用表达式,用法是这样的${expression},如果表达式是一个字符串,可以省略{}。
// 如果表达式的结果作为一个对象,则Dart会自动调用对象的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 s5 = 'String''concatenation'"works even over line breaks.";
assert(s5 == 'String concatenation works even over line breaks.');
var s6 = 'The + operator' + 'works,as well.';
assert(s2 == 'The + operator works,as well');
// 使用三个单引号或者双引号也可以创建多行字符串对象
var s7 =
'''
You can create
multi-line strings like this one.
''';
var s8 =
"""
this is also a
multi-line strings.
""";
// 通过提供一个r前缀可以创建一个“原始raw”字符串:
var s9 = r"in a raw string,even \n isn't special.";
// 字符串字面量是编译时常量,带有字符串插值的字符串定义,若干插值表达式引用的为编译时常量则其结果也是编译时常量。
// 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 = const[1,2,3];
const validConstString = '$aConstNum $aConstBool $aConstString'; // this is a const string
// const invalidConstString = '$aNum $aBool $aString $aConstList'; // this is NOT a const string
/**
* Booleans(布尔值)
*
* 为了代表布尔值,Dart有一个名字为bool的类型。只有两个对象是布尔类型的:true和false所创建的对象,这两个对象也都是编译是常量。
*/
// 当Dart需要一个布尔值的时候,只有true对象才被认为是true,所有其他的值都是false。
// 比如:1,"aString",以及someObject等值都被认为是false。这点与JavaScript不一样。
// 例如,下面代码在JavaScript中和Dart中都是合法的代码。如果在JavaScript中 name 是非 null 对象,所以被认为是 true。
// 但是在Dart的生产模式下运行,这不会打印任何内容,原因是 name 被转换成 false 了。原因在于 name != true 。
// 如果在Dart检查模式运行,下面的代码会抛出一个异常,标示 name 变量不是一个布尔值。
// 注意:下面的两段代码只能在生产模式下运行,在检查模式下,会抛出异常:变量不是所期望的布尔类型。
// var name = 'Bob';
// if (name) {
// Prints in JavaScript, not in Dart
// print('You have a name!');
// }
// if (1) {
// print('JS print this line.');
// } else {
// print('Dart in production mode prints this line');
// }
// Dart这样设计布尔值,是为了避免奇怪的行为。很多JavaScript代码都遇到这种问题。Dart环境中,在写代码的时候,
// 不用再写这些代码了:if (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);
/**
* Lists(列表)
*
* array(有序集合)是所有编程语言中最常见的集合类型。Dart中数组就是List对象,通常我们都称之为lists。
*/
// Dart list字面量和JavaScript的数组字面量类似,如下:
var list0 = [1,2,3];
// list的下标索引从0开始,第一个元素索引下标是0。list.length - 1是最后一个元素。
var list1 = [1,2,3];
assert(list1.length == 3);
assert(list1[1] == 2);
list1[1] = 1;
assert(list1[1] == 1);
// 在list字面量之前添加const关键字,可以定义一个不变的list对象(编译是常量):
var constantList = const [1,2,3];
// constantList[1] = 1; // can NOT change it
/**
* Maps
* Map是一个键值对相关的对象。键和值可以是任何类型的对象。每个键只出现一次,而一个值可以出现多次。类似 OC 的 NSDictionary。
*/
// 以下是创建简单map的示例:
var gifts = {
// key value
'first' : 'partridge',
'second' : 'turtledoves',
'fifth' : 'golden rigns'
};
var nobleGases = {
// key vaue
2 : 'helium',
10 : 'neon',
18 : 'argon'
};
// 使用map构造函数也可以实现同样的功能:
var gifts1 = new Map();
gifts1['first'] = 'partridge';
gifts1['second'] = 'turtledoves';
gifts1['fifth'] = 'golden rigns';
var nobleGases1 = new Map();
nobleGases1[2] = 'helium';
nobleGases1[10] = 'neon';
nobleGases1[18] = 'argon';
// 往map中添加新的键值对
gifts1['fourth'] = 'calling birds';
// 获取map中的值
assert(gifts1['fourth'] == 'calling birds');
// 如果所查找的键不存在,则返回null
assert(gifts1['third'] == null);
// 获取map中键值对的数目
assert(gifts.length == 3);
// 使用const可以创建一个编译时常量的map
final cnostMap = const {
2 : 'helium',
10 : 'neon',
18 : 'argon'
};
// cnostMap[2] = 'Helium'; // can NOT change it
/**
* Runes
* 在Dart中,runes代表字符串的UTF-32 code points。
* Unicode为每一个字符、标点符号、表情符号等都定义了一个唯一的数值。由于Dart字符串是UTF-16 code units字符序列,所以在字符串中
* 表达32-bit Unicode值就需要新的语法了。
*
* 通常使用 \uXXXX 的方式来表示 Unicode code point,这里的 XXXX 是4个16进制的数。
* 例如,心形符号(♥)是 \u2665。
* 对于非4个数值的情况,把编码值放到大括号中即可。例如,笑脸 emoji(😆)是 \u{1f600}。
*
* String类有一些属性可以提取rune信息。codeUnitAt 和 codeUnit 属性返回 16-bit code units。使用 runes属性来获取字符串的runes信息。
*/
// 以下演示了runes、16-bit code units、32-bit code points 之间的关系。
var clapping = '\u{1f44f}';
print(clapping);
print(clapping.codeUnits);
print(clapping.runes.toList());
Runes input = new Runes(
'\u2665 \u{1f605} \u{1f60e} \u{1f47b} \u{1f596} \u{1f44d}'
);
print(new String.fromCharCodes(input));
/**
* Symbols
* 一个Symbol的object代表Dart程序中声明的操作符或者标识符。
* 该功能通过名字来引用标识符的情况是非常有价值的,特别是混淆后的代码,标识符的名字被混淆了,但是Symbol的名字不会改变。
* 使用Symbol字面量来获取标识符的symbol对象,就是在标识符前面添加一个 # 符号:#radix, #bar
*
*/
}
网友评论