Built-in types(内置的类型)
Dart 内置支持下面这些类型:
- numbers
- strings
- booleans
- lists (也被称之为 arrays)
- maps
- runes (用于在字符串中表示 Unicode 字符)
- symbols
Numbers(数值)
Dart 支持两种类型的数字:
int
整数值,其取值通常位于和之间。
double
64-bit (双精度) 浮点数,符合 IEEE 754 标准。
int
和 double
都是 num
的子类。 num 类型定义了基本的操作符,例如 +, -, /, 和 *, 还定义了 abs()
、ceil()
、和 floor()
等 函数。 (位操作符,例如 >> 定义在 int
类中。)
整数是不带小数点的数字。
var x = 1;
var hex = 0xDEADBEEF;
var bigInt = 34653465233243244;
如果一个数带小数点,则其为 double。
var y = 1.1;
var exponents = 1.42e5;
下面是字符串和数字之间转换的方式:
void main() {
// String -> int
var one = int.parse('1');
print("one => ${one == 1}");
// String -> double
var onePointOne = double.parse('1.1');
print("onePointOne => ${onePointOne == 1.1}");
// int -> String
String oneAsString = 1.toString();
print("oneAsString => ${oneAsString == '1'}");
// double -> String
String piAsString = 3.1415926.toStringAsFixed(2);
print("piAsString => ${piAsString == '3.14'}");
}
整数类型支持传统的位移操作符,(<<, >>), AND (&), 和 OR (|) 。例如:
// 0011 << 1 == 0110
print("(3 << 1) == 6 => ${(3 << 1) == 6}");
// 0011 >> 1 == 0001
print("(3 >> 1) == 1 => ${(3 >> 1) == 1}");
// 0011 | 0100 == 0111
print("(3 | 4) == 7 => ${(3 | 4) == 7}");
数字字面量为编译时常量。 很多算术表达式只要其操作数是常量,则表达式结果也是编译时常量。
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
Strings(字符串)
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.";
可以在字符串中使用表达式,用法是这样的: ${expression}。如果表达式是一个比赛服,可以省略 {}。 如果表达式的结果为一个对象,则 Dart 会调用对象的 toString() 函数来获取一个字符串。
var s = 'love';
print('i $s u' == 'i love '+'u');
print('i ${s.toUpperCase()} u' == 'i LOVE u');
可以使用 + 操作符来把多个字符串链接为一个,也可以把多个字符串放到一起来实现同样的功能:
var s = 'my youth ' 'my youth is yours,' "trippin'on skies sippin' waterfalls.";
print(s);
使用三个单引号或者双引号也可以 创建多行字符串对象:
var s1 = '''
you can create
multi-line strings
like this one.
''';
print(s1);
var s2 = """
This is also a
multi-line string.
""";
print(s2);
字符串字面量是编译时常量, 带有字符串插值的字符串定义,若干插值表达式引用的为编译时常量则其结果也是编译时常量。
// 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';
// const invalidConstString = '$aNum $aBool $aString $aConstList';
Searching inside a string(在字符串内搜索)
可以在字符串内查找特定字符的位置,还可以判断字符串是否以特定字符串开始和结尾。 例如:
// Check whether a string contains another string.
assert('Never odd or even'.contains('odd'));
// Does a string start with another string?
assert('Never odd or even'.startsWith('Never'));
// Does a string end with another string?
assert('Never odd or even'.endsWith('even'));
// Find the location of a string inside a string.
assert('Never odd or even'.indexOf('odd') == 6);
Extracting data from a string(从字符串中提取数据)
可以从字符串中获取到单个的字符,单个字符可以是 String 也可以是 int 值。 准确来说,实际得到的是一个 UTF-16 code units; 对于码率比较大的字符,实际得到的是两个 code units,例如 treble clef 符号 (‘\u{1D11E}’) 。
还可以从字符串中提取一个子字符串,或者把字符串分割为 多个子字符串:
// Grab a substring.
assert('Never odd or even'.substring(6, 9) == 'odd');
// Split a string using a string pattern.
var parts = 'structured web apps'.split(' ');
assert(parts.length == 3);
assert(parts[0] == 'structured');
// Get a UTF-16 code unit (as a string) by index.
assert('Never odd or even'[0] == 'N');
// Use split() with an empty string parameter to get
// a list of all characters (as Strings); good for
// iterating.
for (var char in 'hello'.split('')) {
print(char);
}
// Get all the UTF-16 code units in the string.
var codeUnitList = 'Never odd or even'.codeUnits.toList();
assert(codeUnitList[0] == 78);
Converting to uppercase or lowercase(大小写转换)
字符串大小写转换是非常 简单的:
// Convert to uppercase.
assert('structured web apps'.toUpperCase() ==
'STRUCTURED WEB APPS');
// Convert to lowercase.
assert('STRUCTURED WEB APPS'.toLowerCase() ==
'structured web apps');
Trimming and empty strings(裁剪和判断空字符串)
trim() 函数可以删除字符串前后的空白字符。使用 isEmpty 可以 判断字符串是否为空(长度为 0)。
// Trim a string.
assert(' hello '.trim() == 'hello');
// Check whether a string is empty.
assert(''.isEmpty);
// Strings with only white space are not empty.
assert(!' '.isEmpty);
Replacing part of a string(替换部分字符)
Strings 是不可变的对象,可以创建他们但是无法修改。 如果你仔细研究了 String API 文档,你会注意到并没有 函数可以修改字符串的状态。 例如,函数 replaceAll()
返回一个新的 String 对象而不是修改 旧的对象:
var greetingTemplate = 'Hello, NAME!';
var greeting = greetingTemplate
.replaceAll(new RegExp('NAME'), 'Bob');
assert(greeting !=greetingTemplate); // greetingTemplate didn't change.
Building a string(创建字符串)
使用 StringBuffer 可以在代码中创建字符串。 只有当你调用 StringBuffer 的 toString() 函数的时候,才会创建一个 新的 String 对象。而 writeAll() 函数还有一个可选的参数来指定每个字符串的分隔符, 例如下面指定空格为分隔符:
var sb = new StringBuffer();
sb..write('Use a StringBuffer for ')
..writeAll(['efficient', 'string', 'creation'], ' ')
..write('.');
var fullString = sb.toString();
assert(fullString ==
'Use a StringBuffer for efficient string creation.');
Regular expressions(正则表达式)
RegExp 类提供了 JavaScript 正则表达式同样的功能。 正则表达式可以高效率的搜索和匹配 字符串。
// Here's a regular expression for one or more digits.
var numbers = new RegExp(r'\d+');
var allCharacters = 'llamas live fifteen to twenty years';
var someDigits = 'llamas live 15 to 20 years';
// contains() can use a regular expression.
assert(!allCharacters.contains(numbers));
assert(someDigits.contains(numbers));
// Replace every match with another string.
var exedOut = someDigits.replaceAll(numbers, 'XX');
assert(exedOut == 'llamas live XX to XX years');
关于String的更多内容请前往: String API 文档