Dart学习笔记2

Built-in types(内置的类型)

Dart 内置支持下面这些类型:

  • numbers
  • strings
  • booleans
  • lists (也被称之为 arrays)
  • maps
  • runes (用于在字符串中表示 Unicode 字符)
  • symbols

Numbers(数值)

Dart 支持两种类型的数字:
int
整数值,其取值通常位于和之间。
double
64-bit (双精度) 浮点数,符合 IEEE 754 标准。
intdouble 都是 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'}");
}
Dart学习笔记2_第1张图片
num.png

整数类型支持传统的位移操作符,(<<, >>), 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}");
Dart学习笔记2_第2张图片

数字字面量为编译时常量。 很多算术表达式只要其操作数是常量,则表达式结果也是编译时常量。

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);
string.jpg

使用三个单引号或者双引号也可以 创建多行字符串对象:

 var s1 = '''
  you can create 
  multi-line strings
  like this one.
  ''';
  print(s1);

  var s2 = """
  This is also a
  multi-line string.
  """;
  print(s2);
Dart学习笔记2_第3张图片
multi_line.jpg

字符串字面量是编译时常量, 带有字符串插值的字符串定义,若干插值表达式引用的为编译时常量则其结果也是编译时常量。

// 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 文档

你可能感兴趣的:(Dart学习笔记2)