JavaScript基本概念(四)---操作符

来源:http://www.cnblogs.com/liaidai/archive/2016/01/07/5110118.html
-Advertisement-
Play Games

操作符1.一元操作符 只能操作一個值的操作符叫做一元操作符,一元操作符有遞增(遞減)操作符以及一元加(減)操作符。 遞增遞減操作符分為前置遞增(遞減)操作符和後置遞增(遞減)操作符,不管是前置還是後置的遞增(遞減)操作符,其使用方式與java中的遞增遞減操作符一樣,有區別的地方就是javascr.....


操作符

1.一元操作符

  只能操作一個值的操作符叫做一元操作符,一元操作符有遞增(遞減)操作符以及一元加(減)操作符。

  遞增遞減操作符分為前置遞增(遞減)操作符和後置遞增(遞減)操作符,不管是前置還是後置的遞增(遞減)操作符,其使用方式與java中的遞增遞減操作符一樣,有區別的地方就是javascript中的遞增遞減操作符可以對非數字類型的值進行操作,看下麵的例子:

 

a.對包含有效數字字元的字元串執行遞增遞減操作時,會將字元串轉換成數字後再執行遞增遞減操作。字元串最後轉換為number類型。

b.對於不能轉換成數字的字元串,返回NaN,且原字元串變為NaN。

c.對於布爾型值,true轉換為1,false轉換為0後執行遞增遞減操作。

d.對象類型,先執行對象的valueOf()方法,對取出的值執行上述的方式進行遞增遞減,如果返回NaN,那麼再執行toString()方法,同樣採用上述的方式進行遞增遞減。

前置遞增遞減操作符,變數的值都是在語句被求值以前改變;後置遞增遞減操作符,變數的值都是在語句被求值以後改變。

  對於一元加或者減操作符,一元加操作符以(+)表示,一元減操作符以(-)表示。對於數字使用一元加或者減操作符與數學中的加減操作符一樣,但是在對非數字值使用一元加減操作符時,相當於對當前值使用Number()函數。具體的操作如下所示:

 

 

2.位操作符

  位操作符實際上是操作記憶體中表示數值的位來操作數值。ECMAScript中的所有數值都是以IEEE-754 64位格式存儲,但是位操作符並不是直接操作64位的值,而是先把64位值轉換為32位,然後執行操作,將操作結果再轉換回64位。

  對於有負號的整數,32位中的前31位存儲數值,32位是符號位,1表示負數,0表示正數。其中正數以純二進位的格式存儲,31位中的每一位都是2的指數次冪,2的指數從0開始,一直向後類推。沒有用到的位以0填充負數同樣用二進位存儲,但是使用的格式是二進位補碼(計算方式請自行百度)。在ECMAScript中負數的二進位表示形式是該負數的絕對值的二進位前面加上負號,例如18的二進位碼是10010,那麼-18的二進位碼就是-10010。

  ECMAScript中對數值應用位操作符時,首先64位的數值會被轉換成32位,然後執行位操作,操作完成之後將32位的結果再轉換回64位。其中NaN和Infinit應用位操作符時,會當做0處理。對於非數字型值,自動使用Number()函數轉換成數值後再進行位操作,得到一個數字結果

2.1按位非

使用波浪線(~)表示,按位非操作符返回數值的反碼,如下例子所示:

 

  可以看到對25執行按位非操作之後,結果返回-26,-26的二進位碼是26的二進位碼前面加上負號,本來應該是二進位補碼,但是在ECMAScript中顯示的就是整數的二進位碼的負值。同時上述例子可以看出按位非操作符等價於當前值的負值減一

2.2.按位與|按位或|按位異或

按位與操作符用&表示,該操作符對兩個操作數進行操作,按照下表中的規則依次比較兩個數值對應位置的值,返回一個數值。比較規則如下(兩個數值的相同位置上的值都為1結果為1,其他的結果都是0):

第一個數值的位

第二個數值的位

比較結果

1

1

1

1

0

0

0

1

0

0

0

0

例子如下:

 

 

       按位或操作符使用|表示,同樣是對兩個操作數操作,對比規則如下所示(兩個數值的相同位置上的值只要有一個為1,結果就是1):

第一個數值的位

第二個數值的位

比較結果

1

1

1

1

0

1

0

1

1

0

0

0

例子如下:

 

按位異或使用(^)表示,操作兩個操作數,比較規則(兩個數值相同位置上的值相同,結果是0,不同結果是1):

第一個數值的位

第二個數值的位

比較結果

1

1

0

1

0

1

0

1

1

0

0

0

例子如下:

 

 

2.3.左移

左移使用(<<)表示。如下所示:

 

