久久草在线观看视频-久久草在线观看-久久草在线播放-久久草在线-久久草网站-久久草网

JavaScript的深拷貝和淺拷貝

來源:https://segmentfault.com/a/1190000017469386

一直想梳理下工作中經常會用到的深拷貝的內容,然而遍覽了許多的文章,卻發現對深拷貝并沒有一個通用的完美實現方式。因為對深拷貝的定義不同,實現時的edge case過多,在深拷貝的時候會出現循環引用等問題,導致JS內部并沒有實現深拷貝,但是我們可以來探究一下深拷貝到底有多復雜,各種實現方式的優缺點,同時參考下常用庫對其的實現。

引用類型

之所以會出現深淺拷貝的問題,實質上是由于JS對基本類型和引用類型的處理不同。基本類型指的是簡單的數據段,而引用類型指的是一個對象,而JS不允許我們直接操作內存中的地址,也就是不能操作對象的內存空間,所以,我們對對象的操作都只是在操作它的引用而已。

在復制時也是一樣,如果我們復制一個基本類型的值時,會創建一個新值,并把它保存在新的變量的位置上。而如果我們復制一個引用類型時,同樣會把變量中的值復制一份放到新的變量空間里,但此時復制的東西并不是對象本身,而是指向該對象的指針。所以我們復制引用類型后,兩個變量其實指向同一個對象,改變其中一個對象,會影響到另外一個。

var num = 10;
var obj = {
    name: 'Nicholas'
}

var num2 = num;
var obj2 = obj;

obj.name = 'Lee';
obj2.name; // 'Lee'

 

淺拷貝

如果我們要復制對象的所有屬性都不是引用類型時,就可以使用淺拷貝,實現方式就是遍歷并復制,最后返回新的對象。

function shallowCopy(obj) {
    var copy = {};
    // 只復制可遍歷的屬性
    for (key in obj) {
        // 只復制本身擁有的屬性
        if (obj.hasOwnProperty(key)) {
            copy[key] = obj[key];
        }
    }
    return copy;
}

如上面所說,我們使用淺拷貝會復制所有引用對象的指針,而不是具體的值,所以使用時一定要明確自己的需求,同時,淺拷貝的實現也是最簡單的。

JS內部實現了淺拷貝,如Object.assign(),其中第一個參數是我們最終復制的目標對象,后面的所有參數是我們的即將復制的源對象,支持對象或數組,一般調用的方式為

var newObj = Object.assign({}, originObj);

深拷貝

如果我們需要復制一個擁有所有屬性和方法的新對象,就要用到深拷貝,JS并沒有內置深拷貝方法,主要是因為:

  1. 深拷貝怎么定義?我們怎么處理原型?怎么區分可拷貝的對象?原生DOM/BOM對象怎么拷貝?函數是新建還是引用?這些edge case太多導致我們無法統一概念,造出大家都滿意的深拷貝方法來。
  2. 內部循環引用怎么處理,是不是保存每個遍歷過的對象列表,每次進行對比,然后再造一個循環引用來?這樣帶來的性能消耗可以接受嗎。

解釋一些常見的問題概念,防止有些同學不明白我們在講什么。比如循環引用:

var obj = {};
obj.b = obj;

這樣當我們深拷貝obj對象時,就會循環的遍歷b屬性,直到棧溢出。
我們的解決方案為建立一個集合[],每次遍歷對象進行比較,如果[]中已存在,則證明出現了循環引用或者相同引用,我們直接返回該對象已復制的引用即可:

let hasObj = [];
function referCopy(obj) {
    let copy = {};
    hasObj.push(obj);
    for (let i in obj) {
        if (typeof obj[i] === 'object') {
            let index = hasObj.indexOf(obj[i]);
            if (index > -1) {
                console.log('存在循環引用或屬性引用了相同對象');
                // 如果已存在,證明引用了相同對象,那么無論是循環引用還是重復引用,我們返回引用就可以了
                copy[i] = hasObj[index];
            } else {
                copy[i] = referCopy(obj[i]);
            }
        } else {
            copy[i] = obj[i];
        }
    }
    return copy;
}

處理原型和區分可拷貝的對象:我們一般使用function.prototype指代原型,使用obj.__proto__指代原型鏈,使用enumerable屬性表示是否可以被for ... in等遍歷,使用hasOwnProperty來查詢是否是本身元素。在原型鏈和可遍歷屬性和自身屬性之間存在交集,但都不相等,我們應該如何判斷哪些屬性應該被復制呢?

