精品欧美一区二区三区在线观看 _久久久久国色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)

日本在线视频网| 成人做爰69片免网站| 主播国产精品| 国产不卡视频一区| 91极品女神在线| 国产主播av在线| 香蕉大人久久国产成人av| 亚洲一区二区三区中文字幕在线| 国产一区二区三区四区五区在线| 极品国产91在线网站| 久久久久午夜电影| 亚洲精品国产精品国自产在线| 三级a在线观看| 18在线观看的| 久久精品欧美日韩精品| 亚洲综合中文字幕在线| 波多野结衣在线电影| 欧美永久精品| 在线观看久久久久久| 亚洲av午夜精品一区二区三区| 永久免费毛片在线播放| 亚洲同性gay激情无套| 精品一区二区三区视频日产| 在线免费av片| 首页欧美精品中文字幕| 美日韩精品视频免费看| 调教驯服丰满美艳麻麻在线视频| 伊人久久大香线蕉av超碰| 欧美性videosxxxxx| 国产黄色片免费在线观看| 色三级在线观看| 91女厕偷拍女厕偷拍高清| 91视频88av| 天天天天天天天干| 中文一区在线| 欧美人在线观看| 国精产品久拍自产在线网站| 日本欧美韩国国产| 日韩欧美亚洲另类制服综合在线 | 午夜精品一区| 久久亚区不卡日本| 精品无人区一区二区三区 | 精品一区二区三区三区| 天堂网成人在线| 国产激情欧美| 在线视频亚洲一区| 欧美亚洲另类色图| а√天堂中文资源在线bt| 亚洲精品一二三区| 欧美三级午夜理伦三级老人| 91官网在线| 91久色porny| 黑人另类av| 人妻少妇一区二区三区| 国产成人精品一区二区三区四区| 成人激情免费在线| 91精品视频免费在线观看| 秋霞午夜鲁丝一区二区老狼| 国产成人亚洲综合| 中文字幕一区二区人妻电影| 美女国产一区| 国产精品成人一区二区| 日本黄色中文字幕| 日韩高清一区二区| 国产精品极品美女粉嫩高清在线| 波多野结衣黄色网址| 久久一区国产| 国产精品99蜜臀久久不卡二区| 日本免费在线观看视频| 亚洲欧美日韩在线观看a三区| 午夜精品www| 久久久午夜影院| 国产精品美女久久久| 欧美在线激情视频| 亚洲精品中文字幕乱码三区91| 每日更新成人在线视频| 国产精品毛片a∨一区二区三区|国| 亚洲 小说区 图片区| 激情综合色综合久久综合| 成人黄色免费片| 高清国产mv在线观看| av不卡免费电影| 欧美一区二区视频在线| av电影在线观看| 日韩一区中文字幕| 日本免费成人网| 性国裸体高清亚洲| 欧美日韩五月天| 波多野结衣三级视频| 久久99国产精品久久99大师| 国产亚洲欧美日韩一区二区| 日韩视频中文字幕在线观看| 在线 亚洲欧美在线综合一区| 2019中文字幕全在线观看| 成人一级免费视频| 韩国av一区二区三区在线观看| 99久久99久久| 黄色国产在线| 一区二区三区精密机械公司| 黄色动漫在线免费看| 亚洲天堂网站| 日韩精品一区二区三区蜜臀 | 日本网站免费在线观看| 日韩综合av| 亚洲二区在线播放视频| 成人小视频免费看| 亚洲黑丝一区二区| 国产精品偷伦免费视频观看的| 国产极品999| 久久精品一区二区三区不卡 | 老司机精品影院| 天天综合网 天天综合色| 国产免费又粗又猛又爽| 精品深夜福利视频| 精品国模在线视频| 成人精品免费在线观看| 国产精品一区二区三区乱码| 欧美精品免费观看二区| 在线不卡日本v二区707| 欧洲av在线精品| 精品一区二区三区四区五区六区| 日韩精品水蜜桃| 2018日韩中文字幕| 精品区在线观看| 国产精品久久久久影院老司| 亚洲中文字幕无码专区| 精品中文在线| 中文字幕日韩欧美| 国产成人精品777777| 欧美黄色性生活| 伊人春色精品| 欧美激情性做爰免费视频| 91 中文字幕| 国产日韩精品久久久| 久无码久无码av无码| 国产精品免费精品自在线观看 | 日本综合在线| 91豆麻精品91久久久久久| 欧美夫妇交换xxx| 欧美精品九九| 91久久综合亚洲鲁鲁五月天| wwwxxx在线观看| 在线视频一区二区免费| 久久国产精品影院| 亚洲欧美成人综合| 黄色小网站91| 精品丝袜在线| 精品亚洲aⅴ在线观看| 国产精品成人av久久| 国产精品18久久久| 伊人再见免费在线观看高清版| 日韩毛片免费看| 日韩在线激情视频| 91肉色超薄丝袜脚交一区二区| 中文av一区二区| 久久综合伊人77777麻豆最新章节| 亚洲人成精品久久久| 热99久久精品| 国产黄在线观看免费观看不卡| 色婷婷亚洲婷婷| 免费网站在线高清观看| 日韩高清国产一区在线| 婷婷久久伊人| 亚洲日本中文| 久久综合伊人77777尤物| 国产人妖一区二区三区| 一区二区三区中文字幕| 绯色av蜜臀vs少妇| 在线看片一区| 久久久久久亚洲精品不卡4k岛国| 亚洲天堂导航| 一区二区三区视频免费在线观看| 亚洲一卡二卡在线| 亚洲欧美日韩在线不卡| 美女流白浆视频| 影音先锋亚洲一区| 欧美日韩综合网| avtt久久| 久久免费高清视频| 精品久久av| 欧美高清dvd| 久久综合成人网| 久久久亚洲精品一区二区三区| 一区二区三区 欧美| 中文字幕日韩一区二区不卡| 国产一区二区自拍| 羞羞影院欧美| 美女精品久久久| 午夜成人免费影院| 欧美日韩在线三区| 久久久久久久久久综合| 久久久亚洲欧洲日产国码αv| 中文字幕亚洲乱码| 欧美午夜视频| 欧美日韩一区二区三区免费| 亚洲国产91视频| 97国产精品视频人人做人人爱| 精品一二三区视频| 91精品国产aⅴ一区二区| 日韩欧美a级片| 国产精品灌醉下药二区| 国产污在线观看| 免费的成人av| 国产曰肥老太婆无遮挡| 成人系列视频| 国产欧美精品一区二区三区| 99只有精品| 97精品免费视频| 在线看的av网站| 亚洲精品在线观| 一本一道精品欧美中文字幕| 午夜不卡av免费| 91高清免费看| 国产嫩草影院久久久久| 久久性爱视频网站| 久久99精品久久久久久久久久久久| 欧美综合在线播放| 一区二区三区四区电影| 日韩免费av一区二区三区| 成人福利一区| 成人免费在线视频网址| 人人鲁人人莫人人爱精品| 久久青草福利网站| 韩国中文字幕在线| 中文在线资源观看视频网站免费不卡| 三级网站在线看| 欧美一区二区三区电影| 中文字幕视频免费观看| 色综合久久天天| 日本五十熟hd丰满| 亚洲综合自拍偷拍| 三级全黄做爰视频| 国产精品国产三级国产有无不卡 | 日韩区欧美区| 国产伦精品一区二区三区精品视频| 忘忧草在线影院两性视频| 欧美激情18p| 成人区精品一区二区不卡| 日韩中文有码在线视频| 搞黄视频在线观看| 亚洲乱码av中文一区二区| 天堂网在线中文| 欧美精品一区二区三区在线播放| 91麻豆成人精品国产| 精品视频在线免费观看| 中文人妻熟女乱又乱精品| 欧美在线视频你懂得| 亚洲精品一区二区二区| 在线看日韩精品电影| 国产情侣小视频| 欧美日韩一区中文字幕| 日韩乱码一区二区三区| 精品视频在线看| 一区二区三区午夜| 7777精品伊人久久久大香线蕉| 亚洲一卡二卡在线| 777xxx欧美| 国产农村妇女毛片精品| 91精品国产麻豆国产自产在线| 99久久久无码国产精品免费| 欧美一区二区三级| www.桃色av嫩草.com| 精品久久久网站| 婷婷在线观看视频| 日韩精品视频在线免费观看| 毛片免费在线播放| 中文字幕精品av| 黄色在线播放网站| 欧美高清在线观看| 黄视频免费在线看| 国产精品美女999| 亚洲精品一区av| 91久久国产综合久久蜜月精品| 成人av资源网址| 久久久久久九九九九| 精品国产一区一区二区三亚瑟| 日韩偷拍一区二区| 亚洲字幕久久| 国精产品一区一区三区视频| 久久久久久夜| wwwwwxxxx日本| 懂色av一区二区三区免费观看| 波多野结衣先锋影音| 国产精品无码永久免费888| 国产精品视频一区二区三| 亚洲成av人片| 五月激情丁香网| 日韩一卡二卡三卡国产欧美| 天堂av资源网| 深夜福利日韩在线看| 青春草免费在线视频| 91成人在线观看国产| 国产在视频一区二区三区吞精| 91福利视频导航| 伊人久久大香线蕉综合网蜜芽 | av电影在线观看| 欧美大片免费看| 丝袜美腿一区| 亚洲a在线观看| 亚洲自拍电影| 小泽玛利亚av在线| 米奇777在线欧美播放| 亚洲精品中文字幕乱码无线| 久久综合网色—综合色88| 午夜爽爽爽男女免费观看| 欧美日韩在线视频一区二区| 91亚洲国产成人精品一区| 亚洲精品wwww| 超碰人人在线| 国产精品igao视频| 9l亚洲国产成人精品一区二三| 视频一区免费观看| 99成人精品| 亚洲性图第一页| 国产精品狼人久久影院观看方式| 日本少妇激情舌吻| 91精品国产全国免费观看| 国产一级片在线| 91精品成人久久| 亚洲天堂av资源在线观看| 一区二区免费在线视频| 久久激情综合| 欧美夫妇交换xxx| 亚洲综合在线视频| 国产精品女同一区二区| 国产一区二区三区视频| 涩涩视频在线播放| 国产精品视频500部| 亚洲成人三区| 一本色道久久亚洲综合精品蜜桃 | 免费a级人成a大片在线观看| 欧美最近摘花xxxx摘花| 国产 日韩 欧美 综合 一区| 亚洲人一区二区| 久久一区欧美| 亚洲av无码国产精品久久| 天天综合色天天| 色呦呦视频在线| 欧美激情伊人电影| 91成人噜噜噜在线播放| 亚洲精品天堂成人片av在线播放| 精品一区二区三区视频| 在线观看亚洲大片短视频| 日本韩国欧美在线| 精品推荐蜜桃传媒| 欧洲美女7788成人免费视频| 美国一区二区| 黄色一级视频片| 99久久综合精品| 日韩免费观看一区二区| 日韩成人中文字幕在线观看| 91豆花视频在线播放| 久草一区二区| 性色一区二区三区| 狠狠人妻久久久久久综合蜜桃| 亚洲va欧美va天堂v国产综合| 亚洲国产av一区二区| 欧美高清自拍一区| 九九热hot精品视频在线播放| av免费观看大全| av一区二区三区黑人| 欧美a∨亚洲欧美亚洲| 亚洲男人天天操| 日本一道高清亚洲日美韩| 亚洲最新在线| 国产精品一区二区久激情瑜伽| 波多野结衣不卡视频| 欧美videossexotv100| 爱看av在线| 久久久www免费人成黑人精品| 久久九九国产| 国产主播av在线| 日韩视频一区在线观看| 69av成人| 视频二区一区| 国产乱子轮精品视频| 国产午夜久久久| 亚洲一区第一页| 精品一区二区三区四区五区| 蜜臀av色欲a片无码精品一区| 99久久精品国产精品久久| 波多野结衣高清视频| 久久久成人的性感天堂| 澳门精品久久国产| 国产裸体舞一区二区三区| 国产精品美女www爽爽爽| 国产99对白在线播放| 欧美性视频精品| 国产精品97| 亚洲激情 欧美| 欧美在线看片a免费观看| 超碰在线观看免费| 欧美三级网色| 国产精品1区2区| 波多野结衣小视频| 欧美肥臀大乳一区二区免费视频| 亚洲欧美成人vr| 男插女视频网站| 色偷偷一区二区三区| 2024最新电影免费在线观看|