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

一道面試題引發的對JavaScript類型轉換的思考

開發 前端
高階函數(Higher-order function):高階函數的意思是它接收另一個函數作為參數。在 javascript 中,函數是一等公民,允許函數作為參數或者返回值傳遞。

最近群里有人發了下面這題:

實現一個函數,運算結果可以滿足如下預期結果:

add(1)(2) // 3
add(1, 2, 3)(10) // 16
add(1)(2)(3)(4)(5) // 15

對于一個好奇的切圖仔來說,忍不住動手嘗試了一下,看到題目首先想到的是會用到高階函數以及 Array.prototype.reduce()

高階函數(Higher-order function):高階函數的意思是它接收另一個函數作為參數。在 javascript 中,函數是一等公民,允許函數作為參數或者返回值傳遞。

得到了下面這個解法:

function add() {
    var args = Array.prototype.slice.call(arguments);

    return function() {
        var arg2 = Array.prototype.slice.call(arguments);
        return args.concat(arg2).reduce(function(a, b){
            return a + b;
        });
    }
}

驗證了一下,發現錯了:

add(1)(2) // 3
add(1, 2)(3) // 6
add(1)(2)(3) // Uncaught TypeError: add(...)(...) is not a function(…)

上面的解法,只有在 add()() 情形下是正確的。而當鏈式操作的參數多于兩個或者少于兩個的時候,無法返回結果。

而這個也是這題的一個難點所在,add()的時候,如何既返回一個值又返回一個函數以供后續繼續調用?

后來經過高人指點,通過重寫函數的 valueOf 方法或者 toString 方法,可以得到其中一種解法:

function add () {
    var args = Array.prototype.slice.call(arguments);

    var fn = function () {
        var arg_fn = Array.prototype.slice.call(arguments);
        return add.apply(null, args.concat(arg_fn));
    }

    fn.valueOf = function () {
        return args.reduce(function(a, b) {
            return a + b;
        })
    }

    return fn;
}

嗯?***眼看到這個解法的時候,我是懵逼的。因為我感覺 fn.valueOf() 從頭到尾都沒有被調用過,但是驗證了下結果:

add(1) // 1
add(1,2)(3) //6
add(1)(2)(3)(4)(5) // 15

神奇的對了!那么玄機必然是在上面的 fn.valueOf = function() {} 內了。為何會是這樣呢?這個方法是在函數的什么時刻執行的?且聽我一步一步道來。

valueOf 和 toString

先來簡單了解下這兩個方法:

Object.prototype.valueOf()

用 MDN 的話來說,valueOf() 方法返回指定對象的原始值。

JavaScript 調用 valueOf() 方法用來把對象轉換成原始類型的值(數值、字符串和布爾值)。但是我們很少需要自己調用此函數,valueOf 方法一般都會被 JavaScript 自動調用。

記住上面這句話,下面我們會細說所謂的自動調用是什么意思。

Object.prototype.toString()

toString() 方法返回一個表示該對象的字符串。

每個對象都有一個 toString() 方法,當對象被表示為文本值時或者當以期望字符串的方式引用對象時,該方法被自動調用。

這里先記住,valueOf() 和 toString() 在特定的場合下會自行調用。

原始類型

好,鋪墊一下,先了解下 javascript 的幾種原始類型,除去 Object 和 Symbol,有如下幾種原始類型:

  • Number
  • String
  • Boolean
  • Undefined
  • Null

在 JavaScript 進行對比或者各種運算的時候會把對象轉換成這些類型,從而進行后續的操作,下面逐一說明: 

String 類型轉換

在某個操作或者運算需要字符串而該對象又不是字符串的時候,會觸發該對象的 String 轉換,會將非字符串的類型嘗試自動轉為 String 類型。系統內部會自動調用 toString 函數。舉個例子:

var obj = {name: 'Coco'};
var str = '123' + obj;
console.log(str);  // 123[object Object]

轉換規則:

  1. 如果 toString 方法存在并且返回原始類型,返回 toString 的結果。
  2. 如果 toString 方法不存在或者返回的不是原始類型,調用 valueOf 方法,如果 valueOf 方法存在,并且返回原始類型數據,返回 valueOf 的結果。
  3. 其他情況,拋出錯誤。

上面的例子實際上是:

var obj = {name: 'Coco'};
var str = '123' + obj.toString();

其中,obj.toString() 的值為 "[object Object]"

假設是數組:

var arr = [1, 2];
var str = '123' + arr;

console.log(str); // 1231,2