通過上面的例子可以看出,左移操作符將數值的所在位向左移動指定的位數,也就是向左了5位,移動後原數值的右側空出五個位置,用0來補充空位。註意:左移操作符不會影響操作數的符號位,也就是說-11向左移動5位結果是-352。

 

2.4.有符號的右移|無符號右移

有符號的右移用(>>)表示,先看例子:

 

有符號的右移會將數值向右移動指定的位數,但是保留符號位,也就是說有符號的右移是不會造成數值符號改變的,右移造成的空位用符號位的值來填充,以得到一個完整的值。

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0

0

0

0

0

0

數值128轉換為32位二進位碼如上所示,箭頭所指位置為符號位

 

 

 

 

 

右移5位之後,結果為4,二進位碼如下所示:

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

0

1

0

0

 

無符號的右移用(>>>)表示,這個操作符會把數值的所有32位都向右移動,對於正數來說,無符號右移和有符號右移得到的結果是一樣。但是對於負數來說,結果卻是會發生改變,原因主要有兩點:第一,無符號右移是以0來填充空位,有符號右移是以符號位的值來填充空位;第二,無符號的右移會把負數的二進位碼當成正數的二進位碼,而且,由於負數的二進位碼以其絕對值的二進位碼補碼形式存在,因此就會導致無符號右移後的結果非常大。

例子如下所示:

 

如上所示,-64的二進位碼為64的二進位碼補碼,也即1111111111111111111111111000000,

無符號右移操作會把這個值當做正數的二進位碼,然後再右移5位形成00000111111111111111111111111110,轉換為十進位數字就是134217726。

 

3.布爾操作符

3.1.邏輯非

邏輯非操作符用(!)表示,可以對ECMAScript中的任何值使用該操作符,返回一個布爾值,對值使用該操作符時,會先將當前值轉換為布爾值,然後再對其取反。具體的轉換規則如下:

i.操作數是對象,返回false;

ii.操作數是空字元串,返回true;

iii.操作數是非空字元串,返回false;

iv.操作符是數值0,返回true;

vi.操作數是非0數值(包括Infinity),返回false;

vii.操作數是null,返回true;

viii.操作數是NaN,返回true;

ix.操作數是undefined,返回true;

 

3.2.邏輯與

邏輯與操作符使用(&&)符號表示,與java中一樣,必須兩個操作數都是true時,結果才為true,如果有一邊為false,那麼結果就是false。但是javascript中,兩個操作數的數據類型不一定都是布爾型的,也可以是其他的數據類型,此時返回結果的判斷規則如下所示:

i.如果第一個操作數是對象,那麼返回第二個操作數;

ii.如果第二個操作數是對象,那麼只有在第一個操作數返回true時才會返回該對象;

iii.如果兩個操作數都是對象,那麼返回第二個操作數;

iv.如果一個操作數是null,那麼返回null;

v.如果一個操作數是NaN,那麼返回NaN;

vi.如果一個操作數是undefined,那麼返回undefined;

       註意:邏輯與操作屬於短路操作,只要第一個操作數能夠確定結果,第二個操作數就不會再求值。切兩個操作數中不能出現未聲明的變數,否則會導致錯誤。

 

3.3.邏輯或

邏輯或操作符用(||)表示,即兩個操作數中有一個為true,那麼結果就是true。同樣,兩個操作數中如果有一個不是布爾值,邏輯或也不一定返回布爾值,具體規則如下:

i.如果第一個操作數是對象,那麼返回對象;

ii.如果第一個操作數的求值結果是false,那麼返回第二個操作數;

iii.如果兩個操作數都是對象,那麼返回第一個操作數;

iv.如果兩個操作數都是null,那麼返回null;

v. 如果兩個操作數都是NaN,那麼返回NaN;

vi. 如果兩個操作數都是undefined,那麼返回undefined;

 

4.乘性操作符

ECMAScript中規定了三種乘性操作符,分別是乘法、除法和求模,這三種操作符與java中的操作一樣,不同的是當操作符不是數值的時候,會執行自動的類型轉換。

4.1.乘法

乘法操作符用(*)表示,用語計算兩個數值的乘積,當操作數為特殊情況時,處理規則如下:

i.如果兩個操作數都是數值,按照數學的乘法計算即可,但是當計算結果超過ECMAScript規定的數值範圍時,返回Infinity或者-Infinity;

ii.如果有一個操作數是NaN,那麼返回NaN;

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

iv.如果Infinity與非零數值相乘,結果是Infinity或者-Infinity,符號取決於非零數值;

v.如果是Infinity與Infinity相乘,結果還是Infinity;

vi.如果有一個操作數不是數值,那麼調用Number()函數轉換為數值之後,再執行上述操作。

 

4.2. 除法

