標籤:使用 資料 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