上面 + arr ,由于這里是個字符串加操作,后面的 arr 需要轉化為一個字符串類型,所以其實是調用了 + arr.toString() 。

但是,我們可以自己改寫對象的 toStringvalueOf 方法:

var obj = {
    toString: function() {
        console.log('調用了 obj.toString');
        return {};
    },
    valueOf: function() {
        console.log('調用了 obj.valueOf')
        return '110';
    }
}

alert(obj);
// 調用了 obj.toString
// 調用了 obj.valueOf
// 110

上面 alert(obj + '1') ,obj 會自動調用自己的 obj.toString() 方法轉化為原始類型,如果我們不重寫它的 toString 方法,將輸出 [object Object]1 ,這里我們重寫了 toString ,而且返回了一個原始類型字符串 111 ,所以最終 alert 出了 1111。

上面的轉化規則寫了,toString 方法需要存在并且返回原始類型,那么如果返回的不是一個原始類型,則會去繼續尋找對象的 valueOf 方法:

下面我們嘗試證明如果在一個對象嘗試轉換為字符串的過程中,如果 toString() 方法不可用的時候,會發生什么。

這個時候系統會再去調用 valueOf() 方法,下面我們改寫對象的 toString 和 valueOf

var obj = {
    toString: function() {
        console.log('調用了 obj.toString');
        return {};
    },
    valueOf: function() {
        console.log('調用了 obj.valueOf')
        return '110';
    }
}

alert(obj);
// 調用了 obj.toString
// 調用了 obj.valueOf
// 110

從結果可以看到,當 toString 不可用的時候,系統會再嘗試 valueOf 方法,如果 valueOf 方法存在,并且返回原始類型(String、Number、Boolean)數據,返回valueOf的結果。

那么如果,toString 和 valueOf 返回的都不是原始類型呢?看下面這個例子:

var obj = {
    toString: function() {
        console.log('調用了 obj.toString');
        return {};
    },
    valueOf: function() {
        console.log('調用了 obj.valueOf')
        return {};
    }
}

alert(obj);
// 調用了 obj.toString
// 調用了 obj.valueOf
// Uncaught TypeError: Cannot convert object to primitive value

可以發現,如果 toString 和 valueOf 方法均不可用的情況下,系統會直接返回一個錯誤。

添加于 2017-03-07:在查證了 ECMAScript5 官方文檔后,發現上面的描述有一點問題,Object 類型轉換為 String 類型的轉換規則遠比上面復雜。轉換規則為:1.設原始值為調用 ToPrimitive 的結果;2.返回 ToString(原始值) 。關于 ToPrimitive 和 ToString 的規則可以看看官方文檔:ECMAScript5 — ToString

Number 類型轉換

上面描述的是 String 類型的轉換,很多時候也會發生 Number 類型的轉換:

  • 調用 Number() 函數,強制進行 Number 類型轉換
  • 調用 Math.sqrt() 這類參數需要 Number 類型的方法
  • obj == 1 ,進行對比的時候
  • obj + 1 , 進行運算的時候

與 String 類型轉換相似,但是 Number 類型剛好反過來,先查詢自身的 valueOf 方法,再查詢自己 toString 方法:

  1. 如果 valueOf 存在,且返回原始類型數據,返回 valueOf 的結果。
  2. 如果 toString 存在,且返回原始類型數據,返回 toString 的結果。
  3. 其他情況,拋出錯誤。

按照上述步驟,分別嘗試一下:

var obj = {
    valueOf: function() {
        console.log('調用 valueOf');
        return 5;
    }
}

console.log(obj + 1);
// 調用 valueOf
// 6
var obj = {
    valueOf: function() {
        console.log('調用 valueOf');
        return {};
    },
    toString: function() {
        console.log('調用 toString');
        return 10;
    }
}

console.log(obj + 1);
// 調用 valueOf
// 調用 toString
// 11
var obj = {
    valueOf: function() {
        console.log('調用 valueOf');
        return {};
    },
    toString: function() {
        console.log('調用 toString');
        return {};
    }
}

console.log(obj + 1);
// 調用 valueOf
// 調用 toString
// Uncaught TypeError: Cannot convert object to primitive value

Boolean 轉換

什么時候會進行布爾轉換呢:

  • 布爾比較時
  • if(obj) , while(obj) 等判斷時

簡單來說,除了下述 6 個值轉換結果為 false,其他全部為 true:

  • undefined
  • null
  • -0
  • 0或+0
  • NaN
  • ”(空字符串)
