精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

解讀:三目運(yùn)算符為何會(huì)導(dǎo)致 NPE?

開發(fā) 開發(fā)工具
在三目運(yùn)算符中,表達(dá)式 1 和 2 在涉及算術(shù)計(jì)算或數(shù)據(jù)類型轉(zhuǎn)換時(shí),會(huì)觸發(fā)自動(dòng)拆箱。當(dāng)其中的操作數(shù)為 null 值時(shí),會(huì)導(dǎo)致 NPE 。本文將詳細(xì)剖析 NPE 出現(xiàn)的原因,重新梳理相關(guān)知識(shí)點(diǎn),并進(jìn)一步擴(kuò)展,幫助大家徹底理解這個(gè)問題。

[[324819]]

 在三目運(yùn)算符中,表達(dá)式 1 和 2 在涉及算術(shù)計(jì)算或數(shù)據(jù)類型轉(zhuǎn)換時(shí),會(huì)觸發(fā)自動(dòng)拆箱。當(dāng)其中的操作數(shù)為 null 值時(shí),會(huì)導(dǎo)致 NPE 。本文將詳細(xì)剖析 NPE 出現(xiàn)的原因,重新梳理相關(guān)知識(shí)點(diǎn),并進(jìn)一步擴(kuò)展,幫助大家徹底理解這個(gè)問題。

最近,《Java 開發(fā)手冊(cè)》發(fā)布了最新版——泰山版,這個(gè)名字起的不錯(cuò),一覽眾山小。

新版新增了 30+ 規(guī)約,其中有一條規(guī)約引起了作者的關(guān)注,那就是手冊(cè)中提到在三目運(yùn)算符使用過程中,需要注意自動(dòng)拆箱導(dǎo)致的 NullPointerException(后文簡稱:NPE)問題:

 

因?yàn)檫@個(gè)問題我很久之前(2015 年)遇到過,曾經(jīng)在博客中也記錄過,剛好最新的開發(fā)手冊(cè)再次提到了這個(gè)知識(shí)點(diǎn),于是把之前的文章內(nèi)容翻出來并重新整理了一下,帶大家一起回顧下這個(gè)知識(shí)點(diǎn)。

可能有些人看過我之前那篇文章,本文并不是單純的"舊瓶裝新酒",在重新梳理這個(gè)知識(shí)點(diǎn)的時(shí)候,作者重新翻閱了《The Java Language Specification》,并且對(duì)比了 Java SE 7 和 Java SE 8 之后的相關(guān)變化,希望可以幫助大家更加全面的理解這個(gè)問題。

基礎(chǔ)回顧

在詳細(xì)展看介紹之前,先簡單介紹下本文要涉及到的幾個(gè)重要概念,分別是"三目運(yùn)算符"、"自動(dòng)拆裝箱"等,如果大家對(duì)于這些歷史知識(shí)有所掌握的話,可以先跳過本段內(nèi)容,直接看問題重現(xiàn)部分即可。

三目運(yùn)算符

在《The Java Language Specification》中,三目運(yùn)算符的官方名稱是 Conditional Operator ? : ,我一般稱呼他為條件表達(dá)式,詳細(xì)介紹在 JLS 15.25 中,這里簡單介紹下其基本形式和用法。

三目運(yùn)算符是 Java 語言中的重要組成部分,它也是唯一有 3 個(gè)操作數(shù)的運(yùn)算符。形式為:

  • <表達(dá)式1> ? <表達(dá)式2> : <表達(dá)式3>

以上,通過 ?、: 組合的形式得到一個(gè)條件表達(dá)式。其中 ? 運(yùn)算符的含義是:先求表達(dá)式 1 的值,如果為真,則執(zhí)行并返回表達(dá)式 2 的結(jié)果;如果表達(dá)式 1 的值為假,則執(zhí)行并返回表達(dá)式 3 的結(jié)果。

值得注意的是,一個(gè)條件表達(dá)式從不會(huì)既計(jì)算 <表達(dá)式 2>,又計(jì)算 <表達(dá)式 3>。條件運(yùn)算符是右結(jié)合的,也就是說,從右向左分組計(jì)算。例如,a?b:c?d:e 將按 a?b:(c?d:e) 執(zhí)行。

自動(dòng)裝箱與自動(dòng)拆箱

介紹過了三目運(yùn)算符(條件表達(dá)式)之后,我們?cè)賮砗唵谓榻B下 Java 中的自動(dòng)拆裝箱相關(guān)知識(shí)點(diǎn)。

