三·JS運算符

JavaScript中運算符主要用于連接簡單表達式把沼,組成一個復雜的表達式。常見的有算數(shù)表達式吁伺、比較表達式饮睬、邏輯表達式、賦值表達式等箱蝠,也有單目運算符续捂,指操作原始表達式。大多數(shù)運算符都由標點符號組成(+宦搬、>=牙瓢、!),也有關(guān)鍵字表示的運算符间校,如typeof矾克、delete、instanceof等憔足。

一些運算符可以作用于任何數(shù)據(jù)類型(typeof)胁附,但大部分操作符希望操作數(shù)是特定的類型,而且大部分操作符會計算出(我們也常說返回)一個特定類型的值(typeof返回的全是string)滓彰。在JavaScript中運算符通常會根據(jù)需要對操作數(shù)進行類型轉(zhuǎn)換控妻,乘法操作符希望操作數(shù)是數(shù)字,但是 "3" * "5"也是合法的揭绑,JavaScript會自動將其轉(zhuǎn)換為數(shù)字計算缆巧,返回Number 15米绕。
有些操作符對不同的數(shù)據(jù)類型有不同的含義著淆,比如 +:

  • 在兩個操作數(shù)都是數(shù)字的時候却盘,會做加法運算。
  • 兩個參數(shù)都是字符串或在有一個參數(shù)是字符串的情況下會把另外一個 - 參數(shù)轉(zhuǎn)換為字符串做字符串拼接邦蜜。
  • 在參數(shù)有對象的情況下會調(diào)用其valueOf或toString依鸥。
  • 在只有一個字符串參數(shù)的時候會嘗試將其轉(zhuǎn)換為數(shù)字。
  • 在只有一個數(shù)字參數(shù)的時候返回其正數(shù)值悼沈。
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 

遠算符類型

算數(shù)運算符

- 加法運算符(Addition):x + y
- 減法運算符(Subtraction): x - y
- 乘法運算符(Multiplication): x * y
- 除法運算符(Division):x / y
- 余數(shù)運算符(Remainder):x % y
- 自增運算符(Increment):++x 或者 x++
自減運算符(Decrement):--x 或者 x--
求負運算符(Negate):-x
數(shù)值運算符(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,則結(jié)果為1包雀,否則為0宿崭。
- 與運算(and):符號為&,表示兩個二進制位都為1才写,則結(jié)果為1葡兑,否則為0。
- 否運算(not):符號為~赞草,表示將一個二進制位變成相反值讹堤。
- 異或運算(xor):符號為?,表示兩個二進制位中有且僅有一個為1時厨疙,結(jié)果為1洲守,否則為0。
- 左移運算(left shift):符號為<<
- 右移運算(right shift):符號為>>
- 帶符號位的右移運算(zero filled right shift):符號為>>>

其他

小括號

在JavaScript中沾凄,圓括號是一種運算符梗醇,它有兩種用法:如果把表達式放在圓括號之中,作用是求值撒蟀;如果跟在函數(shù)的后面叙谨,作用是調(diào)用函數(shù)。
把表達式放在圓括號之中保屯,將返回表達式的值唉俗。

void

void運算符的作用是執(zhí)行一個表達式,然后返回undefined配椭。

逗號運算符

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

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

運算符 操作 結(jié)合性 類型
++ 自增 R lval->num
-- 自減 R lval->num
- 求反 R num->num
+ (一個操作數(shù))轉(zhuǎn)換為數(shù)字 R num->num
~ 按位求反 R int->int
! 邏輯非 R bool->bool
delete 刪除屬性 R lval->bool
typeof 檢測數(shù)據(jù)類型 R any->str
void 返回undefined R any->undefined
*股缸、/、% 乘吱雏、除敦姻、求余 L num,num->num
+、- 加歧杏、減 L num,num->num
+ 字符串拼接 L str,str->str
<镰惦、<=、>犬绒、>= 數(shù)字大小或字母表順序 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
, 忽略第一個操作數(shù)礼华,返回第二個操作數(shù) L any,any->any

優(yōu)先級什么意思大家都清楚,結(jié)合性是指多個具有同樣優(yōu)先級的運算符表達式中的運算順序拗秘。有的運算符是左結(jié)合的圣絮,即運算從左到右執(zhí)行,下面兩個運算是一樣的
w = x + y + z;
w = (x + y) + z;
有的運算符是右結(jié)合的
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權(quán)威指南》中有個表闡述的很好(我去掉了位運算部分)雕旨,其中R/L代表結(jié)合性是右結(jié)合還是左結(jié)合扮匠,num->num表示操作符期望的數(shù)據(jù)類型和計算結(jié)果類型,lval指左值凡涩。

運算符 操作 結(jié)合性 類型
++ 自增 R lval->num
-- 自減 R lval->num
- 求反 R num->num
+ (一個操作數(shù))轉(zhuǎn)換為數(shù)字 R num->num
~ 按位求反 R int->int
! 邏輯非 R bool->bool
delete 刪除屬性 R lval->bool
typeof 檢測數(shù)據(jù)類型 R any->str
void 返回undefined R any->undefined
*棒搜、/、% 乘突照、除帮非、求余 L num,num->num
+、- 加讹蘑、減 L num,num->num
+ 字符串拼接 L str,str->str
<末盔、<=、>座慰、>= 數(shù)字大小或字母表順序 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
, 忽略第一個操作數(shù),返回第二個操作數(shù) L any,any->any

注意:

1.typeof的優(yōu)先級相當?shù)母呗福燃訙p乘除神馬的都高益缎,所以雖然是操作符,在在復雜表達式的時候我們還是習慣加括號然想,看個例子