函數的處理:函數擁有一些內在屬性,但我們一般不修改這些屬性,所以函數一般直接引用其地址即可。但是擁有一些存取器屬性的函數我們怎么處理?是復制值還是復制存取描述符?

var obj = {
    age: 10,
    get age() {
        return this.age;
    },
    set age(age) {
        this.age = age;
    }
};
var obj2 = $.extend(true, {}, obj);

obj2; // {age: 10}

這個是我們想要的結果嗎?大部分場景下不是吧,比如我要復制一個已有的Vue對象。當然我們也有解決方案:

function copy(obj) {
    var copy = {};
    for (var i in obj) {
        let desc = Object.getOwnPropertyDescriptor(obj, i);
        // 檢測是否為存取描述符
        if (desc.set || desc.get) {
            Object.defineProperty(copy, i, {
                get: desc.get,
                set: desc.set,
                configuarable: desc.configuarable,
                enumerable: true
            });
        // 否則為數據描述符,則復用下面的深拷貝方法,此處簡寫
        } else {
            copy[i] = obj[i];
        }
    }
    return copy;
}

雖然邊界條件很多,但是不同的框架和庫都對該方法進行了實現,只不過定義不同,實現方式也不同,如jQuery.extend()只復制可枚舉的屬性,不繼承原型鏈,函數復制引用,內部循環引用不處理。而lodash實現的就更為優秀,它實現了結構化克隆算法
該算法的優點是:

  1. 可以復制 RegExp 對象。
  2. 可以復制 Blob、File 以及 FileList 對象。
  3. 可以復制 ImageData 對象。CanvasPixelArray 的克隆粒度將會跟原始對象相同,并且復制出來相同的像素數據。
  4. 可以正確的復制有循環引用的對象

依然存在的缺陷是:

  1. Error 以及 Function 對象是不能被結構化克隆算法復制的;如果你嘗試這樣子去做,這會導致拋出 DATA_CLONE_ERR 的異常。
  2. 企圖去克隆 DOM 節點同樣會拋出 DATA_CLONE_ERROR 異常。
  3. 對象的某些特定參數也不會被保留
    • RegExp 對象的 lastIndex 字段不會被保留
    • 屬性描述符,setters 以及 getters(以及其他類似元數據的功能)同樣不會被復制。例如,如果一個對象用屬性描述符標記為 read-only,它將會被復制為 read-write,因為這是默認的情況下。
    • 原形鏈上的屬性也不會被追蹤以及復制。

我們先來看看常規的深拷貝,它跟淺拷貝的區別在于,當我們發現對象的屬性是引用類型時,進行遞歸遍歷復制,直到遍歷完所有屬性:

var deepClone = function(currobj){
    if(typeof currobj !== 'object'){
        return currobj;
    }
    if(currobj instanceof Array){
        var newobj = [];
    }else{
        var newobj = {}
    }
    for(var key in currobj){
        if(typeof currobj[key] !== 'object'){
            // 不是引用類型,則復制值
            newobj[key] = currobj[key];
        }else{
            // 引用類型,則遞歸遍歷復制對象
            newobj[key] = deepClone(currobj[key])    
        }
    }
    return newobj
}

這個的主要問題就是不處理循環引用,不處理對象原型,函數依然是引用類型。上面描述過的復雜問題依然存在,可以說是最簡陋但是日常工作夠用的深拷貝方式。

另外還有一種方式是使用JSON序列化,巧妙但是限制更多:

// 調用JSON內置方法先序列化為字符串再解析還原成對象
newObj = JSON.parse(JSON.stringify(obj));

JSON是一種表示結構化數據的格式,只支持簡單值、對象和數組三種類型,不支持變量、函數或對象實例。所以我們工作中可以使用它解決常見問題,但也要注意其短板:函數會丟失,原型鏈會丟失,以及上面說到的所有缺陷。

庫實現

上面的兩種方式可以滿足大部分場景的需求,如果有更復雜的需求,可以自己實現。現在我們可以看一些框架和庫的解決方案,下面拿經典的jQuery和lodash的源碼看下,它們的優缺點上面都說過了:

jQuery.extend()