除法操作符用(/)表示,表明第二個操作數除第一個操作數的計算,同樣,特殊情況處理規則如下:

       i.如果兩個操作數都是數值,那麼執行數學計算即可,如果商超過ECMAScript規定的數值範圍,那麼返回Infinity或者-Infinity。

ii.如果有一個操作數是NaN,那麼返回NaN;

iii.如果是Infinity被Infinity除,結果是NaN;

iv.如果是0除以0,結果是NaN;

v.如果非零的有限數被0除,那麼返回Infinity或者-Infinity,符號取決於被除數;

vi.如果是Infinity被任何非零有限數除,那麼返回結果是Infinity或者-Infinity。

vii. 如果有一個操作數不是數值,那麼調用Number()函數轉換為數值之後,再執行上述操作。

4.3.求模

求模操作符由(%)表示,表示第一個操作數除以第二個操作數所得的餘數,處理規則如下:

       i.如果兩個操作數都是數值,執行數學運算即可;

       ii.如果被除數無限大,除數有限大,那麼返回NaN;

       iii. 如果被除數無限大,除數是0,那麼返回NaN;

       iv.如果是Infinity除以Infinity,結果是NaN;

       v.如果被除數是有限大的數值,除數是無限大的數值,返回被除數;

       vi.如果被除數是0,結果是0;

       vii. 如果有一個操作數不是數值,那麼調用Number()函數轉換為數值之後,再執行上述操作。

 

5.加性操作符

5.1.加法

加法操作符使用(+)表示,如果兩個操作數都是數值,執行常規的加法運算,根據以下規則計算結果:

i.如果有一個數是NaN,那麼結果就是NaN;

ii.如果是Infinity加Infinity,結果是Infinity;

iii.如果是-Infinity加-Infinity,結果是-Infinity;

iv.如果是Infinity加-Infinity,結果是NaN;

v.如果是+0加-0,結果是+0;

vi.如果是+0加+0,結果是+0;

vii.如果是-0加-0,結果是-0;

 

如果有一個操作符是字元串,那麼久需要使用以下規則:

  1. 如果兩個操作數都是字元串,那麼把兩個字元串拼接起來;
  2. 如果只有一個操作數是字元串,那麼將另一個操作數轉換成字元串,然後把兩者拼接起來;

如果有一個操作數是對象、數值或者布爾值,      則調用他們的toString()方法取到相應的字元串,再應用前面關於字元串的規則,如果是undefined或者null,調用String()函數獲取到對應的字元串”undefined”和”null”;

 

 

5.2.減法

減法操作符使用(-)表示,具體的運算規則如下所示:

i.如果兩個操作符都是數值,那麼數學運算即可;

ii.如果一個操作數是NaN,結果是NaN;

iii. 如果是Infinity減Infinity,結果是NaN;

iv. 如果是-Infinity減-Infinity,結果是NaN;

v. 如果是Infinity減-Infinity,結果是Infinity;

vi. 如果是-Infinity減Infinity,結果是-Infinity;

vii. 如果是+0減+0,結果是+0;

viii. 如果是+0減-0,結果是-0;

ix. 如果是-0減-0,結果是+0;

x.如果一個操作數是字元串、布爾值、null或者undefined,那麼調用Number()函數轉換為數值後再根據前面的規則執行減法計算;

xi.如果有一個操作數是對象,那麼調用對象的valueOf()方法取得表示該對象的值,如果得到的值是NaN,減法的結果就是NaN,如果對象沒有valueOf()方法,那麼就調用toString()方法並將取到的字元串轉換為數字。

 

6.關係操作符

ECMAScript中使用<,>,<=,>=這幾個關係操作符比較兩個值的大小,具體的比較規則如下:

i.如果兩個操作數都是數值,那麼進行數學運算即可;

ii.如果兩個操作數都是字元串,那麼比較兩個字元串對應的字元編碼值;

iii.如果一個操作數是數值,則將另一個操作數轉換為一個數值,然後執行數值比較;

iv.如果一個操作數是對象,先調用該對象的valueOf()方法,用得到的值按照前面的規則比較,如果對象沒有valueOf()方法,那麼就調用對象的toString()方法,用得到的值按照前面的規則比較。

v.如果一個操作數是布爾值,先將其裝換為數值後再進行比較。

下麵看兩個例子:

 

這個例子中小寫字母a分別和小寫字母b以及大寫字母B比較,發現a小於b但是大於B,這是由於兩個字元串比較,實際上是比較兩個字元串中對應位置的每個字元的字元編碼值,大寫字母的字元編碼值全部小於小寫字母的字元編碼值,因此a<B返回false。

第二個例子:

 

  這個例子中,首先是字元串”23”和字元串”3”比較,比較的結果是”23”小於”3”,原因和上一個例子一樣,兩個字元串比較的是字元編碼,”23”的字元編碼是50,而”3”的字元編碼是51,因此返回結果為true。對於字元串”23”和數字3比較,由於一個操作數是數字,因此會將字元串轉換為數字後比較,因此返回false。

 