Boolean(undefined) // false
Boolean(null) // false
Boolean(0) // false
Boolean(NaN) // false
Boolean('') // false

Function 轉換

好,***回到我們一開始的題目,來講講函數的轉換。

我們定義一個函數如下:

function test() {
    var a = 1;
    console.log(1);
}

如果我們僅僅是調用 test 而不是 test() ,看看會發生什么?

可以看到,這里把我們定義的 test 函數的重新打印了一遍,其實,這里自行調用了函數的 valueOf 方法:

我們改寫一下 test 函數的 valueOf 方法。

test.valueOf = function() {
    console.log('調用 valueOf 方法');
    return 2;
}

test;
// 輸出如下:
// 調用 valueOf 方法
// 2

與 Number 轉換類似,如果函數的 valueOf 方法返回的不是一個原始類型,會繼續找到它的 toString 方法:

test.valueOf = function() {
    console.log('調用 valueOf 方法');
    return {};
}

test.toString= function() {
    console.log('調用 toString 方法');
    return 3;
}

test;
// 輸出如下:
// 調用 valueOf 方法
// 調用 toString 方法
// 3

破題

再看回我正文開頭那題的答案,正是運用了函數會自行調用 valueOf 方法這個技巧,并改寫了該方法。我們稍作改變,變形如下:

function add () {
    console.log('進入add');
    var args = Array.prototype.slice.call(arguments);

    var fn = function () {
        var arg_fn = Array.prototype.slice.call(arguments);
        console.log('調用fn');
        return add.apply(null, args.concat(arg_fn));
    }

    fn.valueOf = function () {
        console.log('調用valueOf');
        return args.reduce(function(a, b) {
            return a + b;
        })
    }

    return fn;
}

當調用一次 add 的時候,實際是是返回 fn 這個 function,實際是也就是返回 fn.valueOf();

add(1);
// 輸出如下:
// 進入add
// 調用valueOf
// 1

其實也就是相當于:

[1].reduce(function(a, b) {
    return a + b;
})
// 1

當鏈式調用兩次的時候:

add(1)(2);
// 輸出如下:
// 進入add
// 調用fn
// 進入add
// 調用valueOf
// 3

當鏈式調用三次的時候:

add(1)(2)(3);
// 輸出如下:
// 進入add
// 調用fn
// 進入add
// 調用fn
// 進入add
// 調用valueOf
// 6

可以看到,這里其實有一種循環。只有***一次調用才真正調用到 valueOf,而之前的操作都是合并參數,遞歸調用本身,由于***一次調用返回的是一個 fn 函數,所以最終調用了函數的 fn.valueOf,并且利用了 reduce 方法對所有參數求和。

除了改寫 valueOf 方法,也可以改寫 toString 方法,所以,如果你喜歡,下面這樣也可以:

function add () {
    var args = Array.prototype.slice.call(arguments);

    var fn = function () {
        var arg_fn = Array.prototype.slice.call(arguments);
        return add.apply(null, args.concat(arg_fn));
    }

    fn.toString = function() {
        return args.reduce(function(a, b) {
            return a + b;
        })
    }

    return fn;
}

這里有個規律,如果只改寫 valueOf() 或是 toString() 其中一個,會優先調用被改寫了的方法,而如果兩個同時改寫,則會像 Number 類型轉換規則一樣,優先查詢 valueOf() 方法,在 valueOf() 方法返回的是非原始類型的情況下再查詢 toString() 方法。

后記

像阮一峰老師所說的,“炫耀從來不是我寫作的動機,好奇才是”。本文行文過程也是我自己學習的一個過程,過程中我也遇到了很多困惑,所以即便查閱了官方文檔及大量的文章,但是錯誤及疏漏仍然在所難免,歡迎指正及給出更好的方法。

對于類型轉換,***還是看看 ECMAScript 規范,拒絕成為伸手黨,自己多嘗試。另外評論處有很多人提出了自己的疑問,值得一看。

到此本文結束,如果還有什么疑問或者建議,可以多多交流,原創文章,文筆有限,才疏學淺,文中若有不正之處,萬望告知。

責任編輯:張燕妮 來源: ChokCoco
相關推薦

2011-06-14 09:12:03

JavaScript

2021-03-16 05:44:26

JVM面試題運行時數據

2015-09-02 14:09:19

面試題程序設計

2024-10-11 17:09:27

2011-03-02 10:58:16

SQL server入門面試題

2018-03-06 15:30:47

Java面試題

2011-05-23 11:27:32

面試題面試java