// 進行深度復制,如果第一個參數為true則深度復制,如果目標對象不合法,則拋棄并重構為{}空對象,如果只有一個參數則功能為擴展jQuery對象
jQuery.extend = jQuery.fn.extend = function() {
    var options, name, src, copy, copyIsArray, clone,
        target = arguments[ 0 ] || {},
        i = 1,
        length = arguments.length,
        deep = false;

    // Handle a deep copy situation
    // 第一個參數可以為true來確定進行深度復制
    if ( typeof target === "boolean" ) {
        deep = target;

        // Skip the boolean and the target
        target = arguments[ i ] || {};
        i++;
    }

    // Handle case when target is a string or something (possible in deep copy)
    // 如果目標對象不合法,則強行重構為{}空對象,拋棄原有的
    if ( typeof target !== "object" && !jQuery.isFunction( target ) ) {
        target = {};
    }

    // Extend jQuery itself if only one argument is passed
    // 如果只有一個參數,擴展jQuery對象
    if ( i === length ) {
        target = this;
        i--;
    }

    for ( ; i < length; i++ ) {

        // Only deal with non-null/undefined values
        // 只處理有值的對象
        if ( ( options = arguments[ i ] ) != null ) {

            // Extend the base object
            for ( name in options ) {
                src = target[ name ];
                copy = options[ name ];

                // Prevent never-ending loop
                // 阻止最簡單形式的循環引用
                // var obj={}, obj2={a:obj}; $.extend(true, obj, obj2); 就會形成復制的對象循環引用obj
                if ( target === copy ) {
                    continue;
                }
                // 如果為深度復制,則新建[]和{}空數組或空對象,遞歸本函數進行復制
                // Recurse if we're merging plain objects or arrays
                if ( deep && copy && ( jQuery.isPlainObject( copy ) ||
                    ( copyIsArray = Array.isArray( copy ) ) ) ) {

                    if ( copyIsArray ) {
                        copyIsArray = false;
                        clone = src && Array.isArray( src ) ? src : [];

                    } else {
                        clone = src && jQuery.isPlainObject( src ) ? src : {};
                    }

                    // Never move original objects, clone them
                    target[ name ] = jQuery.extend( deep, clone, copy );

                // Don't bring in undefined values
                } else if ( copy !== undefined ) {
                    target[ name ] = copy;
                }
            }
        }
    }

    // Return the modified object
    return target;
};

lodash _.baseClone()

/**
     * The base implementation of `_.clone` and `_.cloneDeep` which tracks
     * traversed objects.
     *
     * @private
     * @param {*} value The value to clone.
     * @param {boolean} bitmask The bitmask flags.
     *  1 - Deep clone
     *  2 - Flatten inherited properties
     *  4 - Clone symbols
     * @param {Function} [customizer] The function to customize cloning.
     * @param {string} [key] The key of `value`.
     * @param {Object} [object] The parent object of `value`.
     * @param {Object} [stack] Tracks traversed objects and their clone counterparts.
     * @returns {*} Returns the cloned value.
     */
    function baseClone(value, bitmask, customizer, key, object, stack) {
      var result,
          isDeep = bitmask & CLONE_DEEP_FLAG,
          isFlat = bitmask & CLONE_FLAT_FLAG,
          isFull = bitmask & CLONE_SYMBOLS_FLAG;

      if (customizer) {
        result = object ? customizer(value, key, object, stack) : customizer(value);
      }
      if (result !== undefined) {
        return result;
      }
      if (!isObject(value)) {
        return value;
      }
      var isArr = isArray(value);
      if (isArr) {
        result = initCloneArray(value);
        if (!isDeep) {
          return copyArray(value, result);
        }
      } else {
        var tag = getTag(value),
            isFunc = tag == funcTag || tag == genTag;

        if (isBuffer(value)) {
          return cloneBuffer(value, isDeep);
        }
        if (tag == objectTag || tag == argsTag || (isFunc && !object)) {
          result = (isFlat || isFunc) ? {} : initCloneObject(value);
          if (!isDeep) {
            return isFlat
              ? copySymbolsIn(value, baseAssignIn(result, value))
              : copySymbols(value, baseAssign(result, value));
          }
        } else {
          if (!cloneableTags[tag]) {
            return object ? value : {};
          }
          result = initCloneByTag(value, tag, baseClone, isDeep);
        }
      }
      // Check for circular references and return its corresponding clone.
      stack || (stack = new Stack);
      var stacked = stack.get(value);
      if (stacked) {
        return stacked;
      }
      stack.set(value, result);

      var keysFunc = isFull
        ? (isFlat ? getAllKeysIn : getAllKeys)
        : (isFlat ? keysIn : keys);

      var props = isArr ? undefined : keysFunc(value);
      arrayEach(props || value, function(subValue, key) {
        if (props) {
          key = subValue;
          subValue = value[key];
        }
        // Recursively populate clone (susceptible to call stack limits).
        assignValue(result, key, baseClone(subValue, bitmask, customizer, key, value, stack));
      });
      return result;
    }

