JS基礎知識回顧:ECMAScript的文法(三)

來源:互聯網
上載者:User

標籤:使用   資料   string   os   類   問題   

ECMA-262描述了一組用於操作資料值的操作符,包括算術操作符、位操作符、關係操作符和相等操作符。

ECMAScript操作符的與眾不同之處在於,他們能夠適用於很多值,例如字串、數字值、布爾值、甚至是對象。

在將這些操作符應用於對象時,相應的操作符通常都會調用對象的valueOf()和(或)toString()方法,以便取得可以操作的值。

 

只能操作一個值的操作符叫做一元操作符。

遞增和遞減操作符直接借鑒自C,各有前置型和後置型兩個版本:a++、++a、a--、--a

這四種操作符不僅適用於整數,還可以用於字串、布爾值、浮點數值和對象。

在應用於不同數值時,遞增和遞減操作符遵循下列規則:

在應用於一個包含有效數字字元的字串時,先將其轉換為數字值,在執行加減1的操作,字串變數變成數值變數;

在應用於一個不包含有效數字字元的字串時,將變數的值設定為NaN,字串變數變成數值變數;

在應用於布爾值false時,先將其轉換為0再執行加減1的操作,布爾值變數變成數值變數;

在應用於布爾值true時,先將其轉換為1再執行加減1的操作,布爾值變數變成數值變數;

在應用於浮點數值是,執行加減1的操作;

在應用於對象時,先調用對象的valueOf()方法以取得一個可供操作的值,然後對該值按照上述規則進行操作,如果結果是NaN,則再調用toString()方法後再應用上述規則,物件變數變成數值變數。

一元加操作符以一個加號(+)表示。

一元加操作符放在數值前面,對數值不會產生任何影響;在對非數值應用一元操作符時,該操作符會向Number()函數一樣對這個值執行轉換。

一元減操作符主要用於表示負數,用一個減號(-)表示。

一元減操作符應用於數值時,該值會變成負數;而在應用於非數值時,一元減操作符遵循與一元加操作符相同的規則,最後將得到的數值轉換為負數。

一元加減操作符主要用於基本的算術運算,也可以像前面所展示的一樣用於轉換資料類型。

 

位操作符用於在最基本的層次上,即按記憶體中表示數值的位來運算元值。

ECMAScript中所有的數值都以IEEE-754 64位格式儲存,但位操作符會先將64為的值轉換成32位的整數,然後執行操作,最後再將結果轉換為64位,不過對於開發人員來講這個過程是透明的,因此整個過程就像是只存在32位的整數一樣。

對於有符號的整數,32位中的前31位用於表示整數的值,第32位用於表示數值的符號:0表示正數,1表示負數。

這個表示符號的位叫做符號位,符號位的值決定了其他位元值的格式。

其中,正數以純二進位格式儲存,31位中的每一位都表示2的冪,第一位(叫做位0)表示2的0次冪,第二位表示2的1次冪,以此類推,沒有用到的位以0填充。

另外,負數以二進位補碼的形式儲存:首先求這個數值絕對值的二進位碼,然後再求該二進位碼的反碼(將0替換為1,將1替換為0),得到的二進位反碼加1。

ECMAScript會儘力向我們隱藏所有這些資訊,在以二進位形式輸出一個負數時,我們看到的只是這個負數絕對值的二進位碼前面加上了一個負號。

在處理有符號整數時,是不能訪問位31(即第三十二位)的,預設情況下,ECMAScript中的所有整數都是有符號整數。

當然也存在不帶正負號的整數,對於不帶正負號的整數來講第32位不再表示符號,因為不帶正負號的整數只能是正數,不帶正負號的整數因為多出一位來所以可以表示更大的數值。

在對特殊的NaN和Infinity值應用位操作時,這兩個值都會被當成0來處理。

如果對非數值應用位操作符,會先使用Number()函數將該值轉換為一個數值(自動完成),然後再應用位操作符,得到的結果是一個數值。

 

