javascript 運算符

運算符

JavaScript中運算符主要用于連接簡單表達式,組成一個復雜的表達式。
常見的有算數表達式比較表達式邏輯表達式賦值表達式等,也有單目運算符,指操作原始表達式。
大多數運算符都由標點符號組成(+、>=、!),也有關鍵字表示的運算符,如typeofdeleteinstanceof等。

一些運算符可以作用于任何數據類型(typeof),但大部分操作符希望操作數是特定的類型,而且大部分操作符會計算出(我們也常說返回)一個特定類型的值(typeof返回的全是string)。在JavaScript中運算符通常會根據需要對操作數進行類型轉換,乘法操作符希望操作數是數字,但是 "3" * "5"也是合法的,JavaScript會自動將其轉換為數字計算,返回Number 15。

有些操作符對不同的數據類型有不同的含義,比如+

  • 在兩個操作數都是數字的時候,會做加法運算
  • 兩個參數都是字符串或在有一個參數是字符串的情況下會把另外一個參數轉換為字符串做字符串拼接
  • 在參數有對象的情況下會調用其valueOf或toString
  • 在只有一個字符串參數的時候會嘗試將其轉換為數字
  • 在只有一個數字參數的時候返回其正數值
console.log(2+4);  //6
console.log("2"+"4");  //"24"
console.log(2+"4");  //"24"
console.log(2+new Date());  //"2Mon Jan 20 2014 17:15:01 GMT+0800 (China Standard Time)"
console.log(+"4");  //4

遠算符類型

算數運算符
  • 加法運算符(Addition):x + y
  • 減法運算符(Subtraction): x - y
  • 乘法運算符(Multiplication): x * y
  • 除法運算符(Division):x / y
  • 余數運算符(Remainder):x % y
  • 自增運算符(Increment):++x 或者 x++
  • 自減運算符(Decrement):--x 或者 x--
  • 求負運算符(Negate):-x
  • 數值運算符(Convert to number): +x
賦值運算符

賦值運算符用于給變量賦值,最常見的賦值運算符,當然就是等號,表達式 x = y 表示將y賦值給x。除此之外,JavaScript 還提供其他 11 個賦值運算符。

x += y // 等同于 x = x + y
x -= y // 等同于 x = x - y
x *= y // 等同于 x = x * y
x /= y // 等同于 x = x / y
x %= y // 等同于 x = x % y
x >>= y // 等同于 x = x >> y
x <<= y // 等同于 x = x << y
x >>>= y // 等同于 x = x >>> y
x &= y // 等同于 x = x & y
x |= y // 等同于 x = x | y
x ^= y // 等同于 x = x ^ y
比較運算符

比較運算符比較兩個值,然后返回一個布爾值,表示是否滿足比較條件。JavaScript 提供了 8 個比較運算符。

  • ==相等
  • === 嚴格相等
  • != 不相等
  • !== 嚴格不相等
  • < 小于
  • <= 小于或等于
  • > 大于
  • >= 大于或等于
布爾運算符
  • ! 取反運算符
  • && 且運算符
  • || 或運算符
  • condition? true case : false case 三元條件運算符
位運算符
  • 或運算(or):符號為 |,表示兩個二進制位中有一個為1,則結果為1,否則為0。
  • 與運算(and):符號為&,表示兩個二進制位都為1,則結果為1,否則為0。
  • 否運算(not):符號為,表示將一個二進制位變成相反值。
  • 異或運算(xor):符號為?,表示兩個二進制位中有且僅有一個為1時,結果為1,否則為0。
  • 左移運算(left shift):符號為<<
  • 右移運算(right shift):符號為>>
  • 帶符號位的右移運算(zero filled right shift):符號為>>>
其它
小括號

在JavaScript中,圓括號是一種運算符,它有兩種用法:如果把表達式放在圓括號之中,作用是求值;如果跟在函數的后面,作用是調用函數。
把表達式放在圓括號之中,將返回表達式的值。

void

void運算符的作用是執行一個表達式,然后返回undefined。

逗號運算符

逗號運算符用于對兩個表達式求值,并返回后一個表達式的值。

運算符優先級與結合性

優先級什么意思大家都清楚,結合性是指多個具有同樣優先級的運算符表達式中的運算順序。有的運算符是左結合的,即運算從左到右執行,下面兩個運算是一樣的

