現代[JavaScript] 程式設計教學:使用運算子(Operator)

文章推薦指數: 80 %
投票人數:10人

本文介紹JavaScript 中可用的運算子。

... 代數運算子使用方式如同數學上的代數,像 2 + 3 * 5 會先運算 3 * 5 再加 2 ,如果 ... 以下是JavaScript 的二位元運算子:. Togglenavigation開源教學精選項目C語言Golang資料結構網頁程式電子書籍現代C語言程式設計C語言應用程式設計多平台Objective-C程式設計跨平台CommonLisp程式設計社群媒體臉書粉絲團臉書社團推特GitHubGumroad本站資訊關於著作權免責聲明隱私權開源教學JavaScript程式設計使用運算子(Operator)最後修改日期為JUN6,2019前言在程式語言中,運算子(operator)視為該語言基本的指令,通常不能再拆分成更小的單位。

本文介紹JavaScript中可用的運算子。

自製斷言(Assertion)傳統上,程式語言的教材會用終端機輸出文字,再由程式撰寫者判讀。

但這樣的方式並沒有充份利用到電腦程式自動化的功能,因為每次的判讀皆需要人工作業。

比較好的方式,是透過斷言(assertion)來判定程式是否錯誤。

所謂的斷言,是用來確認某段程式是否正確的程式碼。

雖然JavaScript沒有內建的斷言,我們可以自己寫一個簡易版的斷言。

參考以下實例:/*Home-madeassertion.*/ functionassert(cond,msg){ if(!(cond)){ throw(msg?msg:'Assertionfailed'); } } assert(1+1===2,"1+1shouldbe2"); 在本例中,assert是一個函式,該函式在cond不為真時,會拋出msg字串並中止程式運行。

斷言基本上就是執行這樣的任務,我們這裡用簡易的方法來實作斷言。

雖然我們還沒正式學函式的寫法,這個函式很短,可以試著讀讀看。

代數運算子(ArithmeticOperator)代數運算子(arithmeticoperator)用來進行基本的四則運算。

ECMAScript支援以下代數運算子:+:相加-:相減*:相乘/:相除%:取餘數+:取正號-:取負號++:遞增(加1)--:遞減(減1)代數運算子使用方式如同數學上的代數,像2+3*5會先運算3*5再加2,如果要改變其順序,可用中括號,像(2+3)*5會先計算(3+5)再乘5。

以下是使用代數運算子的實例:/*Home-madeassertion.*/ functionassert(cond,msg){ if(!(cond)){ throw(msg?msg:'Assertionfailed'); } } assert(3+4==7,"Wrongvalue"); assert(3-4==-1,"Wrongvalue"); assert(3*4==12,"Wrongvalue"); assert(3/4==0.75,"Wrongvalue"); assert(3%4==3,"Wrongvalue"); 由於JavaScript沒有內建的斷言(assertion),我們自製了一個簡易的版本。

使用斷言取代終端機輸出,可以讓我們清楚地表達程式的意圖,也可讓程式自動進行檢查。

由於ECMAScript的數字是浮點數,相除時可能會得到有小數點的數,這時候,可視需求使用Math.round()(四捨五入)、Math.floor()(無條件捨去)或是Math.ceil()(無條件進位)取至整數位。

如下例:/*Home-madeassertion.*/ functionassert(cond,msg){ if(!(cond)){ throw(msg?msg:'Assertionfailed'); } } assert(Math.round(4.5)===5,"Wrongvalue"); assert(Math.floor(4.5)===4,"Wrongvalue"); assert(Math.ceil(4.5)===5,"Wrongvalue"); 遞增或遞減是一種語法糖,基本上就是把x=x+1簡化的語法。

遞增/減可以前置或後置,會影響到變數的狀態,如下例:/*Home-madeassertion.*/ functionassert(cond,msg){ if(!(cond)){ throw(msg?msg:'Assertionfailed'); } } letx=4; //DON'TDOTHISinproductioncode. lety=++x+x++; assert(x===6,"Wrongvaluex"); assert(y===10,"Wrongvaluey"); 在這個例子中,x遞增兩次,故得6。

y在x遞增一次後(當下為5)自身疊加一次,故得10。

雖然這是合法的JavaScript程式,但閱讀此段程式碼的人往往需多想一下程式的狀態;筆者建議不要去強記前置或後置的規則,把遞增/減寫在單獨的一行比較好。

比較運算子(RelationalOperator)比較運算子(relationaloperator)用來比較兩資料間的大小。

