表達式與運算符

2018-07-10 10:12 更新

表達式

表達式為 JavaScript 的短語可執(zhí)行并生成值。

1.7 // 字面量
"1.7"
var a = 1;
var b = '2';
var c = (1.7 + a) * '3' - b

運算符

  • 算數(shù)運算符 (+ - * / %)
  • 關(guān)系運算符 (> < == != >= <= === !==)
  • 邏輯運算符 (! && ||)
  • 位運算符 (& | ^ ~ << >>)
  • 負值運算符 (=)
  • 條件運算符 (?:)
  • 逗號運算符 (,)
  • 對象運算符 (new delete . [] instanceof)

=== 全等符號

全等運算符用于盤對左右兩邊的對象或值是否類型相同且值相等。

偽代碼拆解

function totalEqual(a, b) {
  if (a 和 b 類型相同) {
    if (a 和 b 是引用類型) {
      if (a 和 b 是同一引用)
        return true;
      else
        return false;
    } else { // 值類型
      if (a 和 b 值相等)
        return true;
      else
        return false;
    }
  } else {
    return false;
  }
}

例子

var a = "123";
var b = "123";
var c = "4";
var aObj = new String("123");
var bObj = new String("123");
var cObj = aObj;

a === aObj      // false
aObj === bObj   // false
aObj === cObj   // true
a === b         // true
a === c         // false

==

== 用于判斷操作符兩邊的對象或值是否相等。

偽代碼拆解

function equal(a, b) {
  if (a 和 b 類型相同) {
    return a === b;
  } else { // 類型不同
    return Number(a) === Number(b); // 優(yōu)先轉(zhuǎn)換數(shù)值類型
  }
}

例子

"99" == 99; // true
new String("99") == 99; // true
true == 1; // true
false == 0; // true
'\n\n\n' == // true

例外規(guī)則

  • null == undefined 結(jié)果為真 true
  • 在有 null/undefined 參與的 == 運算是不進行隱式轉(zhuǎn)換。
0 == null; // false
null == false; // false
"undefined" == undefined; // false

! 取反

!x 用于表達 x 表達式的運行結(jié)果轉(zhuǎn)換成布爾值(Boolean)之后取反的結(jié)果。!!x 則表示取 x 表達式的運行結(jié)果的布爾值。

var obj = {};
var a = !obj // false;
var a = !!obj // true;

&& 邏輯與

x && y 如果 x 表達式的運行交過轉(zhuǎn)換成 Boolean 值為 false 則不運行表達式 y 而直接返回 x 表達式的運行結(jié)果。相反,如果 x 表達式的運行交過轉(zhuǎn)換成 Boolean 值為 true 則運行表達式 y 并返回 y 表達式的運行結(jié)果。

偽代碼拆解

var ret = null;
if (!!(ret = x)) {
  return y;
} else {
  return ret;
}

例子

var a = 0 && (function(){return 1 + 1;})(); // 0
var b = 1 && (function(){return 1 + 1;})(); // 2

|| 邏輯或

x || y 如果 x 表達式的運行結(jié)果轉(zhuǎn)換為 Boolean 值為 true,則不運行 表達式 y 而直接返回表達式 x 的運算結(jié)果。(與 && 方式相反)

偽代碼拆解

var ret = null;
if (!!(ret = x)) {
  return ret;
} else {
  return y;
}

例子

var a = 0 || (function(){return 1 + 1;})(); // 2
var b = 1 || (function(){return 1 + 1;})(); // 1

元算符優(yōu)先級(Operator Precedence)

  • + - * / 高于 &&
  • * / 高于 + -
  • && 高于 ?:
  • () 內(nèi)優(yōu)先級高于之外

NOTE:和數(shù)學(xué)上的算術(shù)優(yōu)先級類似,同級從左到右計算。如有疑問加上 () 既可解決優(yōu)先級問題。

PrecedenceOperator typeAssociativityIndividual operators
19Groupingn/a( … )
18Member Accessleft-to-right… . …
Computed Member Accessleft-to-right… [ … ]
new (with argument list)n/anew … ( … )
17Function Callleft-to-right… ( … )
new (without argument list)right-to-leftnew …
16Postfix Incrementn/a… ++
Postfix Decrementn/a… --
15Logical NOTright-to-left! …
Bitwise NOTright-to-left~ …
Unary Plusright-to-left+ …
Unary Negationright-to-left- …
Prefix Incrementright-to-left++ …
Prefix Decrementright-to-left-- …
typeofright-to-lefttypeof …
voidright-to-leftvoid …
deleteright-to-leftdelete …
14Multiplicationleft-to-right… * …
Divisionleft-to-right… / …
Remainderleft-to-right… % …
13Additionleft-to-right… + …
Subtractionleft-to-right… - …
12Bitwise Left Shiftleft-to-right… << …
Bitwise Right Shiftleft-to-right… >> …
Bitwise Unsigned Right Shiftleft-to-right… >>> …
11Less Thanleft-to-right… < …
Less Than Or Equalleft-to-right… <= …
Greater Thanleft-to-right… > …
Greater Than Or Equalleft-to-right… >= …
inleft-to-right… in …
instanceofleft-to-right… instanceof …
10Equalityleft-to-right… == …
Inequalityleft-to-right… != …
Strict Equalityleft-to-right… === …
Strict Inequalityleft-to-right… !== …
9Bitwise ANDleft-to-right… & …
8Bitwise XORleft-to-right… ^ …
7Bitwise ORleft-to-right… | …
6Logical ANDleft-to-right… && …
5Logical ORleft-to-right… || …
4Conditionalright-to-left… ? … : …
3Assignmentright-to-left… = …
… += …
… -= …
… *= …
… /= …
… %= …
… <<= …
… >>= …
… >>>= …
… &= …
… ^= …
… |= …
2yieldright-to-leftyield …
1Spreadn/a... …
0Comma / Sequenceleft-to-right… , …


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號