整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費(fèi)咨詢熱線:

          「面向 Boss 編程」JVM 鏈接階段之符號引用與

          「面向 Boss 編程」JVM 鏈接階段之符號引用與直接引用

          VM 架構(gòu)簡圖

          JVM 的類加載子系統(tǒng)(Class Load SubSystem) 是 JVM 架構(gòu)的第一個重要階段,我們最常見的 JVM 架構(gòu)簡圖是下面這樣事兒的,只瞅一眼就跟明鏡兒似的,類加載子系統(tǒng)的責(zé)任那是明明白白的,負(fù)責(zé)從文件系統(tǒng)或網(wǎng)絡(luò)中加載 class 文件到 JVM 運(yùn)行時數(shù)據(jù)區(qū)。


          JVM 架構(gòu)簡圖

          類的加載過程

          既然都這么明確了,那只能不繞圈子了,其實(shí)類加載子系統(tǒng)還是有點(diǎn)復(fù)雜的,并不像上圖那樣跟一個青春妹子一樣單純、可愛、簡單,她的內(nèi)心你得多少了解點(diǎn),不然我講不下去了,想留住單純美好時光的肥宅們,可以到此打住了。

          類加載子系統(tǒng)雖然只負(fù)責(zé)將 class 文件加載到 JVM 的運(yùn)行時數(shù)據(jù)區(qū),其實(shí)她也不管最后能不能執(zhí)行,反正是符合她的“擇偶”條件就會加載,雖然單純可愛簡單,但是該有的流程還是要有的。

          有好事者總結(jié)如下:

          1. 加載(Loading): 在內(nèi)存中生成一個代表該 class 類的 java.lang.Class 對象
          2. 鏈接(Linking): 其實(shí)這個階段還分為驗(yàn)證、準(zhǔn)備、解析三個階段
          3. 初始化(Resolution):執(zhí)行類構(gòu)造器方法 <clinit>() 完成初始化操作


          類加載子系統(tǒng)

          還是有點(diǎn)小復(fù)雜,但今天不能重點(diǎn)介紹,說多了就沒有距離感了,還是先保留一點(diǎn)單純可愛簡單吧。

          接下來說今天要探討的重點(diǎn):鏈接(Linking)階段的解析過程(Resolution)

          鏈接(Linking)階段

          鏈接(Linking)階段分為了三個階段:驗(yàn)證(Verification)、準(zhǔn)備(Preparation)、解析(Resolution)。

          驗(yàn)證階段,簡單來說,確保 class 文件包含的信息是符合當(dāng)前虛擬機(jī)要求的,確保加載類的正確性,確保其不會危害虛擬機(jī)的自身安全;這個階段主要包括四種驗(yàn)證:文件格式驗(yàn)證、元數(shù)據(jù)驗(yàn)證、字節(jié)碼驗(yàn)證、符號引用驗(yàn)證。

          著名的魔數(shù)【CAFEBABE】(諧音:咖啡寶貝)就是在這個階段驗(yàn)證的,凡是 JVM 標(biāo)準(zhǔn)的 class 文件都是以這個魔數(shù)開始的,名字聽著就那么個感覺!

          準(zhǔn)備階段,簡單來說,就是類變量分配內(nèi)存并且設(shè)置該類的默認(rèn)初始值,也就是零值;比如定義了一個 static 變量 a=1,在這個階段會默認(rèn)賦值 a=0,在后面的初始化階段會將 a 賦值為 1。

          需要注意的是:

          1. 這個階段不包含用 final 修飾的 static 變量,因?yàn)?final 會在編譯階段分配

          2. 這個階段不包含實(shí)例變量的分配與初始化,因?yàn)樗鼈儠诙褏^(qū)創(chuàng)建對象時初始化

          好了,終于到整體了,接下來就是解析(Resolution)階段啦。

          解析階段,簡單來說,就是常量池中的符號引用轉(zhuǎn)換為直接引用的過程,解析的主要是類或接口、字段、類方法、接口方法、方法類型等,對應(yīng)到常量池中的CONSTANT_Class_info、 CONSTANT_Fieldref_info、 CONSTANT_Methodref_info 等。

          千呼萬喚,終于出來了,接下來就是本篇核心知識點(diǎn)了:符號引用、直接引用了。

          符號引用與直接引用

          解析階段的主要操作是將類常量池中的符號引用替換為直接引用。啥?(黑人問號臉)

          符號引用,簡單說,就是一個字符串,這個字符串定義了被引用項的唯一識別信息,根據(jù)這個信息可以無歧義地定位到一個類、字段、方法等。

          一句話:就是一個唯一標(biāo)識符

          直接引用,簡單說,就是直接指向目標(biāo)的指針、相對偏移量或一個間接定位到目標(biāo)的句柄。

          一句話:就是一個直接內(nèi)存地址的表示

          為什么會有符號引用?

          符號引用與虛擬機(jī)的內(nèi)存布局無關(guān),引用的目標(biāo)并不一定加載到內(nèi)存中,一個 java 類編譯為 class 文件時,java 類并不知道所引用的類的實(shí)際地址,因此只能使用符號引用代替。

          初始化階段后,已經(jīng)可以知道被引用項的真實(shí)地址(也就是,直接引用)了,解析階段會將常量池內(nèi)的符號引用替換為直接引用。

          各種虛擬機(jī)實(shí)現(xiàn)的內(nèi)存布局可能有所不同,但是它們能接受的符號引用都是一致的,因?yàn)榉栆玫淖置媪啃问矫鞔_定義在 Java 虛擬機(jī)規(guī)范的 Class 文件格式中。

          Boss:來一個小示例

          Boss 說太干了,來點(diǎn)實(shí)際的,要想成功就得讓我聽懂。

          有好事者總結(jié)了:

          (1)我們先寫個 java 版本的 Hello World 小程序(PS :這個 Boss 再不懂就辭職啦)

          public class Hello {
              private static int a=1;  
          
              public static void main(String[] args) {
                  System.out.println(a);
              }
          }       

          (2)寫完后我們編譯一下,有 IDE 的直接自動編譯,沒有的使用 javac 搞一下

          (3)編譯成功后可以找到 Hello.class,哎,對就是這個!

          (4)然后在 class 文件所在目錄打開命令行,輸入一個神奇命令:javap -v Hello.class

          (5)接下來,見證一下奇跡,找尋一下常量池(Constant Pool)

          Boss,請看下圖:

          這就是編譯后常量池中定義的符號引用了,看看 Ljava/lang/String; 就是代表 java.lang.String 類。

          常量池的符號引用

          符號引用的常見描述符

          本著服務(wù) Boss 的宗旨,這么多描述符,鬼知道是怎么回事啊,Boss 教導(dǎo)說,工作要有總結(jié)。

          那么,好事者又總結(jié)了。

          JNI 字符描述符是類描述符、方法描述符、字段描述符的具體的實(shí)現(xiàn)規(guī)則,描述規(guī)則如下:

          (1)類描述符 : 以 L 開頭,其后跟著該類的全限定名,并將其中中的 “.” 改為 “/” ,最后分號“;”結(jié)束

           類:Java.lang.String
           對應(yīng)描述符:Ljava/lang/String;

          (2)基本類型描述符:基本類型不存在全限定名,故只需要一個符號就可以表達(dá)該基本類型

          boolean Z
          byte    B
          char    C
          short   S
          int     I
          long    J
          float   F
          double  D
          void    V

          (3)字段描述符 :格式為 字段名:類型

           int num=3;
           字段描述符: num:I
           字段名: num

          (4)數(shù)組描述符 : 原描述符前加一個 [ 表示一維數(shù)組,加兩個[[ 表示二維數(shù)組

           String[][] num=null;
           字段描述符:[[Ljava/lang/String;
           字段名:num

          (5)方法描述符: (第一個參數(shù)的字段描述符第二個參數(shù)的字段描述符.....)返回類型的描述符

           # 示例 1
           String test();
           方法描述符:()Ljava/lang/String;
           方法名:test
           
           # 示例 2
           long test(int i, Object c);
           方法描述符:(ILjava/lang/Object;)J
           方法名:test
           
           # 示例 3
           void test(byte[] bytes);
           方法描述符:([B)V
           方法名:test

          Boss:來一個小總結(jié)

          Boss 說得對,來個小總結(jié)吧,好事者又開始了表演。

          1. 類加載子系統(tǒng)是 JVM 運(yùn)行數(shù)據(jù)的第一個階段,這個階段是這種的目標(biāo)是將 class 文件加載到運(yùn)行時數(shù)據(jù)區(qū),創(chuàng)建出對應(yīng)的 java.lang.Class 對象;
          2. 類加載子系統(tǒng)的加載過程又包括三個大階段:加載、鏈接、初始化;
          3. 加載階段的作用是在內(nèi)存中生成一個代表這個類的 java.lang.Class 對象
          4. 鏈接階段的作用是完成 class 文件的驗(yàn)證、分配內(nèi)存并賦默認(rèn)值、最后替換常量池的符號引用,也就是驗(yàn)證、準(zhǔn)備、解析三個階段;
          5. 符號引用就是一個唯一標(biāo)識被引用項的字符串,直接引用就是一個直接內(nèi)存地址的表示,可以是指向目標(biāo)的指針、相對偏移量或一個間接定位目標(biāo)的句柄;
          6. 之所以會有符號引用,是因?yàn)樵诰幾g階段,并不知道變量的真實(shí)地址(也就是直接引用),而且每個虛擬機(jī)的實(shí)現(xiàn)各有不同,因此需要前期定義,后期再進(jìn)行替換,也就是上面的解析階段;
          7. 符號引用在 java 虛擬機(jī)規(guī)范的 Class 文件格式中有明確定義,JNI 字符描述符是類描述符、方法描述符、字段描述符等描述符的具體的實(shí)現(xiàn)規(guī)則。

          參考資料

          感謝以下文章或視頻提供的學(xué)習(xí)資料,受益匪淺:

          1. 尚硅谷《宋紅康-JVM 從入門到精通》課程 : http://www.atguigu.com/
          2. java -- JVM的符號引用和直接引用 : https://www.cnblogs.com/shinubi/articles/6116993.html
          3. JVM 符號引用(Symbolic References) : https://blog.csdn.net/u014296316/article/details/83066436

          寫在最后的話

          內(nèi)容為學(xué)習(xí)相關(guān)資料后的總結(jié),一字一碼,姑且算是原創(chuàng)吧,歡迎轉(zhuǎn)載,公眾號或商業(yè)轉(zhuǎn)載請聯(lián)系本人。

          謝謝各位讀完本文,初涉寫作,內(nèi)容不佳,敬請見諒,如果對您有幫助,歡迎轉(zhuǎn)發(fā)、評論、關(guān)注。


          網(wǎng)站是使用HTML等制作的用于展示特定內(nèi)容相關(guān)的網(wǎng)頁集合
          網(wǎng)頁是網(wǎng)站中的一“頁”,通常是HTML格式的文件,需要通過瀏覽器來閱讀。
          網(wǎng)頁是構(gòu)成網(wǎng)站的基本元素,它通常由圖片、連接、文字、聲音、視頻等元素組分。一般以.htm或.HTML為后綴名的文件,都是HTML文件。
          什么是html
          html是超文本標(biāo)記語言,它是用來描述網(wǎng)頁的一種語言。
          1、可以加入圖片、聲音、動畫、多媒體文件等內(nèi)容。
          2、還可以從一盒文件跳轉(zhuǎn)到另一個文件,與世界各地主機(jī)的文件連接。
          網(wǎng)頁是由網(wǎng)頁元素組成,這些元素是利用html標(biāo)簽描述出來的,通過瀏覽器顯示給用戶。
          靜/動態(tài)區(qū)別:
          靜態(tài):
          XX.htm、xx. Html
          區(qū)分方式:網(wǎng)頁中數(shù)據(jù)的提取來源方式
          動態(tài):
          Xx.jsp、xx.php、xx.asp、xx.cgi
          頁面中的數(shù)據(jù)可以通過和數(shù)據(jù)庫等其他來源提取
          動靜態(tài)交互使用

          Html語句的語法的基本單位:

          標(biāo)簽、標(biāo)記

          tag<標(biāo)簽單詞><標(biāo)簽單詞 屬性名1=”屬性值” 屬性名1=”屬性值”>

          多數(shù)標(biāo)簽成對使用,相對少數(shù)標(biāo)簽非成對(獨(dú)立)使用<img>獨(dú)立使用

          <a> ... </a> 制作超級鏈接

          1. 創(chuàng)建文本文件

          2. 書寫html代碼(標(biāo)簽)

          3. 保存文件

          4. 文件名后綴改為.Html或.html

          5. 瀏覽器打開以上網(wǎng)頁文件

          標(biāo)簽不能書寫中文,只能是英文

          代碼中“空格”為縮進(jìn)

          嵌套

          <html>

          <head> </head>

          <body> </body>

          </html>

          <font></font>修飾文字

          字形face Font size=“1--7”字體大小 color顏色

          <em></em>強(qiáng)調(diào),斜體字

          <p>段落文字</p>

          <img src=”圖片文件名”alt=”xxxxx”width=”像素寬度”height=”像素高度”>

          絕對路徑:”file:///D:/html/11.jpg”

          相對路徑:”../src/1.html/11.jpg”

          <a>超鏈接</a>

          頁間跳轉(zhuǎn)

          <a href=”http://www.baidu.com”>文字、圖片</a>

          <a href=”../src/1.html”>文字、圖片</a>

          頁內(nèi)跳轉(zhuǎn)(標(biāo)簽需要成對出現(xiàn))href=作為起點(diǎn)name=作為結(jié)尾需要去到的地方

          <a Href=”#變量名”>....</a>

          ..................

          <a name=”變量名”>xxx</a>

          <a href=”..../#t1”

          兩者結(jié)合使用<a href=”http://www.baidu.com/news/#變量名”>

          ...............

          <a name=”變量名”></a>

          “彈幕”滾動標(biāo)簽

          標(biāo)簽在不同瀏覽器當(dāng)中打開時的內(nèi)容是不一樣的

          可用GRB單詞進(jìn)行顏色查找

          獨(dú)立使用標(biāo)簽:<img>< hr>< br換行>在需要換行的地方輸入即可

          空格在html中作為特殊符號使用:作為分隔符“ ”

          Html中漢字不作為標(biāo)簽符

          <;&abc>;作為括號使用

          字符集不同會出現(xiàn)亂碼

          Align水平對齊屬性;left、right、center

          注釋 屏蔽代碼

          Dos批處理 在注釋前加上“rem”

          Html <!-- 注釋的內(nèi)容...... - ->

          擴(kuò)展<META>元數(shù)據(jù)標(biāo)簽

          標(biāo)簽名稱、獨(dú)立使用、主要作用

          放在<head></head>中執(zhí)行 部分功能在瀏覽器打開時就開始工作

          Charset 字符集

          Set 賦值

          Set 集合

          Th 保存表格數(shù)據(jù)的單位,等同于<td>。但自帶居中加粗顯示

          Td、th單元格合并:

          同行左右單元格合并colspan=”n”

          同列上下單元格合并rowspan=”n”

          謂操作符,就是用來操作數(shù)據(jù)值的符號,在JavaScript中包括算術(shù)操作符、位操作符、關(guān)系操作符和相等操作符。這些操作符可以操作所有類型的數(shù)據(jù),比如字符串、數(shù)字、布爾值,甚至對象。

          一元操作符

          所謂一元操作符就是只能對一個數(shù)據(jù)值進(jìn)行操作,比如(遞增、遞減)操作符。

          遞增、遞減操作符是直接借鑒C語言的,它分前置型和后置型。前置就是操作符在要操作的變量之前,后置在變量之后。

          如下示例:

          // 前置型
          let age=20;
          ++age; // 遞增
          console.log(age); // 結(jié)果輸出21
          --age;//遞減
          console.log(age); // 結(jié)果輸出20

          如上面例子,age通過++操作符遞增變成21,又通過--操作符遞減變成20;上面的操作等同下面的操作:

          // 后置型
          let age=20;
          age=age + 1; // 加1
          age=age -1;  // 減1

          同理使用后置操作符會得到上面同樣的結(jié)果,但是前置和后置有區(qū)別。前置操作符在語句被求值以前改變,后置是在語句被求值后改變。通過下面的例子看下其區(qū)別:

          // 前置
          let age=20;
          let anotherAge=--age + 5;
          alert(age); // 輸出19
          alert(anotherAge); // 輸出24

          由于前置操作符的優(yōu)先級和執(zhí)行語句相等,因此會從左到右依次求值。上面的--age 會先進(jìn)行遞減操作,再繼續(xù)后面的 + 5 運(yùn)算,所以結(jié)果是24。

          // 后置時
          let age=20;
          let anotherAge=age-- + 5;
          alert(age); // 輸出19
          alert(anotherAge); // 輸出25

          但是后置的最終結(jié)果卻是25,因?yàn)閍ge-- 使用了遞減前的值繼續(xù)和后面進(jìn)行+5運(yùn)算。

          如果使用一個加號或減號時,加號代表正值、減號代表負(fù)值。

          加減乘除操作符

          操作多個數(shù)據(jù)值,比如加減乘除等:

          let a=1,b=2;
          let c=a + b; // 加
          let d=c - a; // 減
          let e=d * b; // 乘
          let f=e/d; // 除

          注意加減乘除主要用來操作數(shù)字類型的數(shù)據(jù),如果操作數(shù)不是數(shù)字類型,會先進(jìn)性強(qiáng)制轉(zhuǎn)換再進(jìn)行計算,這樣結(jié)果會不確定。

          位操作符

          位操作符,是指按內(nèi)存中的表示的數(shù)值位來操作數(shù)值,通俗講就是用來操作二進(jìn)制的數(shù)據(jù)。二進(jìn)制數(shù)據(jù)都是由0、1組成的,在JavaScript中所有數(shù)值都是64位的格式存儲,但位操作符不直接在64位的值上進(jìn)行計算,會先轉(zhuǎn)化成32位后再運(yùn)算。位操作符有以下幾種:

          按位非(NOT)

          按位非操作符是(~)符號,就是將二進(jìn)制中每位數(shù)值進(jìn)行反碼操作。其規(guī)則如下:

          操作符

          數(shù)值

          結(jié)果

          ~

          1

          0

          ~

          0

          1

          如下示例:

          let a=25;
          let b=~a;
          alert(b); // 輸出-26

          按位與(AND)

          使用(&)符號表示,它有2個操作數(shù),當(dāng)2個數(shù)對應(yīng)的位都是1時返回1,任何一位是0則返回0。如下規(guī)則:

          數(shù)值1

          操作符

          數(shù)值2

          結(jié)果

          1

          &

          1

          1

          1

          &

          0

          0

          0

          &

          1

          0

          0

          &

          0

          0

          示例:

          let a=25 & 3;
          alert(a); // 輸出結(jié)果是1

          按位或(OR)

          用(|)符號表示,同樣也是2個操作數(shù)。其規(guī)則是只要有一位是1其結(jié)果就是1,負(fù)則結(jié)果是0;

          數(shù)值1

          操作符

          數(shù)值2

          結(jié)果

          1

          |

          1

          1

          1

          |

          0

          1

          0

          |

          1

          1

          0

          |

          0

          0

          示例:

          let a=25 | 3;
          alert(a); // 輸出結(jié)果是27

          按位異或(XOR)

          由(^)符號表示,也是操作2個操作數(shù),其當(dāng)2個操作數(shù)的位值相同時返回0,負(fù)則返回1。

          數(shù)值1

          操作符

          數(shù)值2

          結(jié)果

          1

          ^

          1

          0

          1

          ^

          0

          1

          0

          ^

          1

          1

          0

          ^

          0

          0

          示例:

          let a=25 ^ 3;
          alert(a); // 輸出結(jié)果是26

          左移

          使用(<<)兩個小于號表示,這個操作符會將數(shù)值每一位向左移動指定位數(shù)。如下示例:

          let a=2;  // 二進(jìn)制 10
          let b=b << 5; // 二進(jìn)制的 1000000,十進(jìn)制64

          上面,將二進(jìn)制10向左移動5位,注意左移會多出5個空位,用0來填充,這樣就會得到一個完整的32位二進(jìn)制數(shù)據(jù)。

          注意,左移不會影響符號位(二進(jìn)制位中第一位表示數(shù)的正負(fù)),如-2 向左移5位結(jié)果是-64。

          有符號的右移

          使用(>>)兩個大于號表示,會將每位向右移動指定位數(shù),但保留符號位(即正負(fù)號標(biāo)記)。如下示例:

          let a=64;  // 二進(jìn)制 1000000
          let b=b >> 5; // 二進(jìn)制的 10,十進(jìn)制的2

          在移位過程,原數(shù)中也會出現(xiàn)空位,只不過這次空位出現(xiàn)在原數(shù)值左側(cè)、符號位右側(cè)。空位使用符號位值填充。

          有符號的整數(shù),指32位中前31位表示整數(shù)的值,第32位表示數(shù)值的符號,0正數(shù),1負(fù)數(shù)。這個表示符號的位就是符號位。

          無符號的右移

          使用(>>>)三個大于號表示,這個操作會將所有32位都向右移動。對于正數(shù)其結(jié)果和有符號的右移一樣,如下示例:

          let a=64;  // 二進(jìn)制 1000000
          let b=b >>> 5; // 二進(jìn)制的 10,十進(jìn)制的2

          但是負(fù)數(shù)就不一樣了,無符號的右移是以0來填充空位,不像有符號右移使用符號位填充。所以其結(jié)果相差很大,如下示例:

          let a=-64;  // 二進(jìn)制 1111 1111 1111 1111 1111 1111 1100 0000
          let b=b >>> 5; // 二進(jìn)制 0000 0111 1111 1111 1111 1111 1111 1110 ,十進(jìn)制的134217726

          布爾操作符

          在任何編程語言中,布爾操作符都是非常重要的,它是用來判斷邏輯的關(guān)鍵,布爾操作符一共有三種:非(NOT)、與(AND)、或(OR)。

          邏輯非

          使用(!)感嘆號表示邏輯非,其規(guī)則就是:

          操作符

          邏輯值

          結(jié)果

          true

          false

          false

          true

          邏輯與

          使用(&&)表示,操作兩個數(shù),如下示例:

          let a=ture && false;

          其規(guī)則如下:

          邏輯值1

          操作符

          邏輯值2

          結(jié)果

          ture

          &&

          ture

          ture

          ture

          &&

          false

          false

          false

          &&

          ture

          false

          false

          &&

          false

          false

          也就是只有當(dāng)2個數(shù)值都是true時其結(jié)果才是true。

          邏輯或

          使用(||)符號表示,也是有兩個操作數(shù),其示例:

          let a=true || false;

          規(guī)則如下:

          邏輯值1

          操作符

          邏輯值2

          結(jié)果

          ture

          ||

          ture

          ture

          ture

          ||

          false

          ture

          false

          ||

          ture

          ture

          false

          ||

          false

          false

          也就是2個操作數(shù)中有一個true,結(jié)果就是true,負(fù)則是false。

          注意布爾操作符,不僅僅可以操作布爾類型值,對于其它數(shù)據(jù)類型同樣適用,只不過會先將其它數(shù)據(jù)類型轉(zhuǎn)換成布爾值,再進(jìn)行布爾運(yùn)算。如下示例:

          let a=!1; //  輸出false
          let b=!'string'; // 輸出false
          let c=1 || 0; // 輸出true
          let e=1 && 0;// 輸出false
          let d=''&& 2; // 輸出true

          關(guān)系操作符

          關(guān)系操作符用來比較2個操作數(shù),有小于(<)、大于(>)、小于等于(<=)和大于等于(>=)。其比較的結(jié)果返回一個布爾值,true或false。

          如下示例:

          let a=5 > 3; // true
          let b=5 < 3; // false

          同樣,關(guān)系操作符也可以適用其它類型的數(shù)據(jù),比如字符串比較大小時,會按照字符的編碼大小比較。如下示例:

          let a="Brick" < "alphabet"; // true,

          上面中因?yàn)锽字符編碼是66,a的編碼是97,所以返回true。

          相等、不等操作符

          在編程中,確定2個值是否相等是一個非常重要的操作。在JavaScript中分相等(==)和全等(===)、不等(!=)和不全等(!==)四種。

          相等(==)和不相等(!=)

          如下示例:

          let a=1==1; // true
          let b=1==0;// false
          let c=1!=1; // false
          let d=1!=0; //true

          注意相等和不相等的操作前會先對操作性進(jìn)行強(qiáng)制轉(zhuǎn)換,如下示例:

          let a=true==1; // 先將true轉(zhuǎn)換成1再比較,結(jié)果是true
          let b=false==1; // 先將false轉(zhuǎn)換成0再比較,結(jié)果是false

          全相等(===)和不全相等(!==)

          全等和不全等不同之處是,它在比較數(shù)據(jù)前,不進(jìn)行數(shù)據(jù)類型轉(zhuǎn)換,是對原始數(shù)值比較,所以它的結(jié)果更加嚴(yán)格準(zhǔn)確,如下示例:

          let a=1===1; // true
          let b=1==='1';// false
          let c=1!==1; // false
          let d=1!=='1'; //true

          注意和之前相等和不相等的例子比較,其結(jié)果非常不一樣。

          賦值操作符

          使用(=)表示賦值操作,其作用就是把等號右側(cè)的值賦值給左邊的變量或?qū)傩裕缦率纠?/p>

          let a=10; // 給a變量賦值10

          如果在等號前面加上其它操作符,就組成了復(fù)合型賦值操作,如下示例:

          let a=10;
          a +=5; // 結(jié)果是 15

          上面的等同于下面:

          let a=10;
          a=a + 5; // 結(jié)果是 15

          當(dāng)然也可以使用其它操作符,如(*=)、(/=)、(%=)、(-=)、(<<=)等等。

          條件操作符

          也稱三目運(yùn)算符,它是一種簡便的條件運(yùn)算,可以把它看成是if else的簡化,其語法如下:

          變量=布爾表達(dá)式 ? true_value  : false_value

          先求出問號前面的布爾表示結(jié)果,如果是true,變量使用冒號前面的值,負(fù)則使用冒號后面的值。如下示例:

          let a=5 > 3 ? '好' :  '不好'; // 結(jié)果是 '好'

          逗號操作符

          使用(,)符號,表示可以執(zhí)行多個操作,常用于變量定義或函數(shù)參數(shù),如下示例:

          var a=0,b=1,c=2; // a、b、c使用逗號隔開
          let a,b,c;
          
          // 函數(shù)中的參數(shù)a、b、c使用逗號隔開
          function test(a,b,c){
          	// 函數(shù)主體
          }
          // 調(diào)用函數(shù)
          test(1,2,3)

          結(jié)論

          本節(jié)主要講述了JavaScript中所有的操作符概念,這些都是最基本的知識,需要完全掌握。在平常工作中其中除了位操作符不常用外,其它操作符使用頻率很高,尤其是布爾操作符,算術(shù)操作符,比較操作符等。

          本篇只是大概講述了操作符的概念和使用方法,還有一些細(xì)節(jié)沒有講到,作為入門課程已經(jīng)足夠了,你可以自己搜索每個知識點(diǎn)詳細(xì)內(nèi)容,比如關(guān)于二進(jìn)制數(shù)據(jù)、位操作、數(shù)據(jù)類型強(qiáng)制轉(zhuǎn)換等,這里不再詳細(xì)介紹。

          參考資料:

          《JavaScript 高級程序設(shè)計》

          https://developer.mozilla.org/zh-CN/docs/Web/JavaScript

          https://www.w3cschool.cn/javascript/js-operators.html


          主站蜘蛛池模板: 国产一区二区在线| 久久er99热精品一区二区| 人妻夜夜爽天天爽一区| 在线视频一区二区三区三区不卡| 精品人妻一区二区三区浪潮在线 | 日韩一区二区三区不卡视频| 成人免费区一区二区三区| 国产裸体舞一区二区三区| 亚洲电影唐人社一区二区| 国精品无码一区二区三区左线 | 国产精品无码一区二区三区不卡 | 免费萌白酱国产一区二区三区| 亚洲福利一区二区三区| 久久久久99人妻一区二区三区| 亚洲Av永久无码精品一区二区| 无码一区二区三区在线观看| 成人免费av一区二区三区| 国产一区二区三区四| 日本一区二区三区在线看 | 东京热人妻无码一区二区av| 日韩精品一区二区三区不卡 | 亚洲a∨无码一区二区| 精品永久久福利一区二区| 无码人妻一区二区三区免费看| 国产一区玩具在线观看| 国产91精品一区二区麻豆亚洲| 动漫精品一区二区三区3d| 无码人妻精品一区二区三区不卡| 日韩精品一区二区三区中文精品| 久久精品无码一区二区无码| 亚洲AV无码一区二区二三区入口 | 精品一区二区AV天堂| 一区二区三区在线观看| 亚洲国产视频一区| 久久人妻无码一区二区| 天堂va视频一区二区| 亚洲区精品久久一区二区三区| 精品一区二区三区波多野结衣| 精品视频午夜一区二区| 亚洲a∨无码一区二区| 国产91一区二区在线播放不卡|