每一個(gè) Java 開發(fā)者一定都對(duì) Java 中的基本數(shù)據(jù)類型不陌生,Java 中共有 8 種基本數(shù)據(jù)類型,這些基礎(chǔ)數(shù)據(jù)類型帶來一個(gè)好處就是他們直接在棧內(nèi)存中存儲(chǔ),不會(huì)在堆上分配內(nèi)存,使用起來更加高效。

但是,Java 語言是一個(gè)面向?qū)ο蟮恼Z言,而基本數(shù)據(jù)類型不是對(duì)象,導(dǎo)致在實(shí)際使用過程中有諸多不便,如集合類要求其內(nèi)部元素必須是 Object 類型,基本數(shù)據(jù)類型就無法使用。

所以,相對(duì)應(yīng)的,Java 提供了 8 種包裝類型,更加方便在需要對(duì)象的地方使用。

有了基本數(shù)據(jù)類型和包裝類,帶來了一個(gè)麻煩就是需要在他們之間進(jìn)行轉(zhuǎn)換。在 Java SE5 中,為了減少開發(fā)人員的工作,Java 提供了自動(dòng)拆箱與自動(dòng)裝箱功能。

  • 自動(dòng)裝箱:就是將基本數(shù)據(jù)類型自動(dòng)轉(zhuǎn)換成對(duì)應(yīng)的包裝類。
  • 自動(dòng)拆箱:就是將包裝類自動(dòng)轉(zhuǎn)換成對(duì)應(yīng)的基本數(shù)據(jù)類型。
  1. Integer i =10;  //自動(dòng)裝箱 
  2. int b= i;     //自動(dòng)拆箱 

我們可以簡單理解為,當(dāng)我們自己寫的代碼符合裝(拆)箱規(guī)范的時(shí)候,編譯器就會(huì)自動(dòng)幫我們拆(裝)箱。

自動(dòng)裝箱都是通過包裝類的 valueOf() 方法來實(shí)現(xiàn)的.自動(dòng)拆箱都是通過包裝類對(duì)象的xxxValue() 來實(shí)現(xiàn)的(如 booleanValue()、longValue() 等)。

問題重現(xiàn)

在最新版的開發(fā)手冊(cè)中給出了一個(gè)例子,提示我們?cè)谑褂萌窟\(yùn)算符的過程中,可能會(huì)進(jìn)行自動(dòng)拆箱而導(dǎo)致 NPE 問題。

原文中的例子相對(duì)復(fù)雜一些,因?yàn)樗€涉及到多個(gè) Integer 相乘的結(jié)果是 int 的問題,我們舉一個(gè)相對(duì)簡單的一點(diǎn)的例子先來重現(xiàn)下這個(gè)問題:

  1. boolean flag = true; //設(shè)置成true,保證條件表達(dá)式的表達(dá)式二一定可以執(zhí)行 
  2. boolean simpleBoolean = false; //定義一個(gè)基本數(shù)據(jù)類型的boolean變量 
  3. Boolean nullBoolean = null;//定義一個(gè)包裝類對(duì)象類型的Boolean變量,值為null  
  4. boolean x = flag ? nullBoolean : simpleBoolean; //使用三目運(yùn)算符并給x變量賦值 

以上代碼,在運(yùn)行過程中,會(huì)拋出 NPE:

  1. Exception in thread "main" java.lang.NullPointerException 

而且,這個(gè)和你使用的 JDK 版本是無關(guān)的,作者分別在 JDK 6、JDK 8 和 JDK 14 上做了測試,均會(huì)拋出 NPE。

為了一探究竟,我們嘗試對(duì)以上代碼進(jìn)行反編譯,使用 jad 工具進(jìn)行反編譯后,得到以下代碼:

  1. boolean flag = true
  2. boolean simpleBoolean = false
  3. Boolean nullBoolean = null
  4. boolean x = flag ? nullBoolean.booleanValue() : simpleBoolean; 

可以看到,反編譯后的代碼的最后一行,編譯器幫我們做了一次自動(dòng)拆箱,而就是因?yàn)檫@次自動(dòng)拆箱,導(dǎo)致代碼出現(xiàn)對(duì)于一個(gè) null 對(duì)象( nullBoolean.booleanValue() )的調(diào)用,導(dǎo)致了 NPE。

那么,為什么編譯器會(huì)進(jìn)行自動(dòng)拆箱呢?什么情況下需要進(jìn)行自動(dòng)拆箱呢?

原理分析

關(guān)于為什么編輯器會(huì)在代碼編譯階段對(duì)于三目運(yùn)算符中的表達(dá)式進(jìn)行自動(dòng)拆箱,其實(shí)在《The Java Language Specification》(后文簡稱 JLS)的第 15.25 章節(jié)中是有相關(guān)介紹的。