7.相等操作符

相等操作符分為兩種類型,第一種是相等和不相等,當需要轉換時,先轉換再進行比較;第二種是全等和不全等,此時不進行轉換,直接進行比較。

7.1.相等和不相等

相等操作符用(==)表示,不相等操作符用(!=)表示,這兩個操作符都會對操作數進行強制轉型,然後才比較兩者的相等與否。

在強制轉型時,相等和不相等操作符遵循以下規則:

i.如果有一個操作數是布爾值,那麼先將其轉換為數字,false為0,true為1;

ii.如果一個操作數是字元串,另一個操作數是數字,那麼需要先將字元串轉換為數字後再比較;

iii.如果一個操作符時對象,另一個不是,那麼需要調用對象的valueOf()方法,用得到的基本類型值按照前面的規則比較;

iv.null和undefined是相等的;

v.在比較之前,不能將null或者undefined轉換成其他的值;

vi.如果有一個操作數是NaN,那麼相等操作符返回false,不相等操作符返回true,如果兩個操作數都是NaN,相等操作符返回false;

vii.如果兩個操作數都是對象,那麼則比較兩個操作符指向的是否是同一個對象,如果是,那麼相等操作符返回true,否則返回false;

7.2.全等和不全等

全等和不全等與相等和不相等之間唯一的區別就是在比較之前不進行操作數轉換,全等操作符用(===)表示,當兩個操作數不需要經過轉換就相等時返回true,不全等用(!==)表示。

註意:null == undefined返回true是由於兩者是類似的值,但是null === undefined返回false是由於兩者不是一個類型,推薦使用全等和不全等操作符。

 

8.條件操作符、賦值操作符、逗號操作符

8.1.條件操作符

條件操作符就是我們所屬的三元比較,表示方式為:boolean_condition ? true_value : false_value。當條件為true時,返回true_value,當條件為false時,返回false_value。

 

8.2.賦值操作符

賦值操作符的作用就是把操作符右側的值賦給左側的變數,最簡單的賦值操作符就是=,其他的操作符有*=,/=,%=,+=,-=,<<=(左移賦值),>>=(有符號右移賦值),>>>=(無符號右移賦值)

 

8.3逗號操作符

使用逗號操作符可以在一條語句中執行多個操作,如下所示:

var num1 = 1 , num2 = 2 , num3 = 3;

 

 

       操作符部分終於結束了,好累啊。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 以後SqlSugar所有更新都會在這個貼子更新SqlSugar是一款輕量級的MSSQL ORM ,除了具有媲美ADO的性能外還具有和EF相似簡單易用的語法。學習列表 0、功能更新1、SqlSugar基礎應用2、使用SqlSugar處理大數據3、使用SqlSugar實現Join待更新4、使用SqlSu...
  • 前一段時間在給移動端寫介面時遇到一個調用介面發送郵箱 session 一直獲取不到的問題。我來給遇到問題的同志們說一說自個在網上查了好多資料,問了一些朋友後。終於找到解決方案了。大家都知道webapi預設是不開啟session會話支持的。所以需要Global文件中要重寫方法如下: public o....
  • 平常我們在做多個條件判斷的時候喜歡用switch(表達式){ case : 常量1 表達式1; break; case : 常量2 表達式2; break; case : 常量3 表達式3; break;.... default: 常量4 表達式4;...
  • 由於工作中需要,我接觸了dsoframer控制項,我辦公電腦是64系統,在使用時,總是報沒有註冊類錯誤。我很是奇怪,dsoframer.ocx控制項我都註冊過的呀。然後在網上查閱了許多相關資料。悲哀的是,感覺網上都是千篇一律的。說64系統需要在syswow64文件夾下註冊控制項,有的說同時需要也在syst...
  • 客戶端發送請求->IIS, UrlRouting模塊對比URL, 預設如果該URL能對應到實體文件則退出MVC管道把控制權交還給IIS.如果RegisterRoutes中的路由規則對比成功預設情況下交給MvcRouteHandler(IRouteHandler)處理,IRouteHandler的作用...
  • 6.1、對於HashSet需要掌握以下幾點HashSet的創建:HashSet()往HashSet中添加單個對象:即add(E)方法刪除HashSet中的對象:即remove(Object key)方法判斷對象是否存在於HashSet中:containsKey(Object key)註:HashSe...
  • 1.數字int main(int argc, const char * argv[]) { @autoreleasepool { //添加空白 [NSNull null]// NSArray *arr=[NSArray arrayWithObjects:@1,@2,...
  • 晚上整理髮布
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...