按位非操作符由一個波浪線(~)表示,執行按位非的結果就是返回數值的反碼。

儘管按位非操作的本質是運算元的負值減1,但是由於是底層操作,會比直接運算速度更快。

按位與操作符由一個和號字元(&)表示,它有兩個運算元。

從本質上講,按位與操作就是將兩個數值的每一位對齊,然後針對每一位做與操作。

按位與操作只有在兩個數值的對應位都是1的情況下才返回1,任何一位是0結果都是0。

按位或操作符由一個豎線符號(|)表示,它有兩個運算元。

從本質上講,按位或操作就是將兩個數值的每一位對齊,然後針對每一位做或操作。

按位或操作只有在兩個數值的對應位都是0的情況下才返回0,任何一位是1結果都是1。

按位異或操作符由一個插入符號(^),它有兩個運算元。

從本質上將,按位異或操作就是講兩個數值的每一位對齊,然後針對每一位做異或操作。

按位異或操作只有在兩個數值的對應位中有一個是1時返回1,如果兩個數值的對應為均為0或1時則返回0。

 

左移操作符由兩個小於符號(<<)表示,這個操作符會將所有數值的所有位向左移動指定的位元:oldValue<<5(向左移五位)

向左移位後,原數值的右側多出的空位將用0填充,以便得到的結果是一個完整的32位位元。

左移不會影響運算元的符號位,換句話說,如果將-2向左移動5位,得到的結果將是-64。

有符號右移操作符由兩個大於符號(>>)表示,這個操作符會將數值向右移動,但保留符號位,在右移過程中產生的空位將用符號位來填充。

無符號右移操作符由三個大於符號(>>>)表示,這個操作符會將數值的所有32位全都向右移動。

由於無符號右移操作符會將所有位元全部看做是正數來處理,並將移動後的空位用0填充。

所以對於正數來講,無符號右移的結果與有符號右移相同,但對於負數來講將產生很大的差別。

 

布爾操作符一共有三個:非(NOT)、與(AND)、或(OR)。

 

邏輯非操作符由一個歎號(!)表示,可以應用於ECMAScript中的任何值。

邏輯非操作符會將它的運算元(無論這個值是什麼資料類型)首先轉換為一個布爾值,然後再對其求反後返回一個布爾值:

如果運算元是一個對象,則返回false;

如果運算元是一個Null 字元串,則返回true;

如果運算元是一個非Null 字元串,則返回false;

如果運算元是數值0,則返回true;

如果運算元是任意非0數值(包括Infinity),則返回false;

如果運算元是null,則返回true;

如果運算元是NaN,則返回true;

如果運算元是undefined,則返回true。

如果同時用兩個邏輯非操作符則會類比Boolean()轉型函數的行為,將運算元轉換為其對應的布爾值。

 

邏輯與操作符由兩個和號(&&)表示,有兩個運算元,只有在兩個運算元的值都是true時才返回true,否則返回false。

邏輯與操作可以應用於任何類型的運算元,而不僅僅是布爾值,在運算元不全是布爾值的情況下該操作也不一定返回布爾值:

如果第一個運算元是對象,則返回第二個運算元;

如果第二個運算元是對象,則只有在第一個運算元的求值結果為true的情況下才會返回該對象;

如果兩個運算元都是對象,則返回第二個運算元;

如果有一個運算元是null,則返回null;

如果有一個運算元是NaN,則返回NaN;

如果有一個運算元是undefined,則返回undefined。

邏輯與操作屬於短路操作,如果第一個運算元能夠決定結果,那麼就不會再對第二個運算元求值。

在邏輯與操作中使用未定義的值會導致錯誤,但如果是在第一個運算元的值為false第二個運算元未定義的情況下,由於不會對第二個運算元求值,所以並不會報錯。

 

邏輯或操作符由兩個豎線(||)表示,有兩個運算元,只有在兩個運算元的值都是false時才返回false,否則返回true。

