精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

欧美激情欧美| 99久久久国产精品免费调教网站| 丁香天五香天堂综合| 韩国三级电影久久久久久| 日本少妇毛茸茸| 二吊插入一穴一区二区| 国产精品国产自产拍高清av| 亚洲在线第一页| 天堂中文字幕在线观看| 久久国产影院| 精品91自产拍在线观看一区| chinese少妇国语对白| 黄色一级片在线观看| 99久久精品免费看| 国产欧美精品一区二区三区-老狼 国产欧美精品一区二区三区介绍 国产欧美精品一区二区 | 国产亚洲污的网站| 成人在线一区二区| 国产高清中文字幕| 亚洲五月综合| 亚洲欧洲黄色网| 被黑人猛躁10次高潮视频| 中文字幕在线官网| 亚洲精品国产第一综合99久久| 久久亚洲精品欧美| 国产99999| 日本视频一区二区| 亚洲2020天天堂在线观看| 永久免费看片视频教学| 亚洲性视频大全| 欧美v国产在线一区二区三区| 国产一二三四在线视频| free性护士videos欧美| 亚洲视频在线一区| 日韩资源av在线| 天堂在线资源库| 国产米奇在线777精品观看| 日韩美女视频中文字幕| 五月天婷婷丁香| 亚洲影视一区| 日韩在线观看你懂的| 中文字幕一区二区三区人妻电影| 亚洲91网站| 在线观看91av| 中文字幕 日韩 欧美| 成人看片网页| 色www精品视频在线观看| 欧美,日韩,国产在线| 欧美黑人xx片| 一区二区三区欧美在线观看| 在线一区日本视频| av影片免费在线观看| 久久天堂av综合合色蜜桃网| 久久久国产精品一区二区三区| 成人免费视频国产| 成人av在线资源| 国产超碰91| 国产 欧美 精品| 国产不卡在线播放| 成人xxxxx色| 成人免费视频国产免费麻豆| 国产成人亚洲综合a∨婷婷图片 | 欧美亚洲另类色图| 成人免费网站观看| 图片区小说区国产精品视频| 国产欧美日韩网站| 欧美aa在线观看| 黑人巨大精品欧美一区免费视频| 日本a在线免费观看| gogo久久| 狠狠躁18三区二区一区| 免费无码av片在线观看| 日韩大尺度黄色| 在线观看视频一区二区欧美日韩| 无需播放器的av| www.91精品| 日韩精品中文字幕在线不卡尤物| 欧美熟妇精品一区二区| 久草精品视频| 亚洲午夜未满十八勿入免费观看全集| 非洲一级黄色片| 欧美1级片网站| 美女av一区二区| 伊人365影院| 性欧美暴力猛交另类hd| 国产欧美一区二区三区在线| 国产福利视频导航| av亚洲精华国产精华| 日本一区二区久久精品| 精品欧美色视频网站在线观看| 亚洲免费观看高清完整版在线观看熊| www污在线观看| 免费欧美电影| 91麻豆精品国产91久久久久久| 中文字幕亚洲日本| 蜜臀久久99精品久久一区二区| 一夜七次郎国产精品亚洲| 午夜精品福利在线视频| 99国产精品| 国产日韩欧美在线看| 精品人妻aV中文字幕乱码色欲| 91一区二区三区在线观看| 亚洲精品欧美精品| 成全电影大全在线观看| 一本一道综合狠狠老| 中文字幕一区二区在线观看视频| 成人香蕉社区| 最近2019中文字幕大全第二页| 久久久一区二区三区四区| 日韩专区欧美专区| 国产99午夜精品一区二区三区 | 久久综合色婷婷| 欧美日韩视频免费在线观看| 黄频免费在线观看| 91精品一区二区三区在线观看| 亚洲午夜久久久久久久久红桃| 五月激情综合| 国产成人黄色av| 国产成人三级在线观看视频| 国产精品久久久久四虎| 5月婷婷6月丁香| 香蕉成人app| 色噜噜狠狠狠综合曰曰曰88av| 国产精品免费av一区二区| 麻豆视频一区二区| 久久riav二区三区| 色帝国亚洲欧美在线| 欧美在线观看一二区| 国产激情第一页| 欧美91大片| 国产精品一区二区三区免费视频 | 国产高清日韩| 在线观看国产精品91| 日韩精品1区2区| 粉嫩av亚洲一区二区图片| 亚洲一区二区三区加勒比 | 日韩人在线观看| 成人在线电影网站| 欧美精选一区| 91久久久久久久久| 免费黄色在线观看| 欧美日韩在线免费视频| 四虎永久免费在线观看| 亚洲最黄网站| 狠狠色噜噜狠狠色综合久| 日本精品600av| 日韩欧美视频在线| 午夜爽爽爽男女免费观看| 蜜桃视频在线观看一区二区| 日本在线视频一区| 高清电影一区| 亚洲性夜色噜噜噜7777| 国产91国语对白在线| 91视频免费观看| 欧美在线观看www| 久久97精品| 久久久女女女女999久久| 国产亲伦免费视频播放| 亚洲色图欧美在线| 一级黄色高清视频| 欧美成人一区二免费视频软件| 91超碰在线免费观看| 人人超在线公开视频| 精品少妇一区二区三区在线视频| 久草视频手机在线观看| 成人精品国产一区二区4080| 日韩一级片免费视频| 免费观看成人www动漫视频| 欧美中文字幕视频| 成人网视频在线观看| 欧美精品丝袜中出| 欧美日韩精品一区二区三区视频播放| 国产美女精品一区二区三区| 日韩精品免费一区| 啪啪激情综合网| 人人做人人澡人人爽欧美| 国家队第一季免费高清在线观看| 欧美日韩一区高清| 一起操在线播放| 国产99久久久国产精品潘金 | 五月天婷婷丁香网| 国产一区二区三区在线看麻豆| 国产欧美久久久久| 日韩av网站在线免费观看| 国产精品91久久久久久| 国产在线激情| 日韩av在线网址| 久久久久久av无码免费看大片| 亚洲视频小说图片| 国产人妻黑人一区二区三区| 日本v片在线高清不卡在线观看| 日本特级黄色大片| 国产精品色呦| 国产精品精品视频| 视频在线这里都是精品| 亚洲欧美在线免费| av男人天堂网| 日本久久一区二区| 欧美黄色免费看| 91丨porny丨最新| 亚洲女人在线观看| 久久激情久久| 狠狠干视频网站| 国产麻豆精品久久| 国产精品一区二区三区免费| 97精品国产99久久久久久免费| 欧美极度另类性三渗透| 国产福利在线看| 精品久久久久久最新网址| 正在播放木下凛凛xv99| 五月激情六月综合| 欧美极品aaaaabbbbb| 国产精品欧美经典| 可以直接看的无码av| 国产精品亚洲成人| 久久黄色片网站| 翔田千里一区二区| 男女激情免费视频| 先锋资源久久| 三区精品视频| 美女久久久久| 精品视频一区二区| 2020国产精品极品色在线观看| 国产精品美女www爽爽爽视频| 美女日批视频在线观看| 日韩在线免费av| 久久久久久久久亚洲精品| 精品日韩99亚洲| 国产偷拍一区二区| 欧美男同性恋视频网站| 美女黄页在线观看| 色综合天天综合在线视频| 国产网站在线看| 亚洲精品免费电影| 亚洲天堂网av在线| 中文字幕不卡一区| 性欧美一区二区| 久久久精品国产免大香伊| 黄色网址在线视频| eeuss国产一区二区三区 | a级免费在线观看| 欧美+亚洲+精品+三区| 亚洲免费久久| 欧美国产小视频| 小说区图片区图片区另类灬| 精品国产精品国产偷麻豆| 青娱乐国产91| 国产一区二区三区探花| 日本不卡一区二区三区在线观看 | 亚洲乱码av中文一区二区| 天堂av2024| 日韩av网址在线观看| 亚洲欧美自偷自拍| 国产视频精品在线| 蜜桃视频在线观看视频| 亚洲欧美中文字幕| 成人精品一区二区| 中文字幕亚洲情99在线| 91在线不卡| 久久精品99国产精品酒店日本| 天堂а√在线资源在线| 久久精视频免费在线久久完整在线看| 日本视频在线| 欧美日韩成人在线播放| 国产三线在线| 26uuu日韩精品一区二区| 亚洲妇女成熟| 国产精品九九久久久久久久| 欧美三级电影网址| 91超碰在线免费观看| 极品束缚调教一区二区网站| 麻豆成人小视频| 成人vr资源| 黄色污污在线观看| 亚洲婷婷免费| 男女av免费观看| 免费xxxx性欧美18vr| 日本一二三区在线| 成人免费视频视频在线观看免费| 狠狠人妻久久久久久综合蜜桃| 久久久www成人免费毛片麻豆 | 性色av一区二区三区在线观看| av电影一区| 国产欧美久久久久久| a看欧美黄色女同性恋| 久久久久一区二区三区| 欧美独立站高清久久| 欧美一区二区视频在线播放| 久久精品道一区二区三区| 中文字幕成人免费视频| 成人高清视频免费观看| 人妻视频一区二区| 一区二区三区中文在线观看| 国产午夜精品一区二区理论影院| 欧美日韩激情视频8区| 中文字幕一区二区三区波野结 | 国产又爽又黄网站亚洲视频123| 在线精品国产欧美| 色噜噜狠狠狠综合欧洲色8| 国产精品2018| 97青娱国产盛宴精品视频| 欧美日韩综合网| 91高清一区| 韩国日本在线视频| 国产精品亚洲专一区二区三区 | 国产精品久久久久永久免费观看 | yw视频在线观看| 欧美精品videosex极品1| 中文字幕av一区二区三区佐山爱| 亚洲精品免费一区二区三区| 国产午夜一区| 91黄色在线看| 九九国产精品视频| 91精品人妻一区二区三区蜜桃欧美| 亚洲欧洲综合另类| 亚洲高清在线看| 亚洲国产精品热久久| 国产在线激情| 国产精品丝袜久久久久久高清| 麻豆一区一区三区四区| 国产高清不卡无码视频| 美腿丝袜亚洲三区| 91国模少妇一区二区三区| 亚洲一区二区av在线| 国产精品无码专区av免费播放| 亚洲欧美日韩天堂一区二区| 99色在线观看| av色综合网| 久久精品青草| 手机在线成人免费视频| 久久久久久久精| 欧美三级午夜理伦| 亚洲成人av在线| 污视频网站在线免费| 成人夜晚看av| 99精品美女| 最新天堂在线视频| 国产精品久久久久久久第一福利 | 555www色欧美视频| 最新97超碰在线| 国产精品久久久久福利| 国产一区国产二区国产三区| a在线视频观看| 成人动漫一区二区三区| 久久久.www| 日韩免费在线观看| 先锋影音在线资源站91| 亚洲影院在线看| 欧美88av| 怡红院一区二区| 欧美日韩免费一区| 欧美伦理影视网| 日韩美女免费视频| 精品视频黄色| 亚洲另类第一页| 中文字幕亚洲欧美在线不卡| 一区二区三区www污污污网站| 中日韩美女免费视频网址在线观看 | 久久久免费高清电视剧观看| 亚洲日本va中文字幕| h无码动漫在线观看| 成人精品国产免费网站| 国产成人一区二区三区影院在线| 亚洲激情自拍图| 欧美大片高清| 亚洲天堂电影网| 国产一区二区不卡老阿姨| 久久久综合久久| 亚洲精品午夜精品| 丁香久久综合| 久久av喷吹av高潮av| 东方aⅴ免费观看久久av| 日本熟妇成熟毛茸茸| 亚洲精品自拍偷拍| 欧美xnxx| 国产专区在线视频| 99久久99久久综合| 最好看的日本字幕mv视频大全 | 精品无人乱码一区二区三区的优势 | 嫩草影院一区二区三区| 精品国产一区二区在线| 一区二区三区视频免费视频观看网站 | 午夜视频在线观看一区二区三区| 日本不卡视频一区二区| 国产在线精品播放| 雨宫琴音一区二区在线| 麻豆精品免费视频| 欧美日韩国产经典色站一区二区三区 | 懂色av蜜臀av粉嫩av喷吹| 色偷偷噜噜噜亚洲男人| 国产精品欧美大片| 天堂网在线免费观看| 亚洲一二三区在线观看| av在线电影播放| 成人激情直播| 欧美aaa在线| 亚洲激情视频一区| 精品国模在线视频| 人人香蕉久久| 91在线第一页| 欧美在线三级电影|