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

JavaScript是如何工作的:JavaScript的共享傳遞和按值傳遞

開發 前端
關于JavaScript如何將值傳遞給函數,在互聯網上有很多誤解和爭論。大致認為,參數為原始數據類時使用按值傳遞,參數為數組、對象和函數等數據類型使用引用傳遞。

 關于JavaScript如何將值傳遞給函數,在互聯網上有很多誤解和爭論。大致認為,參數為原始數據類時使用按值傳遞,參數為數組、對象和函數等數據類型使用引用傳遞。

按值傳遞 和 引用傳遞參數 主要區別簡單可以說:

  • 按值傳遞:在函數里面改變傳遞的值不會影響到外面
  • 引用傳遞:在函數里面改變傳遞的值會影響到外面

但答案是 JavaScript 對所有數據類型都使用按值傳遞。它對數組和對象使用按值傳遞,但這是在的共享傳參或拷貝的引用中使用的按值傳參。這些說有些抽象,先來幾個例子,接著,我們將研究JavaScript在 函數執行期間的內存模型,以了解實際發生了什么。

按值傳參

在 JavaScript 中,原始類型的數據是按值傳參;對象類型是跟Java一樣,拷貝了原來對象的一份引用,對這個引用進行操作。但在 JS 中,string 就是一種原始類型數據而不是對象類。 

  1. let setNewInt = function (i) {  
  2. ii = i + 33;  
  3. };  
  4. let setNewString = function (str) {  
  5. str += "cool!";  
  6. };  
  7. let setNewArray = function (arr1) {  
  8. var b = [1, 2];  
  9. arr1 = b 
  10. };  
  11. let setNewArrayElement = function (arr2) {  
  12. arr2[0] = 105;  
  13. };  
  14. let i = -33;  
  15. let str = "I am " 
  16. let arr1 = [-4, -3];  
  17. let arr2 = [-19, 84];  
  18. console.log('i is: ' + i + ', str is: ' + str + ', arr1 is: ' + arr1 + ', arr2 is: ' + arr2);  
  19. setNewInt(i);  
  20. setNewString(str);  
  21. setNewArray(arr1);  
  22. setNewArrayElement(arr2);  
  23. console.log('現在, i is: ' + i + ', str is: ' + str + ', arr1 is: ' + arr1 + ', arr2 is: ' + arr2);  

運行結果 

  1. i is: -33, str is: I am , arr1 is: -4,-3, arr2 is: -19,84 
  2.  
  3. 現在, i is: -33, str is: I am , arr1 is: -4,-3, arr2 is: 105,84  

這邊需要注意的兩個地方:

1)***個是通過 setNewString 方法把字符串 str 傳遞進去,如果學過面向對象的語言如C#,Java 等,會認為調用這個方法后 str 的值為改變,引用這在面向對象語言中是 string 類型的是個對象,按引用傳參,所以在這個方法里面更改 str 外面也會跟著改變。

但是 JavaScript 中就像前面所說,在JS 中,string 就是一種原始類型數據而不是對象類,所以是按值傳遞,所以在 setNewString 中更改 str 的值不會影響到外面。

2)第二個是通過 setNewArray 方法把數組 arr1 傳遞進去,因為數組是對象類型,所以是引用傳遞,在這個方法里面我們更改 arr1 的指向,所以如果是這面向對象語言中,我們認為***的結果arr1 的值是重新指向的那個,即 [1, 2],但***打印結果可以看出 arr1 的值還是原先的值,這是為什么呢?

共享傳遞

Stack Overflow上Community Wiki 對上述的回答是:對于傳遞到函數參數的對象類型,如果直接改變了拷貝的引用的指向地址,那是不會影響到原來的那個對象;如果是通過拷貝的引用,去進行內部的值的操作,那么就會改變到原來的對象的。

