Dart 語言簡易教程(四)

Dart 語言簡易教程(一): http://www.reibang.com/p/8a62b1a2fd75
Dart 語言簡易教程(二): http://www.reibang.com/p/b2153a32dd8b
Dart 語言簡易教程(三): http://www.reibang.com/p/6d2495a0d3d7

Dart 語言簡易教程(四)

操作符

Dart 支持各種類型的操作符悴务,并且其中的一些操作符還能進行重載宛畦。
支持的完整操作如下:

Description Operator
unary postfix expr++ expr-- () [] . ?.
unary prefix -expr !expr ~expr ++expr --expr
multiplicative * / % ~/
additive + -
shift << >>
bitwise AND &
mbitwise XOR ^
bitwise OR |
relational and type test >= > <= < as is is!
equality == !=
logical AND &&
logical OR
if null ??
conditional expr1 ? expr2 : expr3
cascade ..
assignment = *= /= ~/= %= += -= <<= >>= &= ^= |= ??=

在上表中凡蜻,操作符的優(yōu)先級依次降低良狈。就是排在最上面的一行優(yōu)先級最高,最后的一行優(yōu)先級越低骤星。

算術(shù)操作符

Dart 支持的基本算術(shù)操作符如下表所示:

Operator Meaning
+ Add
Subtract
-expr Unary minus, also known as negation (reverse the sign of the expression)
* Multiply
/ Divide
~/ Divide, returning an integer result
% Get the remainder of an integer division (modulo)

實例:

assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5);   // Result is a double
assert(5 ~/ 2 == 2);    // Result is an integer
assert(5 % 2 == 1);     // Remainder

print('5/2 = ${5~/2} r ${5%2}'); // 5/2 = 2 r 1

Dart 同時也支持詞前及詞后的自增自減操作舷蟀。

Operator Meaning
++var var = var + 1 (expression value is var + 1)
var++ var = var + 1 (expression value is var)
--var var = var – 1 (expression value is var – 1)
var-- var = var – 1 (expression value is var)

實例:

var a, b;

a = 0;
b = ++a;        // Increment a before b gets its value.
assert(a == b); // 1 == 1

a = 0;
b = a++;        // Increment a AFTER b gets its value.
assert(a != b); // 1 != 0

a = 0;
b = --a;        // Decrement a before b gets its value.
assert(a == b); // -1 == -1

a = 0;
b = a--;        // Decrement a AFTER b gets its value.
assert(a != b); // -1 != 0

關(guān)系操作符

Operator Meaning
== Equal;
!= Not equal
> Greater than
< Less than
>= Greater than or equal to
<= Less than or equal to

Dart 支持的關(guān)系操作符列表:

Operator Meaning
== Equal;
!= Not equal
> Greater than
< Less than
>= Greater than or equal to
<= Less than or equal to

假如要比對xy是否相等冒版,==操作符的工作流程如下:

  • 如果x 或者 y 都是null 類型,比較的結(jié)果是true歌殃。
  • 如果x 或者 y 只有一個是null 類型乔妈,比較的結(jié)果是false
  • 返回調(diào)用x.==(y)的結(jié)果作為== 操作的結(jié)果氓皱。

類型比較操作符

Dart 支持在運行時比較對象的類型路召,支持的操作如下:

Operator Meaning
as Typecast
is True if the object has the specified type
is! False if the object has the specified type

is操作,用來比較前操作數(shù)是否是后操作數(shù)的對象波材。
as操作股淡,用來將前操作數(shù)指定為后操作數(shù)的類型。

指定操作符

=操作符各聘,將后操作數(shù)的值賦給前操作數(shù)揣非。
??=操作符,如果前操作數(shù)是null類型躲因,則將后操作數(shù)賦值給前操作數(shù)早敬;如果前操作數(shù)不等于null,則保持前操作數(shù)的值發(fā)生變化。

組合指定操作符

Dart 支持將算術(shù)操作符與=組合起來實現(xiàn)更復(fù)雜的功能大脉。

  • | - | - | - | - | -
    --- | --- | --- | --- | --- | ---
    = | –= | /= | %= | >>= | ^=
    += | *= | ~/= | <<= | &= | =

下表演示了這是如何工作的:
| Compound assignment | Equivalent expression
--- | --- | ---
For an operator op: | a op= b | a = a op b
Example: | a += b | a = a + b

實例:

var a = 2;           // Assign using =
a *= 3;              // Assign and multiply: a = a * 3
assert(a == 6);

邏輯操作符

Operator Meaning
!expr inverts the following expression (changes false to true, and vice versa)
logical OR
&& logical AND

Dart 支持的邏輯操作符如下表:

Operator Meaning
!expr inverts the following expression (changes false to true, and vice versa)
logical OR
&& logical AND

邏輯操作符實例:

if (!done && (col == 0 || col == 3)) {
  // ...Do something...
}

位操作符及位移操作符

Dart 針對整數(shù)(int 類型)支持位操作符及位移操作符搞监。

Operator Meaning
& AND
OR
^ XOR
~expr Unary bitwise complement (0s become 1s; 1s become 0s)
<< Shift left
>> Shift right

位操作符及位移操作符實例:

final value = 0x22;
final bitmask = 0x0f;