在不同版本的 JLS 中,關(guān)于這部分描述雖然不盡相同,尤其在 Java 8 中有了大幅度的更新,但是其核心內(nèi)容和原理是不變的。我們直接看 Java SE 1.7 JLS 中關(guān)于這部分的描述(因?yàn)?1.7 的表述更加簡潔一些):

  • The type of a conditional expression is determined as follows: • If the second and third operands have the same type (which may be the null type),then that is the type of the conditional expression. • If one of the second and third operands is of primitive type T, and the type of the other is the result of applying boxing conversion (§5.1.7) to T, then the type of the conditional expression is T.

簡單的來說就是:當(dāng)?shù)诙缓偷谌徊僮鲾?shù)的類型相同時(shí),則三目運(yùn)算符表達(dá)式的結(jié)果和這兩位操作數(shù)的類型相同。當(dāng)?shù)诙谌徊僮鲾?shù)分別為基本類型和該基本類型對(duì)應(yīng)的包裝類型時(shí),那么該表達(dá)式的結(jié)果的類型要求是基本類型。

為了滿足以上規(guī)定,又避免程序員過度感知這個(gè)規(guī)則,所以在編譯過程中編譯器如果發(fā)現(xiàn)三目操作符的第二位和第三位操作數(shù)的類型分別是基本數(shù)據(jù)類型(如 boolean)以及該基本類型對(duì)應(yīng)的包裝類型(如 Boolean)時(shí),并且需要返回表達(dá)式為包裝類型,那么就需要對(duì)該包裝類進(jìn)行自動(dòng)拆箱。

在 Java SE 1.8 JLS 中,關(guān)于這部分描述又做了一些細(xì)分,再次把表達(dá)式區(qū)分成布爾型條件表達(dá)式(Boolean Conditional Expressions)、數(shù)值型條件表達(dá)式(Numeric Conditional Expressions)和引用類型條件表達(dá)式(Reference Conditional Expressions)。

并且通過表格的形式明確的列舉了第二位和第三位分別是不同類型時(shí)得到的表達(dá)式結(jié)果值應(yīng)該是什么,感興趣的大家可以去翻閱一下。

其實(shí)簡單總結(jié)下,就是:

當(dāng)?shù)诙缓偷谌槐磉_(dá)式都是包裝類型的時(shí)候,該表達(dá)式的結(jié)果才是該包裝類型,否則,只要有一個(gè)表達(dá)式的類型是基本數(shù)據(jù)類型,則表達(dá)式得到的結(jié)果都是基本數(shù)據(jù)類型。如果結(jié)果不符合預(yù)期,那么編譯器就會(huì)進(jìn)行自動(dòng)拆箱。即 Java 開發(fā)手冊(cè)中總結(jié)的:只要表達(dá)式 1 和表達(dá)式 2 的類型有一個(gè)是基本類型,就會(huì)做觸發(fā)類型對(duì)齊的拆箱操作,只不過如果都是基本類型也就不需要拆箱了。

如下 3 種情況是我們熟知該規(guī)則,在聲明表達(dá)式的結(jié)果的類型時(shí)刻意和規(guī)則保持一致的情況(為了幫助大家理解,我備注了注釋和反編譯后的代碼):

  1. boolean flag = true
  2. boolean simpleBoolean = false
  3. Boolean objectBoolean = Boolean.FALSE
  1. //當(dāng)?shù)诙缓偷谌槐磉_(dá)式都是對(duì)象時(shí),表達(dá)式返回值也為對(duì)象。 
  2. Boolean x1 = flag ? objectBoolean : objectBoolean; 
  3. //反編譯后代碼為:Boolean x1 = flag ? objectBoolean : objectBoolean; 
  4. //因?yàn)閤1的類型是對(duì)象,所以不需要做任何特殊操作。     
  1. //當(dāng)?shù)诙缓偷谌槐磉_(dá)式都為基本類型時(shí),表達(dá)式返回值也為基本類型。 
  2. boolean x2 = flag ? simpleBoolean : simpleBoolean; 
  3. //反編譯后代碼為:boolean x2 = flag ? simpleBoolean : simpleBoolean; 
  4. //因?yàn)?nbsp;x2 的類型也是基本類型,所以不需要做任何特殊操作。 
  1. //當(dāng)?shù)诙缓偷谌槐磉_(dá)式中有一個(gè)為基本類型時(shí),表達(dá)式返回值也為基本類型。 
  2. boolean x3 = flag ? objectBoolean : simpleBoolean; 
  3. //反編譯后代碼為:boolean x3 = flag ? objectBoolean.booleanValue() : simpleBoolean; 
  4. //因?yàn)?nbsp;x3 的類型是基本類型,所以需要對(duì)其中的包裝類進(jìn)行拆箱。 