可以參考博文 JavaScript Fundamentals (2) – Is JS call-by-value or call-by-reference? 

  1. function changeStuff(state1, state2)  
  2.  
  3. state1.item = 'changed' 
  4. state2 = {item: "changed"};  
  5.  
  6. var obj1 = {item: "unchanged"};  
  7. var obj2 = {item: "unchanged"};  
  8. changeStuff(obj1, obj2);  
  9. console.log(obj1.item); // obj1.item 會被改變  
  10. console.log(obj2.item); // obj2.item 不會被改變  

緣由: 上述的 state1 相當于 obj1, 然后 obj1.item = 'changed',對象 obj1 內部的 item 屬性進行了改變,自然就影響到原對象 obj1 。類似的,state2 也是就 obj2,在方法里 state2 指向了一個新的對象,也就是改變原有引用地址,這是不會影響到外面的對象(obj2),這種現象更專業的叫法:call-by-sharing,這邊為了方便,暫且叫做 共享傳遞。

內存模型

JavaScript 在執行期間為程序分配了三部分內存:代碼區,調用堆棧和堆。 這些組合在一起稱為程序的地址空間。

 

代碼區:這是存儲要執行的JS代碼的區域。

調用堆::這個區域跟蹤當前正在執行的函數,執行計算并存儲局部變量。變量以后進先出法存儲在堆棧中。***一個進來的是***個出去的,數值數據類型存儲在這里。

例如: 

  1. var corn = 95  
  2. let lion = 100 

 

在這里,變量 corn 和 lion 值在執行期間存儲在堆棧中。