邏輯或操作可以應用於任何類型的運算元,而不僅僅是布爾值,在運算元不全是布爾值的情況下該操作也不一定返回布爾值:

如果第一個運算元是對象,則返回第一個運算元;

如果第一個運算元的求值結果為false,則返回第二個運算元;

如果兩個運算元都是對象,則返回第一個運算元;

如果兩個運算元都是null,則返回null;

如果兩個運算元都是NaN,則返回NaN;

如果兩個運算元都是undefined,則返回undefined。

與邏輯與操作類似,邏輯或操作也屬於短路操作,如果第一個運算元的結果為true,那麼就不會再對第二個運算元求值。

我們可以利用邏輯或的這一行為來避免為變數賦null或undefined值,例如:var myObject=preferredObject||backupObject;

此例子中如果preferredObject的值不是null,那麼它將被賦給myObject,如果是null,則將backupObject賦值給myObject,ECMAScript程式的指派陳述式經常會使用這種模式。

 

ECMAScript定義了三個乘性操作符:乘法、除法和求模。

如果參與乘性計算的某個運算元不是數值,後台會先使用Number()轉型函數將其轉換為數值。

 

乘法操作符由一個星號(*)表示,用於計算兩個數值的乘積。

在處理特殊值的情況下,乘法操作符遵循下列特殊規則:

如果運算元都是數值,執行常規的乘法計算,如果乘積超過了ECMAScript數值的表示範圍,則返回Infinity或-Infinity;

如果只有一個運算元是NaN,則結果是NaN;

如果是Infinity與0相乘,則結果是NaN;

如果是Infinity與非0數值相乘,則結果是Infinity或-Infinity;

如果有一個運算元不是數值,則在後台調用Number()將其轉換為數值然後再應用上述規則。

 

除法操作符由一個斜線符號(/)表示,執行第二個運算元除第一個運算元的計算。

除法操作符對於特殊的值也有特殊的處理規則:

如果運算元都是數值,執行常規的除法計算,如果商超過了ECMAScript的數值範圍,則返回Infinity或-Infinity;

如果有一個運算元是NaN,則結果是NaN;

如果是Infinity被Infinity除,則結果是NaN;

如果是零被零除,則結果是NaN;

如果是非零的有限數被零除,則結果是Infinity或-Infinity;

如果是Infinity被任何非零數值除,則結果是Infinity或-Infinity;

如果有一個運算元不是數值,則在後台調用Number()將其轉換為數值然後再應用上述規則。

 

求模(餘數)操作符由一個百分比符號(%)表示。

與另外兩個乘性操作符類似,求模操作符會遵循下列特殊規則:

如果運算元都是數值,執行常規的除法計算,返回除得的餘數;

如果被除數是無窮大值而除數是有限大的數值,則結果是NaN;

如果被除數是有限大的數值而除數是零,則結果是NaN;

如果是Infinity被Infinity除,則結果是NaN;

如果被除數是有限大的數值而除數是無窮大的數值,則結果是被除數;

如果被除數是零,則結果是零;

如果有一個運算元不是數值,則在後台調用Number()將其轉換為數值然後再應用上述規則。

 

在ECMAScript中,加法和減法兩個加性操作符都有一系列特殊行為。

 

加法操作符(+)在兩個操作符都是數值時執行常規的加法計算,然後根據下列規則返回結果:

如果有一個運算元是NaN,則結果是NaN;

如果是Infinity加Infinity,則結果是Infinity;

如果是-Infinity加-Infinity,則結果是-Infinity;

如果是Infinity加-Infinity,則結果是NaN;

如果是+0加+0,則結果是+0;

如果是-0加-0,則結果是-0;

如果是+0加-0,則結果是+0。

不過如果有一個運算元是字串,就要遵循如下規則:

如果兩個運算元都是字串,則將第二個運算元與第一個運算元拼接起來;

如果只有一個運算元是字串,則將另一個運算元轉換為字串,然後再將兩個字串拼接起來。

