Dart學(xué)習(xí)-操作符

Dart

dart定義了下表所示的運(yùn)算符。你可以重寫許多這些運(yùn)算符。

描述 運(yùn)算符
一元后綴 expr++ expr-- () [] . ?.
一元前綴 -expr !expr ~expr ++expr --expr
乘法類型 * / % ~/
加法類型 + -
移動(dòng)位運(yùn)算 << >>
位運(yùn)算 &
異或位運(yùn)算 ^
位運(yùn)算 |
關(guān)系和類型測(cè)試 >= <= > < as is is!
等式 == !=
邏輯與 &&
邏輯或 ||
條件 expr1 ? expr2 : expr3
級(jí)聯(lián) ..
賦值 = *= /= ~/= %= += -= <<= >>= &= ^= |= ??=

使用運(yùn)算符時(shí),可以創(chuàng)建表達(dá)式。以下是運(yùn)算符表達(dá)式的一些示例:

a++
a + b
a = b
a == b
c ? a : b
a is T

在之前的操作符表中,操作符的優(yōu)先級(jí)由其所在行定義,上面行內(nèi)的操作符優(yōu)先級(jí)大于下面行內(nèi)的操作符。例如,乘法類型操作符%的優(yōu)先級(jí)比等價(jià)操作符==要高,而==操作符的優(yōu)先級(jí)又比邏輯與操作符&&要高。這些操作符的優(yōu)先級(jí)順序?qū)⒃谙旅娴膬尚写a中體現(xiàn)出來:

// 1.使用括號(hào)來提高可讀性
if ((n % i == 0) && (d % i == 0))

// 2.難以閱讀,但是和上面等價(jià)
if (n % i == 0 && d % i == 0)

警告:對(duì)于二元運(yùn)算符,其左邊的操作數(shù)將會(huì)決定使用的操作符的種類。例如,當(dāng)你使用一個(gè) Vector 對(duì)象以及一個(gè) Point 對(duì)象時(shí), aVector + aPoint 使用的 + 是由Vector 所定義的。


算術(shù)運(yùn)算符

dart支持常用的算術(shù)運(yùn)算符,如下表所示。

操作符 含義
+
-
-expr 一元減號(hào),也被命名為負(fù)號(hào)(使后面表達(dá)式的值反過來)
*
/
~/ 返回一個(gè)整數(shù)值的除法
% 取余,除法剩下的余數(shù)

示例:

assert(2 + 3 == 5);
assert(2 - 3 == -1);
assert(2 * 3 == 6);
assert(5 / 2 == 2.5); // 結(jié)果是double類型
assert(5 ~/ 2 == 2); // 結(jié)果是一個(gè)整數(shù)
assert(5 % 2 == 1); // 余數(shù)

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

dart還支持前綴和后綴遞增和遞減運(yùn)算符。

運(yùn)算符 含義
++var var=var+1表達(dá)式的值為var+1
var++ var=var+1表達(dá)式的值為var
--var var=var-1表達(dá)式的值為var-1
var-- var=var-1表達(dá)式的值為var

示例:

var a, b;

a = 0;
b = ++a; // 在b獲得其值之前自增a
assert(a == b); // 1 == 1

a = 0;
b = a++; //在b獲得值后自增a
assert(a != b); // 1 != 0

a = 0;
b = --a; // 在b獲得其值之前自減a
assert(a == b); // -1 == -1

a = 0;
b = a--; // 在b獲得值后自減a
assert(a != b); // -1 != 0

等式和關(guān)系運(yùn)算符

下表列出了等式和關(guān)系(比較)運(yùn)算符的含義。

運(yùn)算符 含義
== 等于
!= 不等于
> 大于
< 小于
>= 大于等于
<= 小于等于