w = x + y + z;
w = (x + y) + z;

有的運算符是右結合的

w = x = y = z;
w = (x = (y = z));
w = a: b: c ? d : e? f : g;
w = a? b : (c? d: (e? f : g));

運算符的優先級《JavaScript權威指南》中有個表闡述的很好(我去掉了位運算部分),其中R/L代表結合性是右結合還是左結合,num->num表示操作符期望的數據類型和計算結果類型,lval指左值

運算符 操作 結合性 類型
++ 自增 R lval->num
-- 自減 R lval->num
- 求反 R num->num
+(一個操作數) 轉換為數字 R num->num
~ 按位求反 R int->int
! 邏輯非 R bool->bool
delete 刪除屬性 R lval->bool
typeof 檢測數據類型 R any->str
void 返回undefined R any->undefined
-- -- -- --
*、/、% 乘、除、求余 L num,num->num
-- -- -- --
+、- 加、減 L num,num->num
+ 字符串拼接 L str,str->str
<、<=、>、>= 數字大小或字母表順序 L num/str,num/str->bool
instanceof 對象類型 L obj,function->bool
in 測試屬性是否存在 L str,obj->bool
-- -- -- --
== 判斷相等 L any,any->bool
!= 判斷不等 L any,any->bool
=== 判斷恒等 L any,any->bool
!== 判斷非恒等 L any,any->bool
-- -- -- --
&& 邏輯與 L any,any->any
|| 邏輯或 L any,any->any
?: 條件運算符 R bool,any,any->any
=賦值 *=、/=、+=、-= 賦值 運算且賦值 R lval,any->any
, 忽略第一個操作數,返回第二個操作數 L any,any->any

MDN 參考

有幾個我們需要注意的地方

  1. typeof的優先級相當的高,比加減乘除神馬的都高,所以雖然是操作符,在在復雜表達式的時候我們還是習慣加括號,看個例子
typeof 2*3;  //NaN
typeof (2*3);  //"number"
typeof 2+3;  //"number3"
  1. ++、--是右結合的操作符(優先級最高的幾個都是右結合),而且比加減乘除優先級高。同時自增、自減運算符的運算數得是左值(可以放在賦值符號左邊的值),而不能是常數
4++; //ReferenceError: Invalid left-hand side expression in postfix operation
var a=0,b=0;
a+++b;//0
a;//1,++優先級比+高,所以相當于(a++)+b
b;//0
  1. 賦值運算符的優先級相當的低
a = b == c; //等同于a = (b==c)
  1. 邏輯非!也在優先級隊列的前端,比加減乘除高,但邏輯與、邏輯或優先級很低,不如加減乘除
!2*0; //0, 等價于(!2)*0
  1. 一個關于邏輯運算符的有意思地方是其“短路”功能,相信大家都有所了解,但有些題目不那么單純,會結合表達式計算值來考察
1 && 3; 
1 && "foo" || 0;
1 || "foo" && 0

了解了邏輯運算符的“短路”特點,在知道原始表達式的“返回值”就是本身,題目就很簡單了

相等

我們知道可以使用=====判斷兩個值的相等性,其中區別相信大家清楚,===是嚴格意義的相等,只需注意NaN和NaN不等就行了。而使用==的時候,javascript會幫我們做類型轉換,造成一些匪夷所思的結果,那么使用``==
的時候會在哪些情況下做類型轉換,又會換成什么樣子?

  • 如果兩個值類型相同,則執行嚴格相等的運算
  • 如果兩個值的類型
    • 不同如果一個是null,一個是undefined,那么相等
    • 如果一個是數字,一個是字符串,先將字符串轉為數字,然后比較
    • 如果一個值是true/false則將其轉為1/0比較
    • 如果一個值是對象,一個是數字或字符串,則嘗試使用valueOf和toString轉換后比較
    • 其它就不相等了
null==undefined;
NaN==NaN
"1"==true
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 229,117評論 6 537
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,860評論 3 423
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 177,128評論 0 381
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,291評論 1 315
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,025評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,421評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,477評論 3 444
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,642評論 0 289
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,177評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,970評論 3 356
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,157評論 1 371
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,717評論 5 362
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,410評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,821評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,053評論 1 289
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,896評論 3 395
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,157評論 2 375

推薦閱讀更多精彩內容