因?yàn)槲覀兪熘窟\(yùn)算符的規(guī)則,所以我們就會(huì)按照以上方式去定義 x1、x2 和 x3 的類型。

但是,并不是所有人都熟知這個(gè)規(guī)則,所以在實(shí)際應(yīng)用中,還會(huì)出現(xiàn)以下三種定義方式:

  1. //當(dāng)?shù)诙缓偷谌槐磉_(dá)式都是對(duì)象時(shí),表達(dá)式返回值也為對(duì)象。 
  2. boolean x4 = flag ? objectBoolean : objectBoolean; 
  3. //反編譯后代碼為:boolean x4 = (flag ? objectBoolean : objectBoolean).booleanValue(); 
  4. //因?yàn)?nbsp;x4 的類型是基本類型,所以需要對(duì)表達(dá)式結(jié)果進(jìn)行自動(dòng)拆箱。 
  1. //當(dāng)?shù)诙缓偷谌槐磉_(dá)式都為基本類型時(shí),表達(dá)式返回值也為基本類型。 
  2. Boolean x5 = flag ? simpleBoolean : simpleBoolean; 
  3. //反編譯后代碼為:Boolean x5 = Boolean.valueOf(flag ? simpleBoolean : simpleBoolean); 
  4. //因?yàn)?nbsp;x5 的類型是對(duì)象類型,所以需要對(duì)表達(dá)式結(jié)果進(jìn)行自動(dòng)裝箱。 
  1. //當(dāng)?shù)诙缓偷谌槐磉_(dá)式中有一個(gè)為基本類型時(shí),表達(dá)式返回值也為基本類型。 
  2. Boolean x6 = flag ? objectBoolean : simpleBoolean; 
  3. //反編譯后代碼為:Boolean x6 = Boolean.valueOf(flag ? objectBoolean.booleanValue() : simpleBoolean); 
  4. //因?yàn)?nbsp;x6 的類型是對(duì)象類型,所以需要對(duì)表達(dá)式結(jié)果進(jìn)行自動(dòng)裝箱。 

所以,日常開發(fā)中就有可能出現(xiàn)以上 6 種情況。聰明的讀者們讀到這里也一定想到了,在以上 6 種情況中,如果是涉及到自動(dòng)拆箱的,一旦對(duì)象的值為 null,就必然會(huì)發(fā)生 NPE。

舉例驗(yàn)證,我們把以上的 x3、x4 以及 x6 中的的對(duì)象類型設(shè)置成 null,分別執(zhí)行下代碼:

  1. Boolean nullBoolean = null; 
  2. boolean x3 = flag ? nullBoolean : simpleBoolean; 
  3. boolean x4 = flag ? nullBoolean : objectBoolean; 
  4. Boolean x6 = flag ? nullBoolean : simpleBoolean; 

以上三種情況,都會(huì)在執(zhí)行時(shí)發(fā)生 NPE。

其中 x3 和 x6 是三目運(yùn)算符運(yùn)算過程中,根據(jù) JLS 的規(guī)則確定類型的過程中要做自動(dòng)拆箱而導(dǎo)致的 NPE。由于使用了三目運(yùn)算符,并且第二、第三位操作數(shù)分別是基本類型和對(duì)象。就需要對(duì)對(duì)象進(jìn)行拆箱操作,由于該對(duì)象為 null,所以在拆箱過程中調(diào)用 null.booleanValue() 的時(shí)候就報(bào)了 NPE。

而 x4 是因?yàn)槿窟\(yùn)算符運(yùn)算結(jié)束后根據(jù)規(guī)則他得到的是一個(gè)對(duì)象類型,但是在給變量賦值過程中進(jìn)行自動(dòng)拆箱所導(dǎo)致的 NPE。

小結(jié)

如前文介紹,在開發(fā)過程中,如果涉及到三目運(yùn)算符,那么就要高度注意其中的自動(dòng)拆裝箱問題。

最好的做法就是保持三目運(yùn)算符的第二位和第三位表達(dá)式的類型一致,并且如果要把三目運(yùn)算符表達(dá)式給變量賦值的時(shí)候,也盡量保持變量的類型和他們保持一致。并且,做好單元測試!!!

所以,《Java 開發(fā)手冊(cè)》中提到要高度注意第二位和第三位表達(dá)式的類型對(duì)齊過程中由于自動(dòng)拆箱發(fā)生的 NPE 問題,其實(shí)還需要注意使用三目運(yùn)算符表達(dá)式給變量賦值的時(shí)候由于自動(dòng)拆箱導(dǎo)致的 NPE 問題。

至此,我們已經(jīng)介紹完了《Java 開發(fā)手冊(cè)》中關(guān)于三目運(yùn)算符使用過程中可能會(huì)導(dǎo)致 NPE 的問題。