忽略加法操作符的資料類型是ECMAScript變成中最常見的一個錯誤,如果想先對數值進行求解再與字串拼接的話記得要加括弧。

 

減法操作符(-)在處理各種資料類型轉換時,同樣需要遵循一些特殊規則:

如果兩個操作符都是數值,則執行常規的算術減法操作並返回結果;

如果有一個運算元是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()函數將其轉換為數值,然後再根據前面的規則執行減法計算;

如果有一個運算元是對象,則調用對象的valueOf()方法以取得表示該對象的數值,如果對象沒有valueOf()方法,則調用其toString()方法並將得到的字串轉換為數值。

 

小於(<)、大於(>)、小於等於(<=)、大於等於(>=)這幾個關係操作符用於對兩個值進行比較,這幾個操作符都返回一個布爾值。

與ECMAScript中的其他動作符一樣,當關係操作符的運算元使用了非數值時,也要進行資料轉換:

如果兩個運算元都是數值,則執行數值比較;

如果兩個運算元都是字串,則比較兩個字串對應的字元編碼值(會位元壓縮字元編碼,所有的大寫字母編碼小於小寫字母,兩數字字串比較時也會位元壓縮);

如果一個運算元是數值,則將另一個運算元轉換為一個數值,然後執行數值比較;

如果一個運算元是對象,則調用這個對象的valueOf()方法,用得到的結果按照前面的規則執行比較,如果沒有該方法就調用toString()方法並對返回的結果做比較;

如果一個運算元是布爾值,則先將其轉換為數值,然後再執行比較。

按照常理,如果一個值不小於另一個值,則一定大於或等於那個值,但是NaN與任何運算元執行任何比較時都會返回false。

 

ECMAScript中提供了兩組相等操作符:相等和不相等——先轉換再比較,全等和不全等——僅比較而不轉換。

ECMAScript中的相等操作符為(==),不相等操作符為(!=)。

這兩個操作符都會先轉換運算元,然後再比較他們的相等性,有如下規則:

如果有一個運算元是布爾值,則在比較相等性之前先將其轉換為數值,false轉換為0,true轉換為1;

如果一個運算元是字串,另一個運算元是數值,在比較相等性之前先將字串轉換為數值;

如果一個運算元是對象,另一個運算元不是,則調用對象的valueOf()方法,用得到的基本類型值按照前面的規則進行比較;

在比較相等性之前,不能將null和undefined轉換成其他任何值;

如果兩個運算元都是對象,則比較它們是不是指向同一個對象。

下標列出了一些特殊情況及比較結果:

null==undefined//true;undefined==0//false;null==0//false

"NaN"==NaN//false;5==NaN//false;NaN==NaN//false;NaN!=NaN//true

false==0//true;true==1//true;true==2//false;"5"==5//true

ECMAScript中的全等操作符為(===),不全等操作符為(!==)。

全等比較在兩個運算元未經轉換就相等的情況下返回true,否則返回false。

注意:null==undefined會返回true,是因為他們是類似的值;而null===undefined會返回false,是因為他們是不同類型的值。

由於相等和不相等存在資料類型轉換的問題,為了保持代碼中資料類型的完整性更加推薦使用的是全等和不全等。

 

條件操作符variable=boolean_expression?true_value:false_value;

該操作的含義就是基於boolean_expression求值的結果,如果為true則給變數variable賦值true_value,如果為false則給變數variable賦值false_value。

 

簡單的賦值操作符由等號(=)表示,其作用就是把右側的值賦給左側的變數。

如果等號前面再添加乘性操作符、加性操作符、位操作符,就可以完成複合賦值操作。

設計這些操作符的主要目的就是簡化賦值操作,使用它們不會帶來任何效能上的提升。

 

使用逗號操作符可以在一條語句中執行多個操作,例如:var num1=1,num2=2,num3=3;

逗號操作符還可以用來賦值,利用逗號操作符賦值總會返回運算式中的最後一項,例如:var num=(5,1,4,8,0);//num的值為0

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.