以下是JavaScript的比較運算子:===:嚴格相等!==:嚴格不等==:相等!=:不等>:大於>=:大於等於3,"Wrongrelation"); assert(4>=3,"Wrongrelation"); assert(3===3,"Wrongrelation"); assert(5!==3,"Wrongrelation"); assert(3<4,"Wrongrelation"); assert(3<=4,"Wrongrelation"); JavaScript使用兩種不同的相等/不等運算子,一般情形下,建議用嚴格相等/不等運算子,因為另一種相等/不等運算子有著複雜的隱性轉換規則(共23種),與其去強記那些複雜的規則不如用比較單純的嚴格相等/不等運算子。

字串運算子JavaScript用+做為字串相接的運算子:+:相接在ECMAScript6以後,可以直接用字串模板(templateliteral)取代大部分的字串相接運算子。

搭配Babel的話,可以把字串模板轉為合法的ES5字串,不用手動串連字串。

邏輯運算子邏輯運算是用來結合多個條件時使用,有以下運算子:&&:且(and)||:或(or)!:否(not)一般計算機概論的書籍會列真值表,不要特別去背誦,只要記住以下原則即可:且(and):所有條件皆為真時才為真或(or):只要其中一個條件為真時即為真以下是實例:/*Home-madeassertion.*/ functionassert(cond,msg){ if(!(cond)){ throw(msg?msg:'Assertionfailed'); } } //&&(and) assert((true&&true)===true,"Wronglogic"); assert((true&&false)===false,"Wronglogic"); assert((false&&true)===false,"Wronglogic"); assert((false&&false)===false,"Wronglogic"); //||(or) assert((true||true)===true,"Wronglogic"); assert((true||false)===true,"Wronglogic"); assert((false||true)===true,"Wronglogic"); assert((false||false)===false,"Wronglogic"); //!(not) assert((!true)===false,"Wronglogic"); assert((!false)===true,"Wronglogic"); 三元運算子(TernaryOperator)三元運算子是較簡短的if…else…語法,主要用於一行內的短敘述:(condition)?..:..由於三元運算子是表達式(expression),會回傳值。

以下是實例:/*Home-madeassertion.*/ functionassert(cond,msg){ if(!(cond)){ throw(msg?msg:'Assertionfailed'); } } letn=5>3?5:3; assert(n===5,`Wrongvalue:${n}`); 二元運算運算子(BitwiseOperators)以下是JavaScript的二位元運算子:bitwiseand&bitwiseor|bitwisexor^bitwisenot~leftshift<>zero-fillrightshift>>>雖然二位元運算對一般讀者來說比較陌生,但適度地運用二位元運算可節省運算時間,以下是一個例子:/*Home-madeassertion.*/ functionassert(cond,msg){ if(!(cond)){ throw(msg?msg:'Assertionfailed'); } } leta=3;//00000011 letb=5;//00000101 /*00000011 &)00000101 ------------- 00000001*/ assert((a&b)===1,"3&5shouldbe1"); /*00000011 |)00000101 ------------- 00000111*/ assert((a|b)===7,"3|5shouldbe7"); /*00000011 ^)00000101 ------------- 00000110*/ assert((a^b)===6,"3^5shouldbe6"); 二元運算在日常生活中不會用到,有些讀者可能會對二元運算感到陌生,筆者在註解處寫下運算過程,供讀者參考。

如果讀者想學二元運算,可以翻閱計算機概論等書籍,此處不詳談。

型別檢查運算子JavaScript使用typeof做為型別運算子,typeof會回傳一個字串,該字串表示資料的型別,可能的回傳值如下:"undefined""boolean""number""string"(新)"symbol""function""object"由於JavaScript的物件系統是以原型(prototype)為基礎,物件沒有類別(class)的概念,我們無法用typeof來檢查物件的型別,程式設計者需要改變對物件的思維。

我們將於後文說明JavaScript的物件系統。

指派運算子(AssignmentOperators)指派運算子算是一種語法糖,將x=x+1簡化為x+=1,大部分的代數運算子和二元運算子都有相對應的指派運算子:+=-=*=/=%=<<=>>=>>>=&=|=^=(新)解構運算(DestructingAssignment)解構運算是ECMAScript6之後所加入的新功能,主要是簡化從物件中取出資料的過程;雖然不是必備的特性,但的確可以縮減一些程式碼,如下例:/*Home-madeassertion.*/ functionassert(cond,msg){ if(!(cond)){ throw(msg?msg:'Assertionfailed'); } } constobj={b:2,c:3,d:4}; //Destructingassignment. const{a,b,c}=obj; assert(typeofa==="undefined","ashouldbeundefined"); assert(b===2,"bshouldbe2"); assert(c===3,"cshouldbe3"); 在這個例子中,a沒有值,故為未定義的(undefined),b和c則各自指派到特定值。

分享本文追蹤本站



請為這篇文章評分?