2023-02-04 18:24:10

SeataJava業務

2009-08-11 10:12:07

C#算法

2022-04-08 07:52:17

CSS面試題HTML

2009-08-11 15:09:44

一道面試題C#算法

2017-11-21 12:15:27

數據庫面試題SQL

2021-05-31 07:55:44

smartRepeatJavaScript函數

2009-08-11 14:59:57

一道面試題C#算法

2024-06-04 14:52:28

2021-10-28 11:40:58

回文鏈表面試題數據結構

2023-08-01 08:10:46

內存緩存

2017-09-13 07:15:10

Python讀寫文件函數

2021-03-27 10:59:45

JavaScript開發代碼

2022-02-08 18:09:20

JS引擎解析器
點贊
收藏

51CTO技術棧公眾號

波多野结衣爱爱| 欧美色视频一区| 精品无码久久久久久国产| 精品免费一区二区三区蜜桃| 长河落日免费高清观看| segui88久久综合| 日本久久一二三四| 国产精品一区不卡| 夜夜躁日日躁狠狠久久88av| 国产av国片精品| 国产乱子伦精品无码码专区| 国产亚洲电影| 高跟丝袜欧美一区| 国产一区自拍视频| 久久久久亚洲AV| 97久久中文字幕| 欧美国产日本韩| 欧美孕妇毛茸茸xxxx| 亚洲欧美综合视频| a视频在线播放| 精油按摩中文字幕久久| 国产一区二区三区日韩欧美| 少妇高清精品毛片在线视频 | 欧美一区二区三区艳史| 成人性视频免费看| 少妇久久久久| 午夜成人免费视频| 国产伦精品一区二区三区高清版 | 99在线观看免费| 日韩欧美字幕| 欧美性猛片aaaaaaa做受| 欧美日韩在线观看一区二区三区| 国产成人在线观看网站| 久久婷婷国产| 欧美午夜精品在线| 日韩高清av电影| 伊人网av在线| 91精品国产自产在线观看永久∴| 91精品国产综合久久久久| 最近看过的日韩成人| 国产欧美日韩成人| 亚洲视频综合| 日韩精品视频在线| 黑森林福利视频导航| 精品亚洲综合| 麻豆精品一区二区av白丝在线| 中文字幕v亚洲ⅴv天堂| 欧美性受xxxxxx黑人xyx性爽| 精品麻豆一区二区三区| 国产成人精品免费视频网站| 久久久久久噜噜噜久久久精品| 亚洲欧美日韩偷拍| 丁香六月综合| 国产精品初高中害羞小美女文| 亚洲精品日韩av| 久久久久久福利| 天堂美国久久| 亚洲缚视频在线观看| 欧美日韩第二页| 蜜桃视频在线网站| 国产精品色一区二区三区| 97netav| 五月天激情国产综合婷婷婷| 日韩精品2区| 在线观看久久久久久| 亚洲色图日韩精品| 久久免费大视频| 精品99一区二区三区| 成人免费无码av| 欧美国产第一页| 能免费看av的网站| 精品一区二区三区亚洲| 精品久久久久久久久中文字幕 | 国内精品久久久久久久久久久| 激情久久五月天| 国产91精品久久久久久久| 一级免费在线观看| 国产精品老牛| 欧美成人黄色小视频| 右手影院亚洲欧美| 久久三级中文| 精品欧美一区二区三区精品久久 | 蜜臀av在线| 国产农村妇女精品| 国产在线一区二区三区欧美| 午夜国产在线观看| 国精产品一区一区三区mba桃花 | 中国一区二区视频| 国产美女一区二区| 欧美亚洲第一页| 国产成人麻豆免费观看| 国内成人免费视频| 久久国产精品-国产精品| 精品人妻一区二区三区四区不卡| 蜜臀va亚洲va欧美va天堂| 国内精品400部情侣激情| 91ts人妖另类精品系列| 免费av一区| 日韩av在线导航| 免费成人深夜天涯网站| 视频小说一区二区| 在线成人激情黄色| 精品无码久久久久久久久| 三级成人在线视频| 奇米成人av国产一区二区三区| 国产无遮挡aaa片爽爽| 中文字幕一区二区三区乱码图片| 中文字幕国产亚洲2019| 美女福利视频在线观看| 91久久国产| 国产91成人video| 国产女人18毛片18精品| 久久精品亚洲精品国产欧美| 免费国产一区二区| 亚洲色图21p| 中文字幕亚洲不卡| 一区二区三区偷拍| 国产美女高潮在线| 精品成人久久av| 嫩草视频免费在线观看| 日韩欧国产精品一区综合无码| 欧洲生活片亚洲生活在线观看| 亚洲精品中文字幕无码蜜桃| 玖玖精品一区| 在线看日韩av| 黄色片中文字幕| 日一区二区三区| 国产日韩一区欧美| 黄网页在线观看| 欧美在线免费播放| 久久久久亚洲av无码网站| 最新国产一区二区| 亚洲电影在线观看| 国产精品国产三级国产传播| 久久精品影视| 国产成人av网址| 中文字幕乱码中文字幕| 99riav一区二区三区| 欧美午夜精品理论片a级大开眼界 欧美午夜精品久久久久免费视 | 精品1区2区3区| 国产精品无码永久免费不卡| 亚洲bt欧美bt精品777| 亚洲日本欧美日韩高观看| 美女洗澡无遮挡| 精品成人在线| 日韩免费中文字幕| 在线观看国产精品视频| 国产一区在线不卡| 在线一区高清| 日韩第二十一页| 中文字幕日韩精品在线| 精品国产乱子伦| 韩国精品免费视频| 人人妻人人澡人人爽精品欧美一区| 成人日日夜夜| 欧美日本韩国一区二区三区视频 | 国产盗摄女厕一区二区三区 | 看欧美ab黄色大片视频免费 | 欧美人xxx| 亚洲在线一区二区三区| 精品www久久久久奶水| 日韩系列在线| 日本一区二区三区在线播放 | 久久精品国产欧美亚洲人人爽| 午夜爱爱毛片xxxx视频免费看| 激情欧美日韩| 国产伦精品一区二区三区视频黑人 | 亚洲男女网站| 欧美成人免费全部| 亚洲女人18毛片水真多| 久久久久久久久久看片| 男人的天堂日韩| 911亚洲精品| 欧美激情综合色| 深夜福利在线观看直播| 久久精品人人做人人综合 | 国产对白叫床清晰在线播放| 一区二区三区日韩在线观看| 国产无套粉嫩白浆内谢的出处| 久久av导航| 成人a免费视频| 免费理论片在线观看播放老| 一区二区三区久久久| 在线观看日本www| 欧美激情在线免费| 成人黄色av网站| 草草在线视频| 中文国产成人精品| 亚洲av无码乱码在线观看性色| 国产精品三级久久久久三级| 中文字幕免费高清在线| 欧美视频在线观看| 成人午夜激情免费视频| 丁香花高清在线观看完整版| 宅男噜噜噜66一区二区66| 欧美人妻一区二区三区| 国产精品呻吟| 深夜福利成人| 成人短视频app| 日韩视频免费观看| 夜夜躁很很躁日日躁麻豆| 一区二区三区在线视频免费观看 | 在线观看免费观看在线| 亚洲一区在线电影| 久久久久99人妻一区二区三区| 99这里有精品| 国产伦一区二区三区色一情| 国产精品亚洲一区二区三区在线观看| 亚洲精品成人av| 久久久香蕉视频| 国产欧美日韩综合精品一区二区| 少妇高潮一69aⅹ| 综合久久久久| 欧美一区二区视频在线| 性爽视频在线| 精品视频www| 99热这里只有精品3| 日本韩国视频一区二区| 五月天精品视频| 日日夜夜免费精品视频| 久久精品xxx| 久久久久久毛片免费看| 成人国产精品av| japanese23hdxxxx日韩| 伊人久久综合97精品| 国模无码一区二区三区| 欧美精品第一页| 欧美成人精品一区二区免费看片| 久久久精品国产免大香伊 | 91蜜桃网址入口| 国产无套内射久久久国产| 中文字幕一区二区av| 亚洲一区二区三区在线观看视频 | 欧美性猛交丰臀xxxxx网站| 国产精品白嫩白嫩大学美女| 国产精品久久久久四虎| 欧美熟妇激情一区二区三区| 99re热这里只有精品免费视频 | 99re这里只有精品在线| 岛国视频午夜一区免费在线观看| 精品99在线观看| 成人妖精视频yjsp地址| 无码专区aaaaaa免费视频| 丝袜美腿一区二区三区动态图| 91精品国产综合久久久久久丝袜| 四虎地址8848精品| 91精品久久久久久久久久久久久久 | 亚洲美女视频网站| 日本妇乱大交xxxxx| 亚洲摸摸操操av| 四季av综合网站| 国产极品美女高潮无套嗷嗷叫酒店| 丁香婷婷综合网| 精品伦一区二区三区| 国产精品18久久久久久久久久久久| √天堂资源在线| 国产乱色国产精品免费视频| 天天操夜夜操很很操| 欧美亚洲在线| 免费看av软件| 午夜激情久久| 久久最新免费视频| 亚欧日韩另类中文欧美| 九色一区二区| 一道本一区二区三区| 欧美日韩电影一区二区三区| 国产一区99| 亚洲精品乱码久久久久久蜜桃91| 伊人www22综合色| 99视频国产精品免费观看| 欧美黑人粗大| 国产精品免费久久久久影院| 爱草tv视频在线观看992| 97视频免费看| caoporn免费在线| www.久久色.com| 99热国产在线中文| 小说区亚洲自拍另类图片专区| 国产精品一区二区三区免费视频 | 久久精品视频免费播放| 色综合999| 在线播放国产精品| 巨大荫蒂视频欧美大片| 欧美国产日韩一区二区在线观看 | 亚洲黄色小视频| 日韩美女一级片| 亚洲女人的天堂| 精品少妇久久久| 91成人在线免费观看| 国产一区二区三区四区视频| 欧美性xxxxx极品| 中文字幕视频二区| 精品国产凹凸成av人网站| 婷婷国产在线| 久久影院在线观看| 91大神福利视频| 亚洲女人小视频在线观看| 国产精品自拍99| 成人免费在线视频观看| 久草视频中文在线| 欧美伊人精品成人久久综合97| 国产黄色片免费| 亚洲三级av在线| 污污网站在线看| 国产91在线播放精品91| 欧美成人一级| 天堂资源在线亚洲视频| 影音先锋久久久| 久久精品免费网站| 成人免费av在线| 少妇高潮一区二区三区喷水| 姬川优奈aav一区二区| 一区二区三区免费观看视频| 亚洲精品美女免费| 菠萝菠萝蜜在线观看| 国产成人av在线播放| 国产成人澳门| 精品一区日韩成人| 久久国产亚洲精品| 成年人黄色片视频| 99视频精品在线| 一出一进一爽一粗一大视频| 亚洲图片你懂的| caoporn91| 在线精品国精品国产尤物884a| www.成人精品| 精品国内亚洲在观看18黄 | 91精品一区二区三区综合| 精品免费国产一区二区| av在线不卡免费看| 国产一级理论片| 欧美精品1区2区3区| jizz在线免费观看| 久久精品福利视频| 亚洲第一会所001| 裸体丰满少妇做受久久99精品| 欧美涩涩视频| 三级黄色片播放| 中文字幕亚洲在| 亚洲中文一区二区三区| 国产一区二区三区三区在线观看| 日本中文字幕中出在线| 999国产在线| 欧美另类专区| 成人做爰www看视频软件| 超薄肉色丝袜一二三| 国产毛片久久久| 性生活免费观看视频| 久久国产精品色| av最新在线观看| 欧美裸体一区二区三区| 日韩毛片久久久| 中文字幕日韩视频| 欧美xxxx做受欧美护士| 日韩中文字幕一区| 青青草国产精品97视觉盛宴| 一级黄色片国产| 国产精品国产三级国产专播品爱网 | www日本高清视频| 欧美日韩高清区| 欧美gv在线| 久久免费视频1| 三级一区在线视频先锋| 99999精品| 亚洲情趣在线观看| 亚洲大尺度网站| 91sa在线看| 精品国产一区二| 欧美中日韩在线| 美日韩一区二区| 精品国产大片大片大片| 91精品国产欧美日韩| 国产探花视频在线观看| 久久综合一区二区三区| 日日嗨av一区二区三区四区| 日本不卡一区视频| 日韩三级视频中文字幕| 欧美猛烈性xbxbxbxb| 91亚洲永久免费精品| 成人黄色av| 91日韩精品视频| 亚洲国产精品久久不卡毛片| 91精品中文字幕| 久久99热精品| 亚洲图区在线| 亚洲免费av一区| 亚洲一区二区在线免费观看视频| 日韩一级片免费在线观看| 久久精品视频亚洲| 久久久久久久久久久久久久久久久久久久 | 成人久久久久久| 亚洲三级视频| 无码人妻一区二区三区一| 日韩欧美国产骚| 国产黄色在线观看| 欧美xxxx黑人又粗又长精品| 九色综合国产一区二区三区| 日产欧产va高清| 日韩在线观看成人| 伊人久久大香线蕉综合网蜜芽|