assert((value & bitmask)  == 0x02);  // AND
assert((value & ~bitmask) == 0x20);  // AND NOT
assert((value | bitmask)  == 0x2f);  // OR
assert((value ^ bitmask)  == 0x2d);  // XOR
assert((value << 4)       == 0x220); // Shift left
assert((value >> 4)       == 0x02);  // Shift right

條件表達式

Dart 支持條件表達式,同時為了減少代碼镰矿,也提供了簡化的操作符琐驴。
Dart中有兩種方式簡化類似其它語言的if-else 功能。

  • 使用? : 表達式。
    使用如下的表達式:
condition ? expr1 : expr2

condition的值為true, 則返回結(jié)果為expr1绝淡;反之則返回expr2宙刘。

  • 使用?? 表達式。
    使用如下的表達式:
expr1 ?? expr2

如果expr1的值為non-null牢酵,則返回結(jié)果為expr1悬包;反之則返回expr2

下面的例子演示了:將Dart 的? :操作符轉(zhuǎn)化為'if-else' 的版本:

// Slightly longer version uses ?: operator.
String toString() => msg == null ? super.toString() : msg;

// Very long version uses if-else statement.
String toString() {
  if (msg == null) {
    return super.toString();
  } else {
    return msg;
  }
}

級聯(lián)操作符(..)

通過級聯(lián)操作符(..)馍乙,可以連續(xù)的操作同一對象布近,達到減少中間變量,減少代碼的目的丝格。
如下面的例子:

querySelector('#button') // Get an object.
  ..text = 'Confirm'   // Use its members.
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

下面的代碼與上面的例子實現(xiàn)功能完全相同:

var button = querySelector('#button');
button.text = 'Confirm';
button.classes.add('important');
button.onClick.listen((e) => window.alert('Confirmed!'));

另一段例子:

final addressBook = (new AddressBookBuilder()
      ..name = 'jenny'
      ..email = 'jenny@example.com'
      ..phone = (new PhoneNumberBuilder()
            ..number = '415-555-0100'
            ..label = 'home')
          .build())
    .build();

其它的一些操作符

Operator Name Meaning
() Function application Represents a function call
[] List access Refers to the value at the specified index in the list
. Member access Refers to a property of an expression; example: foo.bar selects property bar from expression foo
?. Conditional member access Like ., but the leftmost operand can be null; example: foo?.bar selects property bar from expression foo unless foo is null (in which case the value of foo?.bar is null)
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末撑瞧,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子显蝌,更是在濱河造成了極大的恐慌预伺,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件琅束,死亡現(xiàn)場離奇詭異扭屁,居然都是意外死亡,警方通過查閱死者的電腦和手機涩禀,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門料滥,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人艾船,你說我怎么就攤上這事葵腹。” “怎么了屿岂?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵践宴,是天一觀的道長。 經(jīng)常有香客問我爷怀,道長阻肩,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任运授,我火速辦了婚禮烤惊,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘吁朦。我一直安慰自己柒室,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布逗宜。 她就那樣靜靜地躺著雄右,像睡著了一般空骚。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上擂仍,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天囤屹,我揣著相機與錄音,去河邊找鬼防楷。 笑死牺丙,一個胖子當(dāng)著我的面吹牛则涯,可吹牛的內(nèi)容都是我干的复局。 我是一名探鬼主播,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼粟判,長吁一口氣:“原來是場噩夢啊……” “哼亿昏!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起档礁,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤角钩,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后呻澜,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體递礼,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年羹幸,在試婚紗的時候發(fā)現(xiàn)自己被綠了脊髓。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡栅受,死狀恐怖将硝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情屏镊,我是刑警寧澤依疼,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站而芥,受9級特大地震影響律罢,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜棍丐,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一误辑、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧骄酗,春花似錦稀余、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽盒蟆。三九已至,卻和暖如春师骗,著一層夾襖步出監(jiān)牢的瞬間历等,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工辟癌, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留寒屯,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓黍少,卻偏偏與公主長得像寡夹,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子厂置,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 43,452評論 2 348

推薦閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理菩掏,服務(wù)發(fā)現(xiàn),斷路器昵济,智...
    卡卡羅2017閱讀 134,628評論 18 139
  • 國家電網(wǎng)公司企業(yè)標準(Q/GDW)- 面向?qū)ο蟮挠秒娦畔?shù)據(jù)交換協(xié)議 - 報批稿:20170802 前言: 排版 ...
    庭說閱讀 10,916評論 6 13
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法智绸,類相關(guān)的語法,內(nèi)部類的語法访忿,繼承相關(guān)的語法瞧栗,異常的語法,線程的語...
    子非魚_t_閱讀 31,597評論 18 399
  • 一個業(yè)務(wù)操作海铆,涉及的數(shù)據(jù)庫操作在兩個庫里迹恐,就會涉及到分布式事務(wù)。舉那個常用的轉(zhuǎn)賬例子游添。A要轉(zhuǎn)錢給B系草,A賬戶和B賬戶...
    聯(lián)想橋南閱讀 32,480評論 0 6
  • 今天非常快樂唆涝,感謝今天所有一起出行一起 的孩子家長們
    王柯媽媽閱讀 162評論 0 3