先說下題外話哈,最近做了個領(lǐng)取電商平臺優(yōu)惠券的小程序侍筛,掃碼支持下哈~
image
內(nèi)置類型
- 數(shù)值型
- 字符串
- 布爾型
- 列表/數(shù)組
- Map
- runes(表示字符串中的 unicode 字符)
- symbols
上述類型的變量多可以用字面量進(jìn)行初始化凡恍,例如 'this is a string'
是一個字符串字面量柜某,true
是 boolean 字面量
dart中變量都是引用的對象,所以可以用構(gòu)造器進(jìn)行初始化抛杨,部分內(nèi)置變量有自己的構(gòu)造器暗赶,例如 Map()鄙币。
數(shù)值型
dart的數(shù)值型有兩種:
- int:整型,位寬由運(yùn)行平臺決定蹂随,但是不大于 64 bit
- double:IEEE754 標(biāo)準(zhǔn)定義的 64 bit 雙精度浮點(diǎn)數(shù)
int 和 double 都是 num 的子類型十嘿,包括加減乘除(+ - * /)操作,abs()糙及,ceil()详幽,floor(),等方法浸锨。(位移操作 >> 在 int 中定義)。如果基礎(chǔ)操作滿足不了需求版姑,可以使用 dart:math 庫柱搜。
在dart2.1之后,整型字面量可以自動轉(zhuǎn)換為 double 型: double z = 1; //等價于 double z = 1.0
字符串與整型互相轉(zhuǎn)換
// 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');
整型的位運(yùn)算剥险、與運(yùn)算聪蘸、或運(yùn)算
assert((3 << 1) == 6); // 0011 << 1 == 0110
assert((3 >> 1) == 1); // 0011 >> 1 == 0001
assert((3 | 4) == 7); // 0011 | 0100 == 0111
數(shù)值型字面量是編譯時常量。由編譯時常量組成的算術(shù)表達(dá)式也是編譯時常量表制。
const msPerSecond = 1000;
const secondsUntilRetry = 5;
const msUntilRetry = secondsUntilRetry * msPerSecond;
String
dart 使用的是 utf-16 的字符集健爬,可以用單引號或者雙引號創(chuàng)建。
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} 可以在字符串中使用表達(dá)式的值么介,如果表達(dá)式就是一個標(biāo)識符娜遵,可以省略大括號。
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 中 == 用來判斷連個對象是否相等壤短,字符串只要字符內(nèi)容相同就表示相等设拟。
連接字符串可以用 + 操作符慨仿,也可以用相鄰的字符串字面量。
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.');
創(chuàng)建多行字符串:使用三個單引號或者雙引號纳胧。
var s1 = '''
You can create
multi-line strings like this one.
''';
var s2 = """This is also a
multi-line string.""";
raw字符串:其中的轉(zhuǎn)義符不會被處理
var s = r'In a raw string, not even \n gets special treatment.';
更多信息參考Strings and regular expressions
布爾型
dart中用 bool 類型來表述布爾數(shù)據(jù)镰吆,只有兩個對象有 bool 類型:true 和 false(boolean字面量,編譯時常量)
dart的類型安全意思是不可用如下代碼
if(nonbooleanValue) ……
assert(nonbooleanValue)
列表
dart中 List 對象表示數(shù)組跑慕,也就是列表万皿。
字面量列表:var list = [1, 2, 3];
, 會自動推斷為 List<int> 列表核行,如果后面插入非 int 型對象牢硅,將會出錯,具體信息請參考type inference钮科。
列表索引從 0 開始唤衫,到 lsit.length - 1 結(jié)束。
創(chuàng)建編譯時常量列表需要在字面量列表前加上 const 關(guān)鍵字绵脯。 var constList = const [1, 2, 3];
更多信息請參考Generics 和 Collections
Maps
key-value結(jié)構(gòu)佳励,dart 中用 Map類型表示。
var gifts = {
// Key: Value
'first': 'partridge',
'second': 'turtledoves',
'fifth': 'golden rings'
};
var nobleGases = {
2: 'helium',
10: 'neon',
18: 'argon',
};
gifts 推斷為 Map<String, String>蛆挫;nobleGases 推斷為 Map<int, String>赃承。
可以使用 Map 的構(gòu)造器創(chuàng)建Map對象,其中 new 關(guān)鍵字可以加也可以省略悴侵。
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';
Runes
runes是dart中表示utf-32格式字符的編碼單元瞧剖。(In Dart, runes are the UTF-32 code points of a string.)
unicode 為全世界在用的所有字母、數(shù)字可免、符號都定義了一個獨(dú)一無二的數(shù)值抓于,但是dart的字符序列使用的是 utf-16的編碼格式,所以表示utf-32unicode格式的值需要特殊的語法浇借。
通常情況下一個unicode編碼格式為 \uXXXX捉撮,XXXX是4位16進(jìn)制的數(shù)值,如 \u2665妇垢,當(dāng)要表示多于或者少于4位的時巾遭,用大括號包起來,如 \u{1f600}闯估。
String 類提供了獲取 rune 信息的屬性灼舍,比如 codeUnitAt 和 codeUnit 獲取 字節(jié)的16-bit 編碼;使用runes屬性獲取字符串的runes涨薪。
可以用如下代碼展示runes骑素、16位編碼單元和32位編碼單元的關(guān)系。
main() {
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));
}
需要注意的是操作 runes 列表時很容易因?yàn)樘厥獾恼Z言尤辱、字符和操作而崩潰砂豌,具體參考How do I reverse a String in Dart?
Symbols