要測(cè)試兩個(gè)對(duì)象x和y是相等,請(qǐng)使用= =運(yùn)算符。在極少數(shù)情況下,您需要知道兩個(gè)對(duì)象是否是完全相同的對(duì)象,請(qǐng)改用experation()函數(shù)。以下是==運(yùn)算符的工作原理:

  1. 如果x或y為空,如果兩者都為空,則返回true;如果只有一個(gè)為空,則返回false。
  2. 返回一個(gè)函數(shù)調(diào)用的結(jié)果:x.==(y)。(這個(gè)調(diào)用是正確的,像==這樣的運(yùn)算符實(shí)際上是由第一個(gè)操作數(shù)所調(diào)用的一個(gè)方法。你可以重寫大部分運(yùn)算符。

下面是使用每個(gè)等式和關(guān)系運(yùn)算符的示例:

assert(2 == 2);
assert(2 != 3);
assert(3 > 2);
assert(2 < 3);
assert(3 >= 3);
assert(2 <= 3);

類型測(cè)試操作符

asisis! 操作符在運(yùn)行時(shí)用于檢查類型非常方便。

操作符 含義
as 類型轉(zhuǎn)換
is 當(dāng)對(duì)象是相應(yīng)類型時(shí)返回 true
is! 當(dāng)對(duì)象不是相應(yīng)類型時(shí)返回 true

如果obj實(shí)現(xiàn)了T所定義的借口,那么obj is T將返回 true。比如,obj is Object必然返回 true。

使用as操作符可以把一個(gè)對(duì)象轉(zhuǎn)換為特定類型。一般來說,如果在is測(cè)試之后還有一些關(guān)于對(duì)象的表達(dá)式,你可以把as當(dāng)做是is測(cè)試的一種簡(jiǎn)寫。考慮下面這段代碼:

if (emp is Person) {
  // Type check
  emp.firstName = '永動(dòng)機(jī)';
}

你也可以通過as來簡(jiǎn)化代碼:

(emp as Person).firstName = '永動(dòng)機(jī)';

注意:上面兩段代碼并不相等。如果emp的值為 null 或者不是一個(gè) Person 對(duì)象,第一段代碼不會(huì)做任何事情,第二段代碼會(huì)報(bào)錯(cuò) 。


賦值操作符

正如你已經(jīng)看到的,你可以使用=運(yùn)算符賦值。要僅在變量為null時(shí)賦值,請(qǐng)使用??=運(yùn)算符。

// 賦值給a
a = value;
// 如果b為空,則將值分配給b;否則,b保持不變
b ??= value;

諸如+=之類的復(fù)合賦值運(yùn)算符將操作賦值相結(jié)合

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

以下是復(fù)合賦值運(yùn)算符的工作方式:

復(fù)合賦值 等式表達(dá)式
對(duì)于操作符op a op b a = a op b
具體例子1 a += b a = a + b
具體例子2 a -= b a = a - b

下面的示例使用賦值運(yùn)算符和復(fù)合賦值運(yùn)算符:

var a = 2; //賦值使用 =
a *= 3; // 賦值且相乘 a = a * 3
assert(a == 6);

邏輯運(yùn)算符

可以使用邏輯運(yùn)算符反轉(zhuǎn)或組合布爾表達(dá)式。

操作符 含義
!expr 反轉(zhuǎn)以下表達(dá)式(將false更改為true,反之亦然)
|| 邏輯或
&& 邏輯與

下面是使用邏輯運(yùn)算符的示例:

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

位運(yùn)算

通常我們指?位運(yùn)算為<<>>移動(dòng)位運(yùn)算,通過操作位的移動(dòng)來達(dá)到運(yùn)算的目的,而&,|,^,~expr也是操作位來達(dá)到運(yùn)算的目的。所以本文統(tǒng)稱這些運(yùn)算都為位運(yùn)算

操作符 含義
&
|
^ 異或
~expr 一元位補(bǔ)碼( 0s變?yōu)?s;1s變?yōu)?s )
<< 左移
>> 右移

下面是使用所有位運(yùn)算符的示例:

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

assert((value & bitmask)  == 0x02);  // 與
assert((value & ~bitmask) == 0x20);  // 與非
assert((value | bitmask)  == 0x2f);  // 或
assert((value ^ bitmask)  == 0x2d);  // 異或
assert((value << 4)       == 0x220); // 左移
assert((value >> 4)       == 0x02);  // 右移

條件表達(dá)式

dart有兩個(gè)運(yùn)算符,可讓您簡(jiǎn)明地評(píng)估可能需要if-else語句的表達(dá)式:

condition ? expr1 : expr2
如果條件為真,返回expr1,否則返回expr2

expr1 ?? expr2
如果expr1為非空,則返回其值;否則,計(jì)算并返回expr2的值。