如果一定要給出一個(gè)方法論去避免這個(gè)問題的話,那么在使用的過程中,無論是三目運(yùn)算符中的三個(gè)表達(dá)式,還是三目運(yùn)算符表達(dá)式要賦值的變量,最好都使用包裝類型,可以減少發(fā)生錯(cuò)誤的概率。

擴(kuò)展思考

為了方便大家理解,我使用了簡單的布爾類型的例子說明了 NPE 的問題。但是實(shí)際在代碼開發(fā)中,遇到的場景可能并沒有那么簡單,比如說以下代碼,大家猜一下能否正常執(zhí)行:

  1. Map<String,Boolean> map =  new HashMap<String, Boolean>(); 
  2. Boolean b = (map!=null ? map.get("Hollis") : false); 

如果你的答案是"不能,這里會(huì)拋 NPE"那么說明你看懂了本文的內(nèi)容,但是,我只能說你只是答對(duì)了一半。

因?yàn)橐陨洗a,在小于 JDK 1.8 的版本中執(zhí)行的結(jié)果是 NPE,在 JDK 1.8 及以后的版本中執(zhí)行結(jié)果是 null。

之所以會(huì)出現(xiàn)這樣的不同,這個(gè)就說來話長了,我挑其中的重點(diǎn)內(nèi)容簡單介紹下吧,以下內(nèi)容主要還是圍繞 Java 8 的 JLS 。

JLS 15 中對(duì)條件表達(dá)式(三目運(yùn)算符)做了細(xì)分之后分為三種,區(qū)分方式:

  • 如果表達(dá)式的第二個(gè)和第三個(gè)操作數(shù)都是布爾表達(dá)式,那么該條件表達(dá)式就是布爾表達(dá)式
  • 如果表達(dá)式的第二個(gè)和第三個(gè)操作數(shù)都是數(shù)字型表達(dá)式,那么該條件表達(dá)式就是數(shù)字型表達(dá)式
  • 除了以上兩種以外的表達(dá)式就是引用表達(dá)式

因?yàn)?Boolean b = (map!=null ? map.get("Hollis") : false); 表達(dá)式中,第二位操作數(shù)為 map.get("test") ,雖然 Map 在定義的時(shí)候規(guī)定了其值類型為 Boolean,但是在編譯過程中泛型是會(huì)被擦除的(泛型的類型擦除),所以,其結(jié)果就是 Object。那么根據(jù)以上規(guī)則判斷,這個(gè)表達(dá)式就是引用表達(dá)式。

又跟據(jù) JLS 15.25.3 中規(guī)定:

如果引用條件表達(dá)式出現(xiàn)在賦值上下文或調(diào)用上下文中,那么條件表達(dá)式就是合成表達(dá)式

因?yàn)椋珺oolean b = (map!=null ? map.get("Hollis") : false); 其實(shí)就是一個(gè)賦值上下文(關(guān)于賦值上下文相見 JLS 5.2),所以 map!=null ? map.get("Hollis") : false; 就是合成表達(dá)式。

那么 JLS 15.25.3 中對(duì)合成表達(dá)式的操作數(shù)類型做了約束:

合成的引用條件表達(dá)式的類型與其目標(biāo)類型相同

所以,因?yàn)橛辛诉@個(gè)約束,編譯器就可以推斷(Java 8 中類型推斷,詳見 JLS 18)出該表達(dá)式的第二個(gè)操作數(shù)和第三個(gè)操作數(shù)的結(jié)果應(yīng)該都是 Boolean 類型。

所以,在編譯過程中,就可以分別把他們都轉(zhuǎn)成 Boolean 即可,那么以上代碼在 Java 8 中反編譯后內(nèi)容如下:

  1. Boolean b = maps == null ? Boolean.valueOf(false) : (Boolean)maps.get("Hollis"); 

但是在 Java 7 中可沒有這些規(guī)定(Java 8 之前的類型推斷功能還很弱),編譯器只知道表達(dá)式的第二位和第三位分別是基本類型和包裝類型,而無法推斷最終表達(dá)式類型。

那么他就會(huì)先根據(jù) JLS 15.25 的規(guī)定,把返回值結(jié)果轉(zhuǎn)換成基本類型。然后在進(jìn)行變量賦值的時(shí)候,再轉(zhuǎn)換成包裝類型:

  1. Boolean b = Boolean.valueOf(maps == null ? false : ((Boolean)maps.get("Hollis")).booleanValue()); 

所以,相比 Java 8 中多了一步自動(dòng)拆箱,所以會(huì)導(dǎo)致 NPE。

參考資料:

【1】《Java 開發(fā)手冊(cè)(泰山版)》

【2】http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.25

【3】http://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.25