typeof 2*3;//NaN
typeof (2*3);//"number"
typeof 2+3;// "number3"

2.++莺奔、--是右結(jié)合的操作符(優(yōu)先級最高的幾個都是右結(jié)合),而且比加減乘除優(yōu)先級高变泄。同時自增令哟、自減運算符的運算數(shù)得是左值(可以放在賦值符號左邊的值),而不能是常數(shù)

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

3.賦值運算符的優(yōu)先級相當?shù)牡?/p>

a = b == c; //等同于a = (b==c)

4.邏輯非!也在優(yōu)先級隊列的前端,比加減乘除高蛙卤,但邏輯與狠半、邏輯或優(yōu)先級很低,不如加減乘除

!2*0; //0, 等價于(!2)*0

5.一個關(guān)于邏輯運算符的有意思地方是其“短路”功能,相信大家都有所了解典予,但有些題目不那么單純甜滨,會結(jié)合表達式計算值來考察

1 && 3;
1 && "foo" || 0;
1 || "foo" && 0

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

相等

相等

我們知道可以使用==或===判斷兩個值的相等性衣摩,其中區(qū)別相信大家清楚,===是嚴格意義的相等捂敌,只需注意NaN和NaN不等就行了艾扮。而使用==的時候,javascript會幫我們做類型轉(zhuǎn)換占婉,造成一些匪夷所思的結(jié)果泡嘴,那么使用==的時候會在哪些情況下做類型轉(zhuǎn)換,又會換成什么樣子逆济?
1.如果兩個值類型相同酌予,則執(zhí)行嚴格相等的運算
2.如果兩個值的類型不同
3.如果一個是null,一個是undefined奖慌,那么相等
4.如果一個是數(shù)字抛虫,一個是字符串,先將字符串轉(zhuǎn)為數(shù)字简僧,然后比較
5.如果一個值是true/false則將其轉(zhuǎn)為1/0比較
6.如果一個值是對象建椰,一個是數(shù)字或字符串,則嘗試使用valueOf和toString轉(zhuǎn)換后比較
7.其它就不相等了

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末岛马,一起剝皮案震驚了整個濱河市棉姐,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌啦逆,老刑警劉巖伞矩,帶你破解...
    沈念sama閱讀 219,539評論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異夏志,居然都是意外死亡扭吁,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,594評論 3 396
  • 文/潘曉璐 我一進店門盲镶,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人蝌诡,你說我怎么就攤上這事溉贿。” “怎么了浦旱?”我有些...
    開封第一講書人閱讀 165,871評論 0 356
  • 文/不壞的土叔 我叫張陵宇色,是天一觀的道長。 經(jīng)常有香客問我,道長宣蠕,這世上最難降的妖魔是什么例隆? 我笑而不...
    開封第一講書人閱讀 58,963評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮抢蚀,結(jié)果婚禮上镀层,老公的妹妹穿的比我還像新娘。我一直安慰自己皿曲,他們只是感情好唱逢,可當我...
    茶點故事閱讀 67,984評論 6 393
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屋休,像睡著了一般坞古。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上劫樟,一...
    開封第一講書人閱讀 51,763評論 1 307
  • 那天痪枫,我揣著相機與錄音,去河邊找鬼叠艳。 笑死奶陈,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的虑绵。 我是一名探鬼主播尿瞭,決...
    沈念sama閱讀 40,468評論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼翅睛!你這毒婦竟也來了声搁?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,357評論 0 276
  • 序言:老撾萬榮一對情侶失蹤捕发,失蹤者是張志新(化名)和其女友劉穎疏旨,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體扎酷,經(jīng)...
    沈念sama閱讀 45,850評論 1 317
  • 正文 獨居荒郊野嶺守林人離奇死亡檐涝,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,002評論 3 338
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了法挨。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谁榜。...
    茶點故事閱讀 40,144評論 1 351
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖凡纳,靈堂內(nèi)的尸體忽然破棺而出窃植,到底是詐尸還是另有隱情,我是刑警寧澤荐糜,帶...
    沈念sama閱讀 35,823評論 5 346
  • 正文 年R本政府宣布巷怜,位于F島的核電站葛超,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏延塑。R本人自食惡果不足惜绣张,卻給世界環(huán)境...
    茶點故事閱讀 41,483評論 3 331
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望关带。 院中可真熱鬧侥涵,春花似錦、人聲如沸豫缨。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,026評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽好芭。三九已至燃箭,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舍败,已是汗流浹背招狸。 一陣腳步聲響...
    開封第一講書人閱讀 33,150評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留邻薯,地道東北人裙戏。 一個月前我還...
    沈念sama閱讀 48,415評論 3 373
  • 正文 我出身青樓,卻偏偏與公主長得像厕诡,于是被迫代替她去往敵國和親累榜。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,092評論 2 355

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