當(dāng)你需要根據(jù)布爾表達(dá)式賦值時(shí),考慮使用?:

var visibility = isPublic ? 'public' : 'private';

如果布爾表達(dá)式測(cè)試為空,考慮使用??

String playerName(String name) => name ?? 'Guest';

前面的例子至少可以用另外兩種方式編寫,但不像以前那么簡(jiǎn)潔:

// 稍微長一點(diǎn)的版本使用 ?: 操作符
String playerName(String name) => name != null ? name : 'Guest';

// 非常長的使用if - else語句的版本
String playerName(String name) {
  if (name != null) {
    return name;
  } else {
    return 'Guest';
  }
}

級(jí)聯(lián)符號(hào)(..)

級(jí)聯(lián)(..)允許您對(duì)同一對(duì)象執(zhí)行一系列操作。除了函數(shù)調(diào)用,您還可以訪問同一對(duì)象上的字段。這通常會(huì)省去創(chuàng)建臨時(shí)變量的步驟,并允許您編寫更多的級(jí)聯(lián)代碼。

示例代碼:

querySelector('#confirm') // 獲取一個(gè)對(duì)象
  ..text = 'Confirm' // 使用它的成員
  ..classes.add('important')
  ..onClick.listen((e) => window.alert('Confirmed!'));

第一個(gè)方法調(diào)用querySelector(),返回一個(gè)selector對(duì)象。遵循級(jí)聯(lián)符號(hào)的代碼對(duì)這個(gè)selector對(duì)象進(jìn)行操作,忽略任何可能返回的后續(xù)值。

前面的例子相當(dāng)于:

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

你也可以嵌套你的級(jí)聯(lián)。例如:

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

在返回實(shí)際對(duì)象的函數(shù)上構(gòu)造級(jí)聯(lián)要小心。例如,以下代碼失敗:

var sb = StringBuffer();
sb.write('foo')
  ..write('bar'); // 錯(cuò)誤:沒有為“void”定義的方法“write”。

sb.write()調(diào)用返回void,你不能在void上構(gòu)建級(jí)聯(lián)。

注意:嚴(yán)格來說,級(jí)聯(lián)的“雙點(diǎn)”符號(hào)不是運(yùn)算符。這只是Dart語法的一部分。


其他操作符

在其他示例中,你已經(jīng)看到了大多數(shù)剩余的運(yùn)算符:

操作符 名稱 含義
() 函數(shù)應(yīng)用 表示函數(shù)調(diào)用
[] 列表訪問 指列表中指定索引處的值
. 成員訪問 指表達(dá)式的屬性;示例: foo.bar從表達(dá)式foo中選擇屬性bar
?. 條件成員訪問 .差不多,但是最左邊的操作數(shù)可以為空;例子:foo?.bar從表達(dá)式foo中選擇屬性bar,除非foo為空(在這種情況下,foo?.bar值為空)

PS:本文整理自官方文檔,若有發(fā)現(xiàn)問題請(qǐng)致郵 caoyanglee92@gmail.com

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 第2章 基本語法 2.1 概述 基本句法和變量 語句 JavaScript程序的執(zhí)行單位為行(line),也就是一...
    悟名先生閱讀 4,193評(píng)論 0 13
  • 目錄 參考資料 語言特性 關(guān)鍵字 變量與常量 數(shù)據(jù)類型 運(yùn)算符 operators 控制流程語句 異常 Excep...
    GuoDongW閱讀 185,240評(píng)論 22 341
  • 版權(quán)聲明:本文為博主原創(chuàng)文章,未經(jīng)博主允許不得轉(zhuǎn)載。http://www.lxweimin.com/p/3d927...
    AWeiLoveAndroid閱讀 94,140評(píng)論 29 307
  • 運(yùn)算符和表達(dá)式 注:按位或是“|” ,賦值 還有“|=”,暫時(shí)沒有找到“|”的轉(zhuǎn)義字符,以后補(bǔ)上; 當(dāng)您使用運(yùn)算符...
    pstommy閱讀 4,894評(píng)論 0 1
  • 家里的院門外有塊大石頭,在我還沒出生的時(shí)候它就在哪里了。只是那時(shí)候它是孤單的存在,直到我們幾兄妹的出生,它才...
    涼溫閱讀 215評(píng)論 0 1