【4】https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html#jls-15.2

【5】https://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.12.2.7

【6】https://docs.oracle.com/javase/specs/jls/se8/html/jls-18.html

 

責(zé)任編輯:武曉燕 來源: 51CTO專欄
相關(guān)推薦

2009-12-08 10:00:36

PHP比較運(yùn)算符

2018-04-27 15:30:53

Java三目運(yùn)算符

2025-02-24 11:16:20

2010-01-20 14:32:12

VB.NET轉(zhuǎn)換運(yùn)算符

2009-08-11 15:51:08

C#運(yùn)算符算術(shù)運(yùn)算符

2024-01-31 08:12:42

編程C++運(yùn)算符

2020-06-01 08:04:18

三目運(yùn)算符代碼

2009-08-12 15:02:49

C#賦值運(yùn)算符簡單賦值運(yùn)算符

2009-08-12 15:20:18

C#賦值運(yùn)算符復(fù)合賦值運(yùn)算符

2023-04-10 08:58:13

C#關(guān)系運(yùn)算符

2020-04-28 10:54:13

運(yùn)算符開發(fā)Java

2016-10-14 14:04:34

JAVA語法main

2009-08-12 09:30:10

C#??運(yùn)算符

2009-06-21 13:48:05

ShellLinux運(yùn)算符

2021-12-15 10:25:57

C++運(yùn)算符重載

2024-02-26 15:17:20

2023-04-07 08:02:54

源碼位邏輯運(yùn)算符

2009-08-12 10:47:03

C#運(yùn)算符重載

2021-12-16 10:40:11

C++運(yùn)算符重載

2021-02-20 23:34:22

JavaScript運(yùn)算符開發(fā)
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)

