javascript 運算符

運算符

JavaScript中運算符主要用于連接簡單表達式怕敬,組成一個復雜的表達式地啰。
常見的有算數表達式荠瘪、比較表達式啸胧、邏輯表達式扳缕、賦值表達式等锥腻,也有單目運算符嘱函,指操作原始表達式蓉驹。
大多數運算符都由標點符號組成(+曹宴、>=搂橙、!),也有關鍵字表示的運算符笛坦,如typeof区转、deleteinstanceof等版扩。

一些運算符可以作用于任何數據類型(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運算符的作用是執(zhí)行一個表達式彻坛,然后返回undefined。

逗號運算符

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

運算符優(yōu)先級與結合性

優(yōu)先級什么意思大家都清楚,結合性是指多個具有同樣優(yōu)先級的運算符表達式中的運算順序茵瀑。有的運算符是左結合的间驮,即運算從左到右執(zhí)行马昨,下面兩個運算是一樣的

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));

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

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

相等

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

  • 如果兩個值類型相同听诸,則執(zhí)行嚴格相等的運算
  • 如果兩個值的類型
    • 不同如果一個是null坐求,一個是undefined,那么相等
    • 如果一個是數字晌梨,一個是字符串桥嗤,先將字符串轉為數字,然后比較
    • 如果一個值是true/false則將其轉為1/0比較
    • 如果一個值是對象泛领,一個是數字或字符串敛惊,則嘗試使用valueOf和toString轉換后比較
    • 其它就不相等了
null==undefined;
NaN==NaN
"1"==true
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市锡宋,隨后出現的幾起案子特恬,更是在濱河造成了極大的恐慌,老刑警劉巖役首,帶你破解...
    沈念sama閱讀 216,544評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件衡奥,死亡現場離奇詭異远荠,居然都是意外死亡,警方通過查閱死者的電腦和手機乏屯,發(fā)現死者居然都...
    沈念sama閱讀 92,430評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蛤迎,“玉大人含友,你說我怎么就攤上這事×就” “怎么了惠赫?”我有些...
    開封第一講書人閱讀 162,764評論 0 353
  • 文/不壞的土叔 我叫張陵儿咱,是天一觀的道長。 經常有香客問我怠缸,道長钳宪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,193評論 1 292
  • 正文 為了忘掉前任搔体,我火速辦了婚禮嫉柴,結果婚禮上奉呛,老公的妹妹穿的比我還像新娘。我一直安慰自己登馒,他們只是感情好咆槽,可當我...
    茶點故事閱讀 67,216評論 6 388
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著麦射,像睡著了一般。 火紅的嫁衣襯著肌膚如雪蛔琅。 梳的紋絲不亂的頭發(fā)上峻呛,一...
    開封第一講書人閱讀 51,182評論 1 299
  • 那天钩述,我揣著相機與錄音,去河邊找鬼职恳。 笑死谜悟,一個胖子當著我的面吹牛北秽,可吹牛的內容都是我干的。 我是一名探鬼主播贺氓,決...
    沈念sama閱讀 40,063評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼辙培,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了搀别?” 一聲冷哼從身側響起尾抑,我...
    開封第一講書人閱讀 38,917評論 0 274
  • 序言:老撾萬榮一對情侶失蹤再愈,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后垂睬,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 45,329評論 1 310
  • 正文 獨居荒郊野嶺守林人離奇死亡钳枕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,543評論 2 332
  • 正文 我和宋清朗相戀三年么伯,在試婚紗的時候發(fā)現自己被綠了卡儒。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,722評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡硬爆,死狀恐怖缀磕,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情袜蚕,我是刑警寧澤绢涡,帶...
    沈念sama閱讀 35,425評論 5 343
  • 正文 年R本政府宣布雄可,位于F島的核電站,受9級特大地震影響数苫,放射性物質發(fā)生泄漏。R本人自食惡果不足惜箱残,卻給世界環(huán)境...
    茶點故事閱讀 41,019評論 3 326
  • 文/蒙蒙 一被辑、第九天 我趴在偏房一處隱蔽的房頂上張望赏殃。 院中可真熱鬧,春花似錦仁热、人聲如沸勾哩。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,671評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至威兜,卻和暖如春庐椒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笔宿。 一陣腳步聲響...
    開封第一講書人閱讀 32,825評論 1 269
  • 我被黑心中介騙來泰國打工棱诱, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人炬灭。 一個月前我還...
    沈念sama閱讀 47,729評論 2 368
  • 正文 我出身青樓担败,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子吗货,可洞房花燭夜當晚...
    茶點故事閱讀 44,614評論 2 353

推薦閱讀更多精彩內容