一篇文章弄懂ECMAScript中的操作符
目錄
- 一元操作符
- 布林操作符
- 乘性操作符
- 加性操作符
- 關係操作符
- 相等操作符
- 條件操作符
- 賦值操作符
- 逗號操作符
- 總結
一元操作符
只能操作一個值的操作符叫做一元操作符
遞增和遞減。遞增和遞減操作符借鑑自C,而且有兩個版本:前置型和後置型
- 前置型:操作符位於要操作的變數之前。執行前置型遞增和遞減操作時,變數的值都是在語句被求值以前改變的
var age = 29; var anotherAge = --age + 2 console.log(age) // 28 console.log(anotherAge) // 30
後置型:操作符位於要操作的變數之後。後置型遞增和遞減操作是在包含它們的語句被求值之後才執行的
var num1 - 2; var num2 = 20 var num3 = num1-- + num2; // 22 var num4 = num1 + num2; // 21
以上4個操作符對任何值都適用,即可以用於字串、布林值、浮點數值和物件。遵循下列規則:
- 在應用於一個包含有效數字字元的字串時,先將其轉換為數字值,再執行加減1的操作。字串變數變成數值變數
- 在應用於一個不包含有數字字元的字串時,將變數的值設定為NaN。字串變數變成數值變數
- 在應用於布林值false時,先將其轉換為0再執行加減1的操作。布林值變數變成數值變數
- 在應用於布林值true時,先將其轉換為0再執行加減1的操作。布林值變數變成數值變數
- 在應用於浮點數值時,執行加減1的操作
- 在應用於物件時,先呼叫物件的valueOf()方法以取得一個可供操作的值,然後對該值應用上述規則。如果是NaN,則呼叫toString()方法後再應用上述規則。物件變數變成數值變數
上述規則驗證:
var s1 = "2"; var s2 = "z"; var b = false; var f = 1.1; var o = { valueOf: function () { return -1 } } console.log(s1++); // 2 console.log(s1); // 3 console.log(s2++); // NaN console.log(s2); // NaN console.log(b++); // 0 console.log(b); // 1 console.log(f--); // 1.1 console.log(f); // 0.1000000000000009 console.log(o--); // -1 console.log(o); // -2
一元加和減操作符
一元加和減操作符主要用於基本的算術運算,也可以用於轉換資料型別,即在對非數值應用一元操作符時,該操作符會像Number()轉型函式一樣對這個值執行轉換。布林值false和true將被轉換為0和1,字串值會被按照一組特殊的規則進行解析,物件是先呼叫它們的valueOf()或toString()方法,再轉換得到的值。以一元加操作符為例:
var s1 = "01"; var s2 = "1.1"; var s3 = "z"; var b = false; var f = 1.1; var o = { valueOf: function () { return -1 } } s1 = +s1 s2 = +s2 s3 = +s3 b = +b f = +f o = +o console.log(s1) // 1 console.log(s2) // 1.1 console.log(s3) // NaN console.log(b) // 0 console.log(f) // 1.1 console.log(o) // -1
布林操作符
布林操作符一共有3個:非(NOT)、與(AND)和或(OR)
1、邏輯非。由一個英文歎號(!)表示,可以用於ECMAScript中的任何值。無論運算元是個什麼資料型別,這個操作符都會返回一個布林值。邏輯非操作符首先會將它的運算元轉換為一個布林值,然後對其求反。遵循一下規則
- 如果運算元是一個物件,返回false
- 如果運算元是一個空字串,返回true
- 如果運算元是一個非空字串,返回false
- 如果運算元是數值0,返回true
- 如果運算元是任意非0數值(包括Infinity),返回false
- 如果運算元是null,返回true
- 如果運算元是NaN,返回true
- 如果運算元是undefined,返回true
console.log(!false); // true console.log(!"blue"); // false console.log(!""); // true console.log(!0); // true console.log(!undefined); // true console.log(!null); // true console.log(!NaN); // true console.log(!12345); false
2、邏輯與。操作符由兩個和號(&&)表示,有兩個運算元。邏輯與操作可以應用與任何型別的運算元,而不僅僅是布林值。在有一個運算元不是布林值的情況下,邏輯與操作就不一定返回布林值;此時,它遵循以下規則:
- 如果第一個運算元是物件,則返回第二個運算元
- 如果第二個運算元是物件,則只有在第一個運算元的求值結果為true的情況下才會返回該物件
- 如果兩個運算元都是物件,則返回第二個運算元
- 如果第一個運算元是null,則返回null
- 如果第一個運算元是NaN,則返回NaN
- 如果第一個運算元是undefined,則返回undefined
邏輯與操作屬於短路操作,即如果第一個運算元能夠決定結果,那麼就不會再對第二個運算元求值
3、邏輯或。操作符由兩個豎線符號(||)表示,有兩個運算元。與邏輯與操作相似,如果有一個運算元不是布林值,邏輯或也不一定返回布林值;此時,它遵循以下規則:
- 如果第一個運算元是物件,則返回第一個運算元
- 如果第一個運算元的求值結果為false,則返回第二個運算元
- 如果兩個運算元都是物件,則返回第一個運算元
- 如果兩個運算元都是null,則返回null
- 如果兩個運算元都是NaN,則返回NaN
- 如果兩個運算元都是undefined,則返回undefined
與邏輯與操作符相似,邏輯或操作符也是短路操作。也就是說,如果第一個運算元的求值結果為true,就不會對第二個運算元求值了
乘性操作符
ECMAScript定義了3個乘性操作符:乘法、除法和求模。如果參與乘性計算的某個運算元不是數值,後臺會先使用Number()轉型函式將其轉換為數值,如:空字串將被當作0,布林值true將被當作1
1、乘法。操作符由一個星號(*)表示,用於計算兩個數值的乘積。在處理特殊值情況下,乘法操作符遵循下列特殊的規則:
- 如果運算元都是數值,執行常規的乘法計算,即兩個正數或兩個負數相乘的結果還是正數,而如果只有一個運算元有符號那麼結果就是負數。如果乘積超過了ECMAScript數值的表示範圍,則返回Infinity或-Infinity
- 如果有一個運算元是NaN,則結果是Nhttp://www.cppcns.comaN
- 如果是Infinity與0相乘,則結果是NaN
- 如果是Infinity與非0數值相乘,則結果是Infinity或-Infinity,取決於有符號運算元的符號
- 如果是Infinity與Infinity相乘,則結果是Infinity
- 如果有一個運算元不是數值,則在後臺呼叫Number()將其轉換為數值,然後在應用上面的規則
2、除法。操作符由一個斜線符號(/)表示,執行第二個運算元除第一個運算元的計算。遵循一下規則:
- 如果運算元都是數值,執行常規的除法計算,即兩個正數或兩個負數相除結果還是正數;如果只有一個運算元有符號,那麼結果就是負數。如果超過了ECMAScript數值的表示範圍,則返回Infinity或-Infinity
- 如果有一個運算元是NaN,則結果是NaN
- 如果是Infinity被Infinity除,則結果是NaN
- 如果是0被0除,則結果是NaN
- 如果是非零的有限數被零除,則結果是Infinity或-Infinity,取決於有符號運算元的符號
- 如果是Infinity被任何非零數值除,則結果是Infinity或-Infinity,取決於有符號運算元的符號
- 如果有一個運算元不是數值,則在後臺呼叫Number()將其轉換為數值,然後再應用上面的規則
3、求模(餘數)。操作符由一個百分號(%)表示。遵循以下規則:
- 如果運算元都是數值,執行常規的除法計算,返回除得的餘數
- 如果被除數是無窮大值而除數是有限大的數值,則結果是NaN
- 如果被除數是有限大的數值而除數是零,則結果是NaN
- 如果是Infinity被Infinity除,則結果是NaN
- 如果被除數是有限大的數值而除數是無窮大的數值,則結果是被除數
- 如果被除數是零,則結果是零
- 如果有一個運算元不是數值,則在後臺呼叫Number()將其轉換為數值,然後在應用上面規則
加性操作符
與乘性操作符類似,加性操作符也會在後臺轉換不同的資料型別。
1、加法。加法操作符由加號(+)表示。如果兩個運算元都是數值,執行常規的加法計算,然後根據下列規則返回結果:
- 如果有一個運算元是NaN,則結果是NaN
- 如果是Infinity加Infinity,則結果是Infinity
- 如果是-Infinity加-Infinity,則結果是-Infinity
- 如果是Infinity加-Infinity,則結果是NaN
- 如果是+0加+0,則結果是+0
- 如果是-0加-0,則結果是-0
- 如果是+0加-0,則結果是0
如果有一個運算元是字串,那麼就要應用如下規則:
- 如果兩個運算元都是字串,則將第二個運算元與第一個運算元拼接起來
- 如果只有一個運算元是字串,則將另一個運算元轉換為字串,然後再將兩個字串拼接起來
- 如果有一個運算元是物件、數值或布林值,則呼叫它們的toString()方法取得相應的字串值,然後再應用前面關於字串的規則
- 如果是undefined和null,則分別呼叫String()函式並取得字串"undefined"和"null"
2、減法。減法操作符由減號(-)表示,與加法操作符類似,遵循以下規則:
- 如果兩個操作符都是數值,則執行常規的算術減法操作並返回結果
- 如果有一個運算元是NaN,則結果是NaN
- 如果是Infinity減Infinity,則結果是NaN
- 如果是-Infinity減-Infinity,則結果是NaN
- 如果是Infinity減-Infinity,則結果是Infinity
- 如果是-Infinity將Infinity,則結果是-Infinity
- 如果是+0減+0,則結果是+0
- 如果是-0減+0,則結果是-0
- 如果是-0減-0,則結果是+0
- 如果有一個運算元是字串、布林值、null或undefined,則現在後臺呼叫Number()函式將其轉換為數值,然後再根據前面的規則執行減法計算。如果轉換結果是NaN,則減法的結果就是NaN
- 如果有一個運算元是物件,則呼叫物件的valueOf()方法以取得表示該物件的數值。如果得到的值是NaN,則減法結果就是NaN。如果物件沒有valueOf()方法,則呼叫其toString()方法並將得到的字串轉換為數值
var result1 = 5 - true var result2 = NaN - 1 var result3 = 5 - 3 var result4 = 5 - "" var result5 = 5 - "2" var result6 = 5 - null console.log(result1) // 4,true被轉換為1 console.log(result2) // NaN console.log(result3) // 2 console.log(result4) // 5,空字串被轉換為0 console.log(result5) // 3,字串2被轉換為數字2 console.log(result6) // 5,因為null被轉換為了0
關係操作符
關係操作符有小於(<)、大於(>)、小於等於(<=)和大於等於(>=)四個關係比較。當關系操作符的運算元使用了非數值時,也要進行資料轉換或完成某些奇怪的操作。相應規則如下:
- 如果兩個運算元都是數值,則執行數值比較
- 如果兩個運算元都是字串,則比較兩個字串對應的字元編碼值
- 如果一個運算元是數值,則將另一個運算元轉換為一個數值,然後執行數值比較
- 如果一個運算元是物件,則呼叫這個物件的valueOf()方法,用得到的結果按照前面的的規則進行比較。如果物件沒有valueOf()方法,則呼叫toString()方法,並用得到的結果根據前面的規則執行比較
- 如果一個運算元是布林值,則先將其轉換為數值,然後再執行比較
在比較字串時,實際比較的是兩個字串中對應位置的每個字元的字元編碼值。經過這麼一番比較之後,再返回一個布林值。大寫字母的字元編碼小於小寫字母的字元編碼。
相等操作符
兩組操作符:相等和不相等——先轉換再比較;全等和不全等——僅比較而不轉換
1、相等和不相等。相等操作符由兩個等於號(==)表示,如果兩個運算元相等,則返回true;不相等操作符由歎號後跟等於號(!www.cppcns.com=)表示,如果兩個運算元不相等,則返回true。這兩個操作符都會先轉換運算元(通常稱為強制轉型),然後再比較它們的相等性。在轉換不同資料型別時,遵循以下基本規則:
- 如果一個運算元是布林值,則在比較相等性之前先將其轉換為數值——false轉換為0,true轉換為1
- 如果一個運算元是字串,另一個運算元是數值,在比較相等性之前先將字串轉換為數值
- 如果一個運算元是物件,另一個運算元不是,則呼叫物件的valueOf()方法,用得到的基本型別值按照前面的規則進行比較
這兩個操作符在進行比較時要遵循下列規則
- null和undefined事相等的
- 比較相等性之前,不能將null和undefined轉換成其他任何值
- 如果有一個運算元是NaN,則相等操作符返回false,而不相等操作符返回true。即使兩個運算元都是NaN,則相等操作符也返回false;因為按照規則,NaN不等於NaN
- 如果兩個運算元都是物件,則比較它們是不是同一個物件。如果兩個運算元都指向同一個物件,則相等操作符返回true;否則,返回false
2、全等和不全等。全等操作符由3個等於號(===)表示,它只在兩個運算元未經轉換就相等的情況下返回true。不全等操作符有一個歎號後跟兩個等於號(!==)表示,它在兩個運算元未經轉換就不相等的情況下返回true。
var result1 = ("55" == 55) var result2 = ("55" === 55) var result3 = ("55" != 55) var result4 = ("55" !== 55) console.log(result1) // true console.log(result2) // false console.log(result3) // false console.log(result4) // true
條件操作符
語法:var max =客棧 (num1 > num2) ? num1 : num2
以上例子中,max中將會儲存一個最大的值,表示式的意思是:如果num1大於num2(關係表示式返回true),則將num1的值賦給max;如果num1小於或等於num2(關係表示式返回false),則將num2的值賦給max
賦值操作符
賦值操作符由等於號(=)表示,其作用就是把右側的值賦給左側的變數。如果在等號前面再新增乘性操作符、加性操作符或位操作符,就可以完成複合賦值操作。每個主要的算術操作符(以及個別的其他操作符)都有對應的複合賦值操作符。這些操作符如下所示:
- 乘/賦值——*=
- 除/賦值——/=
- 模/賦值——%=
- 加/賦值——+=
- 減/賦值——-=
- 左移/賦值——<<=
- 有符號右移/賦值——>>=
- 無符號右移/賦值——>>>=
逗號操作符
逗號操作符可以在一條語句中執行多個操作,如:var num1=1,num2=2,num3=3;
。
逗號操作符還可以用於賦值,在用於賦值時,逗號操作符總會返回表示式中的最後一項。如:var num= (5,6,1,4,7,0); // num值為0
總結
到此這篇關於ECMAScript中操作符的文章就介紹到這了,更多相關ECMAScript操作符內容請搜尋我們以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援我們!