堆:是分配 JavaScript 引用數據類型(如對象)的地方。 與堆棧不同,內存分配是隨機放置的,沒有 LIFO策略。 為了防止堆中的內存漏洞,JS引擎有防止它們發生的內存管理器。 

  1. class Animal {}  
  2. // 在內存地址 0x001232 上存儲 new Animal() 實例  
  3. // tiger 的堆棧值為 0x001232  
  4. const tiger = new Animal()  
  5. // 在內存地址 0x000001 上存儲 new Objec實例  
  6. // `lion` 的堆棧值為 0x000001  
  7. let lion = {  
  8. strength: "Very Strong"  
  9.    
   

Here,lion 和 tiger 是引用類型,它們的值存儲在堆中,并被推入堆棧。它們在堆棧中的值是堆中位置的內存地址。

激活記錄(Activation Record),參數傳遞

我們已經看到了 JS 程序的內存模型,現在,讓我們看看在 JavaScript 中調用函數時會發生什么。 

  1. // 例子一  
  2. function sum(num1,num2) {  
  3. var result = num1 + num2  
  4. return result  
  5.  
  6. var a = 90  
  7. var b = 100  
  8. sum(a, b)  

每當在 JS 中調用一個函數時,執行該函數所需的所有信息都放在堆棧上。這個信息就是所謂的激活記錄(Activation Record)。

這個 Activation Record,我直譯為激活記錄,找了好多資料,沒有看到中文一個比較好的翻譯,如果朋友們知道,歡迎留言。

激活記錄上的信息包括以下內容:

  • SP 堆棧指針:調用方法之前堆棧指針的當前位置。
  • RA 返回地址:這是函數執行完成后繼續執行的地址。
  • RV 返回值:這是可選的,函數可以返回值,也可以不返回值。
  • 參數:將函數所需的參數推入堆棧。
  • 局部變量:函數使用的變量被推送到堆棧。

我們必須知道這一點,我們在js文件中編寫的代碼在執行之前由 JS 引擎(例如 V8,Rhino,SpiderMonke y等)編譯為機器語言。

所以以下的代碼: 

  1. let shark = "Sea Animal" 

會被編譯成如下機器碼: 

  1. 01000100101010  
  2. 01010101010101  

上面的代碼是我們的js代碼等價。 機器碼和 JS 之間有一種語言,它是匯編語言。 JS 引擎中的代碼生成器在最終生成機器碼之前,首先是將 js 代碼編譯為匯編代碼。

為了了解實際發生了什么,以及在函數調用期間如何將激活記錄推入堆棧,我們必須了解程序是如何用匯編表示的。

為了跟蹤函數調用期間參數是如何在 JS 中傳遞的,我們將例子一的代碼使用匯編語言表示并跟蹤其執行流程。

先介紹幾個概念:

ESP:(Extended Stack Pointer)為擴展棧指針寄存器,是指針寄存器的一種,用于存放函數棧頂指針。與之對應的是 EBP(Extended Base Pointer),擴展基址指針寄存器,也被稱為幀指針寄存器,用于存放函數棧底指針。

EBP:擴展基址指針寄存器(extended base pointer) 其內存放一個指針,該指針指向系統棧最上面一個棧幀的底部。

EBP 只是存取某時刻的 ESP,這個時刻就是進入一個函數內后,cpu 會將ESP的值賦給 EBP,此時就可以通過 EBP 對棧進行操作,比如獲取函數參數,局部變量等,實際上使用 ESP 也可以。 

  1. // 例子一  
  2. function sum(num1,num2) {  
  3. var result = num1 + num2  
  4. return result  
  5.  
  6. var a = 90  
  7. var b = 100  
  8. var s = sum(a, b)  

我們看到 sum 函數有兩個參數 num1 和 num2。函數被調用,傳入值分別為 90 和 100 的 a 和 b。

記住:值數據類型包含值,而引用數據類型包含內存地址。

在調用 sum 函數之前,將其參數推入堆棧 

  1. ESP->[......]  
  2. ESP->[ 100 ]  
  3. [ 90 ]  
  4. [.......]  

然后,它將返回地址推送到堆棧。返回地址存儲在EIP 寄存器中: 

  1. ESP->[Old EIP]  
  2. [ 100 ]  
  3. [ 90 ]  
  4. [.......]  

接下來,它保存基指針 

  1. ESP->[Old EBP]  
  2. [Old EIP]  
  3. [ 100 ]  
  4. [ 90 ]  
  5. [.......]  

然后更改 EBP 并將調用保存寄存器推入堆棧。 

  1. ESP->[Old ESI]  
  2. [Old EBX]  
  3. [Old EDI]  
  4. EBP->[Old EBP]  
  5. [Old EIP]  
  6. [ 100 ]  
  7. [ 90 ]  
  8. [.......]  

為局部變量分配空間: 

  1. ESP->[ ]  
  2. [Old ESI]  
  3. [Old EBX]  
  4. [Old EDI]  
  5. EBP->[Old EBP]  
  6. [Old EIP]  
  7. [ 100 ]  
  8. [ 90 ]  
  9. [.......]  

這里執行加法: 

  1. mov ebp+4, eax ; 100  
  2. add ebp+8, eax ; eaxeax = eax + (ebp+8)  
  3. mov eax, ebp+16  
  4. ESP->[ 190 ]  
  5. [Old ESI]  
  6. [Old EBX]  
  7. [Old EDI]  
  8. EBP->[Old EBP]  
  9. [Old EIP]  
  10. [ 100 ]  
  11. [ 90 ]  
  12. [.......]  

我們的返回值是190,把它賦給了 EAX。 

  1. mov ebp+16, eax 

EAX 是"累加器"(accumulator), 它是很多加法乘法指令的缺省寄存器。

然后,恢復所有寄存器值。 

  1. [ 190 ] DELETED  
  2. [Old ESI] DELETED  
  3. [Old EBX] DELETED  
  4. [Old EDI] DELETED  
  5. [Old EBP] DELETED  
  6. [Old EIP] DELETED  
  7. ESP->[ 100 ]  
  8. [ 90 ]  
  9. EBP->[.......]  

并將控制權返回給調用函數,推送到堆棧的參數被清除。 

  1. [ 190 ] DELETED  
  2. [Old ESI] DELETED  
  3. [Old EBX] DELETED  
  4. [Old EDI] DELETED  
  5. [Old EBP] DELETED  
  6. [Old EIP] DELETED  
  7. [ 100 ] DELETED  
  8. [ 90 ] DELETED  
  9. [ESP, EBP]->[.......]  

調用函數現在從 EAX 寄存器檢索返回值到 s 的內存位置。 

  1. mov eax, 0x000002 ; // s 變量在內存中的位置 

我們已經看到了內存中發生了什么以及如何將參數傳遞匯編代碼的函數。

調用函數之前,調用者將參數推入堆棧。因此,可以正確地說在 js 中傳遞參數是傳入值的一份拷貝。如果被調用函數更改了參數的值,它不會影響原始值,因為它存儲在其他地方,它只處理一個副本。 

  1. function sum(num1) {  
  2. num1 = 30  
  3.  
  4. let n = 90  
  5. sum(n)  
  6. // `n` 仍然為 90  

讓我們看看傳遞引用數據類型時會發生什么。 

  1. function sum(num1) {  
  2. num1 = { number:30 }  
  3.  
  4. let n = { number:90 }  
  5. sum(n)  
  6. // `n` 仍然是 { number:90 }  

用匯編代碼表示: 

  1. n -> 0x002233  
  2. Heap: Stack:  
  3. 002254 012222  
  4. ... 012223 0x002233  
  5. 002240 012224  
  6. 002239 012225  
  7. 002238  
  8. 002237  
  9. 002236  
  10. 002235  
  11. 002234  
  12. 002233 { number: 90 }  
  13. 002232  
  14. 002231 { number: 30 }  
  15. Code:  
  16. ...  
  17. 000233 main: // entry point  
  18. 000234 push n // n 值為 002233 ,它指向堆中存放 {number: 90} 地址。 n 被推到堆棧的 0x12223 處.  
  19. 000235 ; // 保存所有寄存器  
  20. ...  
  21. 000239 call sum ; // 跳轉到內存中的`sum`函數  
  22. 000240  
  23. ...  
  24. 000270 sum:  
  25. 000271 ; // 創建對象 {number: 30} 內在地址主 0x002231  
  26. 000271 mov 0x002231, (ebp+4) ; // 將內存地址為 0x002231 中 {number: 30} 移動到堆棧 (ebp+4)。(ebp+4)是地址 0x12223 ,即 n 所在地址也是對象 {number: 90} 在堆中的位置。這里,堆棧位置被值 0x002231 覆蓋。現在,num1 指向另一個內存地址。 
  27. 000272 ; // 清理堆棧  
  28. ...  
  29. 000275 ret ; // 回到調用者所在的位置(000240)  

我們在這里看到變量n保存了指向堆中其值的內存地址。 在sum 函數執行時,參數被推送到堆棧,由 sum 函數接收。

sum 函數創建另一個對象 {number:30},它存儲在另一個內存地址 002231 中,并將其放在堆棧的參數位置。 將前面堆棧上的參數位置的對象 {number:90} 的內存地址替換為新創建的對象 {number:30} 的內存地址。

這使得 n 保持不變。因此,復制引用策略是正確的。變量 n 被推入堆棧,從而在 sum 執行時成為 n 的副本。

此語句 num1 = {number:30} 在堆中創建了一個新對象,并將新對象的內存地址分配給參數 num1。 注意,在 num1 指向 n 之前,讓我們進行測試以驗證: 

  1. // example1.js  
  2. let n = { number: 90 }  
  3. function sum(num1) {  
  4. log(num1 === n)  
  5. num1 = { number: 30 }  
  6. log(num1 === n)  
  7.  
  8. sum(n)  
  9. $ node example1  
  10. true  
  11. false  

是的,我們是對的。就像我們在匯編代碼中看到的那樣。最初,num1 引用與 n 相同的內存地址,因為n被推入堆棧。

然后在創建對象之后,將 num1 重新分配到對象實例的內存地址。

讓我們進一步修改我們的例子1: 

  1. function sum(num1) {  
  2. num1.number = 30  
  3.  
  4. let n = { number: 90 }  
  5. sum(n)  
  6. // n 成為了 { number: 30 }  

這將具有與前一個幾乎相同的內存模型和匯編語言。這里只有幾件事不太一樣。在 sum 函數實現中,沒有新的對象創建,該參數受到直接影響。 

  1. ...  
  2. 000270 sum:  
  3. 000271 mov (ebp+4), eax ; // 將參數值復制到 eax 寄存器。eax 現在為 0x002233  
  4. 000271 mov 30, [eax]; // 將 30 移動到 eax 指向的地址  

num1 是(ebp+4),包含 n 的地址。值被復制到 eax 中,30 被復制到 eax 指向的內存中。任何寄存器上的花括號 [] 都告訴 CPU 不要使用寄存器中找到的值,而是獲取與其值對應的內存地址號的值。因此,檢索 0x002233 的 {number: 90} 值。

看看這樣的答案:

原始數據類型按值傳遞,對象通過引用的副本傳遞。

具體來說,當你傳遞一個對象(或數組)時,你無形地傳遞對該對象的引用,并且可以修改該對象的內容,但是如果你嘗試覆蓋該引用,它將不會影響該對象的副本- 即引用本身按值傳遞: 

  1. function replace(ref) {  
  2. ref = {}; // 這段代碼不影響傳遞的對象  
  3.  
  4. function update(ref) {  
  5. ref.key = 'newvalue'; // 這段代碼確實會影響對象的內容  
  6.  
  7. var a = { key: 'value' };  
  8. replace(a); // a 仍然有其原始值,它沒有被修改的  
  9. update(a); // a 的內容被更改  

從我們在匯編代碼和內存模型中看到的。這個答案***正確。在 replace 函數內部,它在堆中創建一個新對象,并將其分配給 ref 參數,a 對象內存地址被重寫。

update 函數引用 ref 參數中的內存地址,并更改存儲在存儲器地址中的對象的key屬性。

總結

根據我們上面看到的,我們可以說原始數據類型和引用數據類型的副本作為參數傳遞給函數。不同之處在于,在原始數據類型,它們只被它們的實際值引用。JS 不允許我們獲取他們的內存地址,不像在C與C++程序設計學習與實驗系統,引用數據類型指的是它們的內存地址。

責任編輯:龐桂玉 來源: segmentfault
相關推薦

2015-09-08 10:16:41

Java參數按值傳遞

2009-06-09 21:54:26

傳遞參數JavaScript

2022-07-29 08:05:31

Java值傳遞

2017-12-05 08:53:20

Golang參數傳遞

2022-05-18 08:00:00

JavaScriptFetch數據

2011-03-15 13:45:49

JavaScript后續傳遞

2023-11-15 09:14:27

Java值傳遞

2017-11-16 14:25:04

WOT峰會

2019-01-14 08:06:37

JavaScript

2018-12-13 14:10:37

JavaScript調用堆棧前端

2020-09-02 08:00:51

Java引用傳遞值傳遞

2011-03-25 13:44:28

Java值傳遞

2022-11-02 15:00:03

Java值傳遞引用傳遞

2012-02-21 14:04:15

Java

2019-06-04 14:15:08

JavaScript V8前端

2019-07-22 15:29:53

JavaScriptGitHub語言

2010-01-06 13:51:15

Javascript傳

2024-09-04 01:36:51

Java對象傳遞

2020-02-11 13:32:42

Mac電腦肺炎瀏覽器

2020-04-24 16:05:06

Javascript代碼前端
點贊
收藏

51CTO技術棧公眾號

亚洲图中文字幕| 国产69精品久久久久毛片| 亚洲色图五月天| 另类小说色综合| 日韩精品福利| 日本sm残虐另类| 久久国产精品久久久| 无码人妻一区二区三区免费n鬼沢| а√在线中文网新版地址在线| 久久影院视频免费| 国产精品亚洲激情| 久久免费精彩视频| 九九亚洲精品| 91精品国产福利在线观看| 男人添女人荫蒂免费视频| 欧美69xxxxx| 国内精品免费**视频| 久久久久久噜噜噜久久久精品| 日本aaa视频| 欧美影院精品| 亚洲免费电影在线| 欧美一区二区综合| 精品女同一区二区三区| 男女精品网站| 久久91精品国产91久久跳| 欧美狂猛xxxxx乱大交3| 日韩欧美中文字幕在线视频| 欧美中文字幕亚洲一区二区va在线| 国产a级片免费看| 日本韩国一区| 成人免费av资源| 91久久久久久| 真实新婚偷拍xxxxx| 一本久道久久综合婷婷鲸鱼| 美女久久久久久久| 人妻视频一区二区| 日韩精品社区| 亚洲成人教育av| 男女污污视频网站| 亚洲www.| 色综合久久中文综合久久牛| www.日本少妇| caopen在线视频| 中文字幕在线不卡一区| 久久99国产精品| 午夜老司机福利| 激情文学综合插| 国产精品自产拍高潮在线观看| 久草手机在线观看| 亚洲国产日韩在线| 欧美成人精品xxx| 91制片厂在线| 日韩av免费大片| 日韩国产在线看| 亚洲欧洲另类国产综合| 国产精品美女午夜av| 青青草免费观看视频| 好看的av在线不卡观看| 欧美大码xxxx| 欧美黑吊大战白妞| 欧美极品一区二区三区| 国产精品久久久久久福利一牛影视 | 亚洲电影影音先锋| 色婷婷久久av| 女人18毛片毛片毛片毛片区二 | 亚洲天堂男人的天堂| 黄色正能量网站| 在线看成人短视频| 亚洲视频综合网| 99在线视频免费| 大片网站久久| 久久精品2019中文字幕| 中文字幕电影av| 欧美视频久久| 国产+人+亚洲| 久久99国产综合精品免费| 丝袜亚洲另类欧美| 国产一区深夜福利| 欧洲成人免费视频| 魔女鞋交玉足榨精调教| 欧美男同视频网| 色伦专区97中文字幕| 九九精品视频免费| 在线成人h网| 欧美在线观看视频| 中文字幕视频在线播放| 卡通动漫亚洲综合| www.亚洲资源| 国产精品视频观看| 五月天综合婷婷| 女人天堂av在线播放| 亚洲成人tv网| 嫩草av久久伊人妇女超级a| 视频91a欧美| 亚洲成人久久久| 亚洲成人黄色av| 亚洲xxx拳头交| 亚洲大胆人体视频| 精品成人无码一区二区三区| 小处雏高清一区二区三区| 国语自产精品视频在免费| 在线免费观看av网址| 国产美女av一区二区三区| 精品久久久久久乱码天堂| 夜级特黄日本大片_在线| 依依成人综合视频| 十八禁视频网站在线观看| www999久久| 亚洲精品自产拍| 欧美美女性生活视频| 日韩一区二区久久| 91麻豆桃色免费看| 九色在线观看| 亚洲愉拍自拍另类高清精品| 九色91popny| 国产精品nxnn| 久久精品这里热有精品| 日韩黄色在线播放| 国产乱一区二区| 日韩动漫在线观看| 久草在线视频资源| 欧美日韩精品系列| 草草地址线路①屁屁影院成人| 天堂网在线观看国产精品| 欧美一区二区三区图| 超碰在线观看99| 国产精品美女视频| 欧美牲交a欧美牲交aⅴ免费下载| 日韩视频一二区| 色妞一区二区三区| 无码人妻av免费一区二区三区| 国产成人无遮挡在线视频| 亚洲欧洲久久| av免费在线一区| 日韩精品视频中文在线观看 | 麻豆国产欧美一区二区三区r| 久久视频在线视频| 欧美性猛交xxxx乱大交hd| 粉嫩av一区二区三区| 8x8x华人在线| 亚洲人成777| 日韩中文字幕av| 波多野结衣电影在线播放| 99精品视频在线播放观看| 欧美精品一区二区高清在线观看| 国产成人久久婷婷精品流白浆| 一区二区在线视频观看| 久久九九亚洲综合| 亚洲一区中文字幕在线| 日本一区二区不卡视频| 一本久道中文无码字幕av| 日韩大片在线免费观看| 亚州欧美日韩中文视频| 性一交一乱一色一视频麻豆| 99久久精品国产一区色 | 国产一区精品二区| 日韩精品视频三区| 免费观看成人毛片| 99re热这里只有精品免费视频 | 欧美人与禽zoz0善交| 丝袜亚洲另类欧美综合| 先锋影音亚洲资源| 国产成人77亚洲精品www| 一夜七次郎国产精品亚洲| 中文在线a天堂| 中文字幕在线一区免费| 国产91在线免费观看| 午夜视频一区| 国内一区二区在线视频观看| 欧美日韩国产观看视频| 亚洲免费视频在线观看| 亚洲中文无码av在线| 国产精品免费av| 精品国产免费av| 欧美综合视频| 91亚洲永久免费精品| 一道本在线视频| 四虎精品在线| 久久久亚洲综合| 成人3d动漫一区二区三区| 俺要去色综合狠狠| 成人黄色片在线| 五月婷婷视频在线观看| 亚洲第一国产精品| 欧美日韩综合一区二区三区| 中文在线免费一区三区高中清不卡| www.com污| 激情综合自拍| 日本在线免费观看一区| 超碰国产精品一区二页| 欧美肥婆姓交大片| 欧美熟妇交换久久久久久分类| 日韩欧美国产骚| 狠狠精品干练久久久无码中文字幕| 国产乱国产乱老熟300| 久久国产视频网| 久久亚洲a v| 九九视频免费观看视频精品| 亚洲永久免费观看| 手机av在线| 久久久av免费| 精华区一区二区三区| 欧美一区二区三区婷婷月色| av毛片在线免费观看| 亚洲精品免费一二三区| 91网站免费入口| 国产成人精品一区二区三区网站观看 | 国产99久久久欧美黑人| a级影片在线观看| 亚洲男人天堂2024| www久久久久久| 欧美亚洲综合久久| 无码熟妇人妻av| 国产成人午夜视频| 亚洲少妇久久久| 亚洲青涩在线| 米仓穗香在线观看| 激情综合网站| 九色91在线视频| 天堂av一区| 国产在线999| 久久r热视频| 高清视频欧美一级| av黄在线观看| 日韩中文理论片| 天天操天天干天天干| 精品久久久久久久| 久久久久久亚洲精品| av男人的天堂在线| 精品亚洲一区二区三区在线播放| www.久久伊人| 欧美另类高清zo欧美| 亚洲自拍偷拍网址| 狠狠人妻久久久久久| 玉米视频成人免费看| 青青青视频在线播放| 久久一夜天堂av一区二区三区 | 日本熟妇乱子伦xxxx| 亚洲欧美日韩国产一区二区三区| 蜜桃久久精品成人无码av| jiyouzz国产精品久久| 男人操女人下面视频| 免费的国产精品| 国产一线二线三线在线观看| 久久国产66| 亚洲欧洲日产国码无码久久99 | 国产又猛又黄的视频| 麻豆成人在线| 日韩av在线综合| 久久久人人人| 日韩有码免费视频| 久久亚洲精选| 久久婷婷国产91天堂综合精品| 久久综合九色| 男操女免费网站| 免费成人在线影院| 蜜桃福利午夜精品一区| 久久精品99国产精品日本| 视频在线观看免费高清| 色哟哟一一国产精品| 国产91精品精华液一区二区三区 | 日本女优爱爱视频| 久久尤物视频| 狠狠热免费视频| 久久精品免费观看| 色黄视频免费看| 高清不卡一区二区| 黑丝av在线播放| www久久久久| 亚洲精品视频网址| 亚洲欧洲一区二区三区| 青青草免费av| 精品久久久在线观看| 中文字幕黄色片| 欧美日韩国产高清一区二区三区 | 正在播放欧美一区| 免费黄色在线网站| 欧美噜噜久久久xxx| 懂色av一区| 国产99久久精品一区二区 夜夜躁日日躁| www.国产精品| 99热国产免费| 九九综合久久| 无码毛片aaa在线| 99综合在线| 亚洲一级片免费| 高清不卡一二三区| 免费看裸体网站| av日韩中文| 一区二区三区在线免费| 精品一级少妇久久久久久久| 日韩欧美大尺度| 99国产在线播放| 亚洲欧美激情精品一区二区| 亚洲成人三级| 91精品国产99| 亚洲人体在线| 久久综合狠狠综合久久综青草| 99久久www免费| 欧美在线一区视频| 久久se精品一区二区| 午夜视频在线观看国产| 国产精品美女久久久久aⅴ国产馆 国产精品美女久久久久av爽李琼 国产精品美女久久久久高潮 | 亚洲欧美成人综合| 在线播放av中文字幕| 91亚洲国产成人精品一区二三 | 亚洲国产毛片aaaaa无费看| 免费视频网站在线观看入口| 日韩片之四级片| yw193.com尤物在线| 欧美极品少妇与黑人| 国产91亚洲精品久久久| 久久久久欧美| 欧美日韩爆操| 在线观看亚洲色图| 久久色在线视频| 久久国产在线观看| 欧美久久久久久蜜桃| 国产视频福利在线| 97在线日本国产| 久久av偷拍| 亚洲一二三区在线| 老**午夜毛片一区二区三区| 中文字幕天堂av| av在线播放国产| 日日狠狠久久偷偷四色综合免费| 水蜜桃在线视频| 国产亚洲精品美女久久久m| 欧美激情第10页| 国产免费中文字幕| 欧美国产1区2区| 国产视频1区2区| 日韩精品久久久久| 538在线观看| 国产精品免费一区二区三区在线观看| 婷婷另类小说| 五月天激情播播| 中文幕一区二区三区久久蜜桃| 国产一区二区视频免费| 日韩av一区二区在线| 丁香花视频在线观看| 91视频最新| 欧美精品一区二区三区久久久竹菊| 中文字幕 日韩 欧美| 国产精品情趣视频| 在线免费观看一区二区| 在线视频欧美日韩| 成人在线免费| 亚洲综合第一| 极品美女销魂一区二区三区免费| 人与动物性xxxx| 8x8x8国产精品| a视频在线观看免费| 亚洲xxxx视频| 国内精品福利| 亚洲精品激情视频| 婷婷夜色潮精品综合在线| 天天干天天插天天操| 欧美一区二区三区免费观看| 亚洲人成网站77777在线观看| 99999精品视频| 久久精品一区蜜桃臀影院| 91黑人精品一区二区三区| 在线播放亚洲激情| 亚洲美女色播| 日韩国产小视频| 99久免费精品视频在线观看| 天堂中文字幕在线观看| 久久亚洲欧美国产精品乐播| 久久国产精品网| av中文字幕亚洲| 99超碰在线观看| 日韩有码在线视频| 中文无码日韩欧| 国产美女网站在线观看| 久久精品一区二区三区av| 中文字幕人成人乱码亚洲电影| 久久中文字幕一区| 红杏视频成人| 国产熟人av一二三区| 一区免费观看视频| 亚洲精品一区二区三区新线路| 欧美最顶级的aⅴ艳星| 91久久夜色精品国产按摩| gogo亚洲国模私拍人体| 欧美日韩免费在线| a√资源在线| 国产精品国色综合久久| 玖玖视频精品| 毛茸茸free性熟hd| 国产精区一区二区| 国内精品视频一区| 九色精品91| 99精品视频国产| 精品成人av一区| 午夜小视频在线| 精品国产乱码久久久久久88av| 欧美a一区二区| 国产亚洲精品久久久久久无几年桃| 亚洲精品一区二区网址|