參考資料

  1. 知乎 JS的深拷貝和淺拷貝:?https://www.zhihu.com/questio...
  2. Javascript之深拷貝:?https://aepkill.github.io/201...
  3. js對象克隆之謎:http://b-sirius.me/2017/08/26...
  4. 知乎 JS如何完整實現深度Clone對象:https://www.zhihu.com/questio...
  5. github lodash源碼:https://github.com/lodash/lod...
  6. MDN 結構化克隆算法:https://developer.mozilla.org...
  7. jQuery v3.2.1 源碼
  8. JavaScript高級程序設計 第4章(變量、作用域和內存問題)、第20章(JSON)

 

THE END
主站蜘蛛池模板: 国产久色在线拍揄自揄拍 | 奇米影视第4色 | 色av综合| 国产太嫩了在线观看 | 精品国产成人 | 日韩国产网站 | 亚洲亚洲人成综合网络 | 国产真人做爰视频免费 | 久久这里只有精品8 | 中国女人一级一次看片 | 国产精品一区二区三区久久 | 国产亚洲精品久久久玫瑰 | 国产丝袜人妖ts黄檬 | 亚洲国产aⅴ成人精品无吗 亚洲国产aaa | 国产在线永久视频 | 国产黑色丝袜在线播放 | 手机av在线 | 欧美性猛交xxxx乱大交极品 | 麻豆高清视频 | 亚洲精品97 | 日日干日日插 | 丰满人妻熟妇乱偷人无码 | 健美运动员性猛交xxxxx | 成人做受黄大片 | 日韩不卡一二三区 | 国产97在线 | 中文 | 久久国产精品嫩草影院的使用方法 | 九七影院在线观看免费观看电视 | 一区二区国产盗摄色噜噜 | 热の综合热の国产热の潮在线 | 在线天堂最新版资源 | 乱色欧美激惰 | 欧美成人3d啪啪动漫 | 国产精品久久久91 | 精品乱人伦一区二区三区 | 蜜臀av一区 | 国产精品日本欧美一区二区三区 | 免费成人在线网 | 少妇全黄性生交片 | 美女黄18以下禁止观看 | 久久岛国搬运工 | 在线天堂资源www在线污 | 久久www香蕉免费人成 | 99精彩视频| 全部孕妇毛片丰满孕妇孕交 | 精品网站999www | 国产精品美女www爽爽爽视频 | 中文字幕亚洲激情 | 伊人久久免费 | 成人av在线影院 | 91久久亚洲 | 日韩精品中文在线 | 久久99精品国产麻豆宅宅 | 国产成a人亚洲精v品无码性色 | 亚洲日日射 | 天天色成人网 | 久久久久久亚洲国产精品 | 日韩 欧美 中文字幕 制服 | 国产性猛交普通话对白 | 大学生a做爰免费观看 | 亚洲成人高清在线观看 | 2022天天躁狠狠燥 | 黑人巨大精品欧美一区二区免费 | 日韩在线一区二区三区免费视频 | 337p日本大胆噜噜噜鲁 | 手机在线一区二区 | 深夜爽爽动态图无遮无挡 | jzzjzzjzz亚洲成熟少妇 | 精品久久久久久久久久久下田 | 欧美日韩成人免费 | 久久人妻公开中文字幕 | 日韩欧美国产中文字幕 | 国产又色又爽又黄又免费文章 | www四虎com| 亚洲涩色 | 性视频播放免费视频 | 久久国产劲爆∧v内射-百度 | а√天堂www在线天堂小说 | 日韩欧美中文字幕公布 | 天堂中文网 | 免费人成视频在线播放 | 成人精品视频一区二区 | 欧美三级欧美成人高清www | 女人被狂躁的高潮免费视频 | tube国产麻豆| 无码中文字幕日韩专区 | 国产对白叫床清晰在线播放 | 调教女少妇二区三区视频 | 国产精品岛国久久久久久久久红粉 | 国产一级一片射内视频 | 高清国产午夜精品久久久久久 | 国产三级农村妇女做受 | 大地资源网第二页免费观看 | 日韩美女黄色 | 亚洲熟妇色xxxxx欧美老妇 | 久久国产精品-国产精品 | 国产又爽又黄又无遮挡的激情视频 | 日韩欧美无| 加勒比久久综合网天天 | 欧美日韩一区二区三区四区五区 | 和漂亮岳做爰3中文字幕 | 一级aaa级毛片午夜在线播放 | www春色| 免费国产自产一区二区三区四区 | 美女羞羞视频网站 | 日韩免费淫片 | 97伊人 | 肥臀熟女一区二区三区 | 午夜精品久久久久久久传媒 | 欧美一区二区喷水白浆视频 | 国产丝袜美腿一区二区三区 | 男人都懂的网址 | 国产肉体ⅹxxx137大胆 | 99久久久国产精品免费消防器 | 日本888xxxx| 色av综合av综合无码网站 | 欧美精品在线一区 | 精品九九九九九 | 一区二区三区人妻无码 | 日韩av第一页 | 色欲国产麻豆一精品一av一免费 | 精品国产一区二区三区久久久蜜臀 | 亚洲欧美一区二区三区久久 | 美女免费黄视频 | 日韩精品无码不卡无码 | 91天天射| 丁香婷婷色 | 人妖ts福利视频一二三区 | 精品厕所偷拍各类美女tp嘘嘘 | 亚洲天堂精品在线 | 日韩乱淫| 色欲av永久无码精品无码蜜桃 | 日本阿v视频在线观看 | 久久久久琪琪去精品色无码 | 一区二区三区不卡在线观看 | 三级色网站| 性猛交xxxx乱大交孕妇2 | 九九热精品免费视频 | 久久久国产精品无码免费专区 | 欧美一区二区日韩国产 | 久久99国产精品久久99 | jzzjzzjzz日本丰满少妇 | 在线 | 国产精品99传媒a | 黄色xxxx| 久久午夜国产精品www忘忧草 | 四虎国产成人精品免费一女五男 | 国产精品高潮呻吟三区四区 | 狠狠精品久久久无码中文字幕 | 国产精品一二三四 | 婷婷综合另类小说色区 | 午夜av免费 | 日韩视频在线一区 | 少妇性zzzzzzzy| 思九九爱九九 | 免费无遮挡无码永久在线观看视频 | 天天色天 | 久久五 | 精品国产第一国产综合精品 | 蜜桃视频在线观看免费视频网站www | 亚洲熟妇久久国内精品 | av动态 | 毛片永久新网址首页 | 中文字幕人成人乱码亚洲电影 | 亚洲欧美综合 | 亚洲国产精品久久久久婷婷老年 | 在线成人免费视频 | av不卡免费观看 | 欧美videos另类极品 | 91视频污在线观看 | 视频一区二区三区免费 | 天天躁日日躁狠狠躁欧美老妇小说 | 91夜色视频 | 欧美成在线观看 | 久久99精品久久久久久水蜜桃 | 亚洲天堂网在线观看 | 欧美大片免费高清观看 | 狠狠综合网 | 在线91av| 伊人一区二区三区 | 亚色中文成人yase999co | 午夜视频网 | 美女内射视频www网站午夜 | 日本丰满少妇高潮呻吟 | 日本高清在线观看 | 成人在线免费高清视频 | 久久婷婷综合色 | www.久久久.com| 国产精品伦一区二区三区在线观看 | 成人av网址在线观看 | 亚洲日韩乱码一区二区三区四区 | 亚洲精品国产主播一区 | 两男一前一后cao一女 | 99视频在线观看免费 | 亚洲国产精品成人久久久 | 91精品无人区麻豆乱码1区2区介绍 | 国产www在线 | 性色88av老女人视频 | 亚欧成a人无码精品va片 | 亚洲中文字幕av无码专区 | 五月婷婷av | 天堂资源在线www中文最新偷拍 | 精品国产乱码一区二区三区99 | 久久99国产精品视频 | 久久人妻公开中文字幕 | 国产手机av在线 | 精品久久久噜噜噜久久久 | 国产乱人伦真实精品视频 | 亚洲精品乱码久久久久久蜜桃不爽 | 黄色免费国产 | www.av网| 91av视频免费观看 | 欧美精品亚洲 | 91l九色lporny| 久热国产精品视频一区二区三区 | 真人祼交二十三式视频 | 欧美丰满熟妇hdxx | 亚洲淫欲 | 亚洲免费色图 | 午夜福利无码不卡在线观看 | 亚洲精品乱码久久久久久久久久 | 免费欧洲美女牲交视频 | 亚洲欧美日韩精品久久 | 亚洲熟妇中文字幕五十中出 | 天天拍天天爽 | 国产又粗又猛又黄又爽无遮挡 | 中文字幕超清在线观看 | 成人免费影片 | 潮喷无码正在播放 | 久久精品欧美日韩精品 | 成年女人黄小视频 | 91视频久久久久久 | 麻豆亚洲精品 | 久久国产劲爆∧v内射-百度 | 聚色视频 | 91九色精品 | 九九国产精品视频 | 撕开奶罩揉吮奶头高潮av | 国产三级自拍视频 | 99这里有精品视频 | 97视频免费 | 精品亚洲成a人在线观看 | 四虎影视大全 | 国产精品久久久爽爽爽麻豆色哟哟 | 男女啪啪进出阳道猛进 | 天天躁狠狠躁狠狠躁夜夜躁68 | 免费日本黄色网址 | 公么大龟弄得我好舒服秀婷视频 | 午夜剧场免费视频 | 亚洲麻豆一区二区三区 | 免费不卡av在线 | 瑟瑟av| 成人免费看片又大又黄 | 欧洲亚洲女同hd | 青青青国产精品一区二区 | 久久久99精品免费观看 | 国产免费一级特黄录像 | 色黄视频在线观看 | 色播亚洲视频在线观看 | 国产丰满老熟妇乱xxx1区 | 久久久免费精品视频 | 五月婷婷丁香在线 | 色一情一乱一伦麻豆 | 成人激情在线视频 | 久久综合另类激情人妖 | 免费无毒av | 国产精品精品视频 | 岳双腿间已经湿成一片视频 | 成人免费视频a | 透视性魅力 | 99精品免费 | 少妇饥渴放荡91麻豆 | 亚洲一级特黄 | 少妇精品偷拍高潮少妇 | 欧美性色黄大片在线观看 | 中文在线中文资源不卡无 | 高清无码视频直接看 | 国产福利专区 | 青青草精品视频 | 日韩精品视频中文字幕 | jvid乐乐| 激情久| 中文无码熟妇人妻av在线 | 99riav欧美丰满少妇视频 | 国模欢欢炮交啪啪150 | 蜜乳av一区二区三区 | 国产一区二区三区四区五区tv | 国产午夜网站 | 欧美日本不卡 | 国产人妖乱国产精品人妖 | 午夜激情在线观看视频 | 少妇高潮久久77777 | www.久久伊人 | 全球色影院 | 日韩啊v| 国产精品黄在线观看免费软件 | 爱爱爱爱网站 | 亚洲网址在线观看 | 欧美性受黑人性爽 | 99er久久 | 亚洲最大的熟女水蜜桃av网站 | 国产精品久久成人 | 午夜a区| 色噜噜亚洲男人的天堂 | 一级黄色片国产 | 天天爱综合网 | 国产又粗又猛又大爽老大爷 | 91国内揄拍国内精品对白 | 天美乌鸦星空mv高清正版播放 | 拍拍拍产国影院在线观看 | 天天干天天干天天操 | 黄色网址哪里有 | 国产成人精品亚洲午夜麻豆 | xxx69美国| 大地资源网第二页免费观看 | 夜夜春夜夜爽 | 97精产国品一二三产区区别视频 | 欧美成人视 | 男人午夜av | 奇米影视7777久久精品 | 黑人操日本 | 免费人成网站 | 浪潮av激情高潮国产精品 | 欧美 偷窥 清纯 综合图区 | 三级网站在线看 | 99re在线播放 | 毛片看看| 欧美高清成人 | 男人的天堂日韩 | 国产又粗又硬又大爽黄老大爷视 | 91久久精品人人做人人爽综合 | 国产精品人妻一区二区高 | 嫩草影院久久 | 深夜在线播放 | 中国大陆一级片 | 久久久精品人妻无码专区不卡 | 欧美精品一级 | 国产亚洲美女精品久久久2020 | 日本一区二区不卡在线 | 欧美日韩精品一区二区 | 日本japanese学生丰满 | 双性受爽到不停的喷水bl | 美女一级黄色片 | jizz免费看| 女人解开乳罩给男人吃奶 | 无码h黄肉动漫在线观看网站 | 国产成人午夜视频 | 色婷婷九月| 久久人人爽人人人人片 | 欧美日韩国产网站 | 久久久一区二区三区捆绑sm调教 | 午夜精品久久久久久久99热额 | 黄色一级一级 | 欧美日韩不卡合集视频 | 亚洲最大的成人网 | 中文字幕无线码 | 中文人妻熟女乱又乱精品 | www夜插内射视频网站 | 中文字幕人妻高清乱码 | 亚洲精品久久久久58 | 风间由美一区二区av101 | 一级片啪啪 | 国产亚洲情侣一区二区无 | 特级丰满少妇一级aaaa爱毛片 | 91高清在线| 中文字幕亚洲精品久久女人 | 美女野外找人搭讪啪啪 | 精品成人免费视频 | 免费看av网| 自拍超碰在线 | 青青在线免费观看 | 久久嫩草精品久久久精品才艺表演 | 久久久亚洲裙底偷窥综合 | 亚洲精品.www | 美女av在线免费观看 | 插插射啊爱视频日a级 | 亚洲国产成人aⅴ毛片大全密桃 | 香蕉视频黄在线观看 | 成人国产欧美 | 午夜男人网 | 伊人精品国产 | 天堂在线www天堂中文在线 | 精品国产三级在线观看 | 亚洲国产精品大学美女久久久爽 | 精品一区在线 | 97视频在线免费观看 | 日韩高清av在线 | 巨大乳做爰视频在线看 | 一色屋精品视频在线观看 | 欧美一卡二卡三卡 | 在线视频观看一区 | 激情五月激情综合网 | 久久99精品久久久久久无毒不卡8 | 亚洲人成人网站在线观看 | 亚洲色图偷拍视频 | 国产不卡视频在线播放 | 欧美日韩aaa | 午夜精品福利视频 | 吃奶呻吟打开双腿做受在线视频 | 精品成人国产 | 中文字幕亚洲日韩无线码 | 78色淫网站女女免费 | 欧美久久国产精品 | 粉嫩av午夜| 99久久综合狠狠综合久久aⅴ | 欧美成人片在线 | 国产精品 27p| 欧美精品一区二区蜜臀亚洲 | 舌头伸进添得好爽高潮欧美 | 99极品视频| 欧美日韩a| 伊人久久大香线蕉av一区 | 你懂的网址在线观看 | 日韩在线播放一区二区 | 国产日韩欧美精品在线 | 成人区人妻精品一区二区不卡网站 | 久草综合在线视频 | 久久久久久久久久久久久久久 | а天堂中文地址在线 | 久久www香蕉免费人成 | 亚洲人亚洲人成电影网站色 | 日韩精品在线观看中文字幕 | 天堂精品久久 | 四虎院影亚洲永久 | 亚洲va一区二区 | 性色av无码免费一区二区三区 | 国产无遮挡又黄又爽又色 | 欧美色图激情小说 | 毛片网站免费在线观看 | 97久久天天综合色天天综合色hd | 色欧美综合 | 日日躁夜夜躁狠狠久久av | 69福利视频 | 少妇视频网站 | 久久99热这里只频精品6 | 日韩美女视频一区 | 久久一区二区三区四区五区 | 全黄一级男人和女人 | 国产精品人妻一区二区高 | 国内精品九九久久久精品 | 理论视频在线观看 | 玩弄少妇人妻 | 国产高清一区二区三区四区 | 亚洲一区二区在线视频观看 | 少妇愉情理伦片bd | 99久久亚洲精品视香蕉蕉v | 久久久www成人免费精品 | 亚洲国产精品ⅴa在线观看 天堂中文在线资源 | 大地资源在线播放观看mv | 噼里啪啦在线高清观看免费 | 亚洲精品午夜一区人人爽 | 国产精品一卡二卡三卡四卡 | 日本人妻中文字幕乱码系列 | 女人裸体性做爰录像 | 五月色丁香婷婷网蜜臀av | 国产裸体瑜伽xxx在线 | 欧美老熟妇乱子 | 亚洲www啪成人一区二区 | 午夜久久久久久久久久一区二区 | 亚洲鲁鲁 | 亚洲成av人片在线观看 | 国产女主播一区 | 毛片一毛片二毛片三国产片 | 免费99精品国产自在在线 | www国产视频 | 成人免费乱码大片a毛片软件 | 国产一区二区三区四区五区密私 | 天天爽天天色 | 国产一区网址 | 可以免费看av的网站 | 亚洲自拍偷拍一区二区三区 | 亚洲日韩欧美一区二区三区 | 国产91av视频 | 国产资源免费 | 男女激情视频免费观看刺激 | 国产无遮挡一区二区三区毛片日本 | 国产一区二区三区免费 | 综合亚洲欧美 | 午夜久久一区 | 黄色福利片| 成人h视频在线观看 | 国产午夜一级片 | 日韩一区精品视频一区二区 | 艹少妇视频 | 国产精品久久久久久久久果冻传媒 | 美女大量吞精在线观看456 | 日本一本高清视频 | 麻豆视频免费网站 | 国产又大又硬又爽免费视频试 | 日本三级全黄少妇三2023 | 五月天激情社区 | 国产精品区二区三区日本 | 日本三级带日本三级带66 | 最近中文字幕免费mv在线 | 亚洲精品人成无码中文毛片 | 男女做爰猛烈叫床爽爽免费网站 | 久久久久久久久99精品情浪 | 在线播放av网址 | 中年两口子高潮呻吟 | 成人一级黄色毛片 | 国内精品久久久久久久久久久久 | 国产精品欧美福利久久 | 亚洲精品白浆高清久久久久久 | 自拍偷在线精品自拍偷无码专区 | 亚洲女初尝黑人巨 | 91精品久久久久久久久 | 日韩在线精品成人av在线 | 91夜夜澡人人爽人人喊欧美 | 久久这里只有精品国产 | 成年人免费网站 | 精品国产一区二区三区四 | 日本韩国欧美 | 影音先锋中文在线 | 性生交大片免费看女人按摩摩 | 日韩精品免费一区二区在线观看 | 国产亲子乱露脸 | 性视频在线 | 污视频网站免费观看 | 肉色超薄丝袜脚交一区二区蜜av | www嫩草com| 成人av在线影院 | 无套中出丰满人妻无码 | 无码精品人妻一区二区三区漫画 | www国产成人免费观看视频 | 亚洲综合av一区二区 | 好吊妞视频这里有精品 | 国产99页| 七月丁香婷婷 | 少妇又色又紧又爽又高潮 | 国产成人精品午夜福利在线观看 | 少妇性做爰xxxⅹ性视频 | 国产少妇露脸精品自啪网站 | 国产1区 2区 3区 | 98精品视频 | 国产精品国产a | 免费视频网站在线观看入口 | 国产欧美一区二区白浆黑人 | 国产永久免费观看视频 | www.男人天堂.com| 国产伦精品一区二区三区千人斩 | 国产又黄又爽又刺激的软件 | 小芸的放荡日记高h | 久草国产在线视频 | 成人情侣激情偷拍视频 | 国产乱人伦偷精品视频免下载 | 国产一区视频在线免费观看 | 久久久久有精品国产麻豆 | 在厨房拨开内裤进入在线视频 | 国产一区二区三区四区在线观看 | 一级免费a| 国产精品久久久久久久久岛国 | 456成人网| 日本一区二区不卡在线 | 一级特黄色片 | 丰满少妇麻豆av苏语棠 | 91精品国产高潮对白 | 欧美做爰一区二区三区 | 日本美女色视频 | 与鸭共舞在线 | 有一婷婷色| 国产91在线播放9色不卡 | 夜夜撸小说 | 亚洲一区二区三区偷拍女厕 | 亚洲自偷自拍熟女另类 | 亚洲高清欧美 | 亚洲天堂五月 | 欧美精品在线观看一区二区 | 蜜臀av性久久久久蜜臀aⅴ涩爱 | 性网| 国产一区二区三区在线观看视频 | 97小视频| 521a人成v香蕉网站 | 亚洲福利 | 和岳每晚弄的高潮嗷嗷叫视频 | 夜夜爽一区二区三区 | va在线视频 | 久久久久亚洲精品中文字幕 | 一区二区三区四区精品视频 | 欧美图片一区二区三区 | 在线免费观看不卡av | 亚洲国产日韩a在线播放性色 | 欧美一区二区在线观看视频 | 爽天天天天天天天 | 一本大道av日日躁夜夜躁 | 插我舔内射18免费视频 | 日韩av高清在线播放 | 精品人妻无码一区二区色欲产成人 | 久久伊人草 | 亚洲精品中文字幕一区二区三区 | 成人免费版欧美州 | 男男巨肉啪啪动漫3d | 亚洲成熟丰满熟妇高潮xxxxx | www.国产高清| 久久婷婷五月综合色丁香 | 一本一道久久a久久综合蜜桃 | 国产精品久久久久免费a∨大胸 | 手机在线永久免费观看av片 | 色综合99久久久无码国产精品 | 青青草国产在线 | 亚洲国产成人欧美激情 | 丰满肥臀噗嗤啊x99av | 东北少妇高潮抽搐 | 国产干干干 | 成人涩涩网站 | 国产乱子伦精品免费女 | 丁香色婷婷国产精品视频 | 无码中文字幕av免费放 | 成人免费视频xbxb入口 | 天天干夜夜拍 | 国产精品久久久久久久午夜片 | 99精品成人 | 极品尤物magnet | 少妇高潮21p | 一级做a爰片性色毛片武则天 | 久久久久国产视频 | 成人在线高清视频 |