在线精品小视频| 伊人影院在线视频| 国产一区二区三区自拍| 日韩一区二区三区视频在线| 日本黄色播放器| 国产精品污视频| 欧美激情日韩| 亚洲国产成人精品电影| 精品久久久久久久免费人妻| 极品白浆推特女神在线观看 | 都市激情亚洲一区| 久久久精品日韩欧美| 国产91成人video| 亚洲成人黄色av| 亚洲午夜剧场| 午夜精品福利久久久| 日本欧美精品久久久| 中文字幕激情视频| 国产一区久久| 一区二区三区视频免费在线观看| 91视频最新入口| eeuss影院在线播放| 国产乱码精品1区2区3区| 国外视频精品毛片| 五月天免费网站| 日本在线视频一区二区三区| 欧美日韩午夜剧场| 伊人婷婷久久| 午夜成人免费影院| 免费高清不卡av| 欧美激情18p| 老头老太做爰xxx视频| 日韩在线网址| 欧洲av在线精品| 特级黄色录像片| 青梅竹马是消防员在线| 国产精品自在欧美一区| 秋霞av国产精品一区| 成人免费精品动漫网站| 九九视频精品全部免费播放| 日韩色视频在线观看| 欧美日韩在线成人| 国产美女一区视频| 亚洲欧美综合另类在线卡通| 国产青春久久久国产毛片| 最新在线中文字幕| 久久成人免费| 久久青草精品视频免费观看| 很污很黄的网站| 亚洲性视频大全| 欧美老女人第四色| 99视频在线免费| 日韩伦理在线一区| 亚洲国产精品一区二区尤物区| 亚洲激情啪啪| 国产小视频免费在线网址| 不卡在线视频中文字幕| 国产精品久久一区| 精产国品一区二区| 一区二区日本视频| 久久免费视频网| 国内偷拍精品视频| 亚洲91中文字幕无线码三区| 一本色道久久综合狠狠躁篇的优点| 成人在线短视频| 亚洲免费一区| 欧美日韩日日摸| 亚洲成人天堂网| 国产激情欧美| 在线观看日韩一区| 欧美三级午夜理伦三级富婆| 性欧美videohd高精| 欧美日韩亚洲精品内裤| 人妻夜夜添夜夜无码av| gogo高清在线播放免费| 亚洲综合色网站| 欧美日韩视频免费| 国产蜜臀一区二区打屁股调教| 一区二区三区日韩在线观看| 国产欧美久久久久| 爱福利在线视频| 国产精品久久久久影院| 在线观看欧美亚洲| 国产在线高清视频| 亚洲精品第一国产综合野| 少妇久久久久久被弄到高潮| 性欧美高清come| 国产精品电影院| 伊人色综合影院| 亚洲奶水xxxx哺乳期| 亚洲精品高清在线| 青青草精品视频在线| 三级在线观看视频| 欧美在线视频不卡| 国产九九在线观看| 亚洲青青一区| 日韩欧美一区二区免费| 国产草草浮力影院| 成人羞羞在线观看网站| 日韩一中文字幕| 东方伊人免费在线观看| 正在播放日韩欧美一页| 国内精品一区二区三区| 一级黄色av片| 久久99久久99| 国产福利久久| 国产资源在线观看| 亚洲精选在线视频| 精品99在线视频| 日韩毛片网站| 亚洲第一色中文字幕| mm131丰满少妇人体欣赏图| 精品99久久| 美女性感视频久久久| 日本在线视频中文字幕| 久久一区二区三区超碰国产精品| 国产欧美日韩免费看aⅴ视频| 午夜免费福利视频| 国产日韩精品一区| a级免费在线观看| 不卡亚洲精品| 亚洲第一精品夜夜躁人人躁| 日本免费网站视频| 欧美亚洲网站| 亚洲永久在线观看| 浮生影视网在线观看免费| 亚洲黄色av一区| 亚洲人成色77777| 97品白浆高清久久久久久| 国产亚洲精品综合一区91| 久久精品黄色片| 日韩av午夜在线观看| 99久久国产免费免费| 川上优的av在线一区二区| 中文字幕亚洲一区二区av在线| 国产精品50p| 国产一区二区高清在线| 在线精品视频视频中文字幕| 国产乡下妇女做爰| 国产一区二区导航在线播放| 日韩av电影免费观看| 蜜臀av在线| 欧美丰满美乳xxx高潮www| 人妻体内射精一区二区| 欧美国产精品| 国产精品一区电影| 青青草av免费在线观看| 亚洲国产欧美一区二区三区丁香婷| 2025韩国理伦片在线观看| 日本一道高清一区二区三区| 久久99亚洲精品| 国产女人18毛片18精品| 国产午夜亚洲精品不卡| www黄色日本| 亚洲第一二三区| 性欧美在线看片a免费观看| 午夜精品久久久久久久99 | 一卡二卡三卡四卡| 91综合视频| 国产精品户外野外| 国模吧精品人体gogo| 欧美性精品220| 成人免费无码大片a毛片| 欧美激情在线| 亚洲在线视频观看| 伊人电影在线观看| 日韩视频一区二区| 少妇影院在线观看| 国产精品影视网| 亚洲在线色站| 欧美特黄色片| 啊v视频在线一区二区三区 | 91精品国产综合久久精品麻豆| 日本午夜精品视频| 麻豆精品一区二区综合av| 色一情一乱一伦一区二区三欧美| 久久青青视频| 一本一道久久a久久精品逆3p| 日本精品入口免费视频| 久久久欧美精品sm网站| 久久精品网站视频| 不卡中文一二三区| 国产免费一区二区三区在线能观看| 福利成人在线观看| 欧美日韩国产另类不卡| 久久久99999| 久久9热精品视频| 欧美大片免费播放| 国产精品白浆| 国产成人精品视频| 黄色动漫在线| 91麻豆精品国产91久久久资源速度 | 免费超碰在线| 欧美少妇性性性| 四虎884aa成人精品| 国产白丝精品91爽爽久久| 日本午夜激情视频| 国产一区二区在线| 91丨九色丨国产在线| 国产探花在线观看| 亚洲免费视频在线观看| 中文字幕精品一区二| ...av二区三区久久精品| 亚洲少妇一区二区三区| 99亚洲一区二区| 亚洲精品一区国产精品| 日韩在线精品强乱中文字幕| 97在线精品视频| yes4444视频在线观看| 欧美一区二区在线免费观看| 国产欧美日韩另类| 久久久精品综合| 韩国三级在线播放| 久久www成人_看片免费不卡| 国产日韩视频在线播放| 日韩手机在线| 91久久精品国产91久久性色| 僵尸再翻生在线观看免费国语| 中文字幕av一区中文字幕天堂 | 日韩一区二区三区不卡视频| 欧美久久视频| 亚洲欧洲久久| 欧美h版在线观看| 日本久久久久久久久| a视频在线观看免费| 亚洲欧美另类在线观看| www.激情五月| 欧美日韩国产成人在线免费| 欧美日韩免费做爰视频| 中文字幕第一区综合| 久久午夜夜伦鲁鲁片| 国产精品一区久久久久| av免费中文字幕| 欧美精品97| 一区二区三区在线观看www| 日韩高清在线观看一区二区| 国产精品av电影| 国产在线88av| 欧美激情亚洲国产| 国产免费av高清在线| 亚洲成人黄色网址| 精品人妻少妇AV无码专区| 欧美自拍偷拍午夜视频| 9i看片成人免费看片| 亚洲最大成人网4388xx| 久久国产高清视频| 中文字幕巨乱亚洲| 久操视频免费看| 99国产欧美另类久久久精品| 亚洲v在线观看| 国产一区二区不卡| 国内av一区二区| 久久www成人_看片免费不卡| 国产精品国产亚洲精品看不卡| 欧美a级一区| 成人性做爰片免费视频| 日韩中文首页| 四虎永久国产精品| 精品一区不卡| 欧美亚洲丝袜| 香蕉一区二区| 蜜桃麻豆91| 日韩黄色网络| 午夜视频久久久| 999国产精品视频| 国产1区2区3区中文字幕| 尹人成人综合网| 欧美 日韩精品| 美女久久久精品| 深爱五月综合网| av在线不卡网| 国产高清一区二区三区四区| 中文字幕一区av| 国产香蕉在线视频| 91九色最新地址| 国产精品热久久| 亚洲国产精品悠悠久久琪琪 | 精品中文视频| 国产区一区二区| 精品国产一区二区三区小蝌蚪| 中文字幕日韩精品一区二区| 欧美欧美全黄| 成人在线观看黄| 精品一区中文字幕| 完美搭档在线观看| 国产精品美女久久久久久久久| 少妇人妻丰满做爰xxx| 欧美日韩国产精品一区| 在线播放国产一区| 精品国产乱码久久久久久1区2区| 毛片在线播放网址| 久久精品免费播放| 乡村艳史在线观看| 92国产精品久久久久首页| 琪琪久久久久日韩精品| 国产系列第一页| 一区二区91| 四虎国产精品永久免费观看视频| 久久这里只精品最新地址| 国产精品白丝喷水在线观看| 黑人巨大精品欧美一区免费视频 | 亚洲精品电影网| 日本精品一区二区三区在线播放| 久久久欧美精品| 久久亚洲精品人成综合网| 精品国产乱码久久久久久郑州公司 | 亚洲精品一区二区三区福利| 77777影视视频在线观看| 欧美高清视频在线| 成人在线视频观看| 另类欧美小说| 激情亚洲网站| 一区二区三区国产好的精华液| 久久久青草青青国产亚洲免观| 免费在线观看国产精品| 欧美高清视频不卡网| 国产在线视频网站| 97在线日本国产| 视频二区欧美毛片免费观看| 正在播放国产精品| 日韩专区一卡二卡| 老鸭窝一区二区| 亚洲成av人综合在线观看| 国产成人麻豆精品午夜在线| 自拍亚洲一区欧美另类| 亚洲精品mv| 精品久久久久久一区| 狠色狠色综合久久| 捷克做爰xxxⅹ性视频| 成人免费在线播放视频| 91福利在线观看视频| 伊人伊成久久人综合网小说| 一二三四视频在线中文| 国产一区福利视频| 亚洲看片一区| 男人网站在线观看| 亚洲一区二区三区四区在线| 国产激情久久久久久熟女老人av| 久久久国产成人精品| 国产精品.xx视频.xxtv| 亚洲国产日韩欧美| 久久99国内精品| 5566中文字幕| 91精品婷婷国产综合久久竹菊| 免费黄网在线观看| 成人在线免费观看视视频| 水蜜桃精品av一区二区| 在线黄色免费看| 成人免费小视频| av网站免费播放| 欧美激情按摩在线| 成人av综合网| 九色在线视频观看| 久久精品视频免费| 中文天堂在线视频| 久久精品国产69国产精品亚洲| 九色成人搞黄网站| 中文字幕剧情在线观看一区| 精品午夜一区二区三区在线观看| 日韩精品一区二区亚洲av性色| 日韩午夜精品电影| 不卡的av影片| 免费精品视频一区二区三区| 久久精品卡一| 日本免费网站视频| 日韩视频一区二区在线观看| 91超碰免费在线| 奇米视频888战线精品播放| 日本在线不卡视频| 欧美成人aaa片一区国产精品| 精品国产免费人成在线观看| 成人亚洲欧美| 一区二区在线观| 成a人片国产精品| 成人一级免费视频| 久久精品99久久久久久久久| 91成人在线精品视频| 国产精品免费入口| 国产精品成人免费精品自在线观看 | 久久一二三四| 日韩精品一区二区亚洲av性色| 欧美tickling网站挠脚心| 三级成人黄色影院| 在线观看视频黄色| www久久久久| 国产精品亚洲lv粉色| 高清在线视频日韩欧美| 尤物tv在线精品| 亚洲日本黄色片| 精品久久久久久久中文字幕 | 国产超碰在线播放| 亚洲激情av在线| 黄色片在线看| 亚洲一区二区三区视频| 亚洲欧美日韩精品一区二区 | 国产精品一区二区三区四区色| 91免费在线视频网站| 久久久亚洲人| 久久久久久久久99| 日韩中文字幕免费视频|