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

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
主站蜘蛛池模板: 久草在线视频精品 | 欧美一区二区公司 | 国产91精品露脸国语对白 | 欧美日韩一区二 | 亚洲精品成人片在线观看精品字幕 | 麻豆91精品 | 中文字幕无码视频专区 | 国产国产精品人在线观看 | 91国产视频在线 | 久热免费 | 精品人妻av区 | 国产口爆吞精在线视频2020版 | 男女乱淫真视频免费播放 | 在线一区二区三区视频 | 91黄色大片 | 欧美性猛交7777777 | 人妻有码中文字幕在线 | 青青草视频在线观看免费 | 国产农村妇女毛片精品久久 | 91福利视频网站 | 国产又粗又猛又黄又爽无遮挡 | 69久久精品无码一区二区 | 成人av手机在线观看 | 女人与黑人做爰啪啪 | 天堂中文字幕在线观看 | 国产美女视频91 | 国产精品婷婷久久爽一下 | 精品蜜臀久久久久99网站 | 亚洲色图欧洲色图 | 日本精品一区二区三区四区 | 国产大片黄在线观看私人影院 | 亚洲午夜av久久乱码 | 91偷拍富婆spa盗摄在线 | 日本毛片网站 | 搡老女人老妇女老熟妇 | 午夜精品久久久久久久99热额 | 少妇激情av一区二区 | 特级毛片在线播放 | 久久国产精品99国产精 | 91五月婷蜜桃综合 | av无码精品一区二区三区 | 国产寡妇一级农村野外战 | 久久这里只有精品8 | 亚洲日韩精品欧美一区二区 | 91欧美在线视频 | 天堂网在线观看 | 日韩精品欧美在线 | 国产私拍| 国产露脸ⅹxxxⅹ高清hd | 日本高清裸体私密写真集 | 天堂va蜜桃 | 亚洲男人av | 51国偷自产一区二区三区的来源 | www.黄色大片 | 国内老熟妇对白hdxxxx | 欧美一级艳片视频免费观看 | 欧性猛交ⅹxxx乱大交 | 丰满少妇高潮惨叫视频 | 99国产精品久久不卡毛片 | 亚洲最大成人在线观看 | 国产成人精品女人久久久 | 女兵的真人大毛片 | 成人福利视频一区二区 | 国产亚洲精品久久久ai换 | 日本爽快片100色毛片视频 | 欧美精品一区二区视频在线观看 | 久久3p| 99热在线精品观看 | 97理伦| 成年人网站黄 | 国产精品夜色一区二区三区 | 精品久久久久久亚洲综合网 | 国产av人人夜夜澡人人爽麻豆 | 欧美美女一区二区 | 在线爽| 久久综合给久久狠狠97色 | 少妇淫片 | 无码视频一区二区三区 | 亚洲一级淫片 | 国产精品毛片一区二区三区 | 欧美另类在线播放 | 欧美日韩成人免费 | 国产资源第一页 | 久久黄色视 | jizz内谢中国亚洲jizz | 国产精品久久久久久久久久妞妞 | 国产人澡人澡澡澡人碰视频 | 97久久国产亚洲精品超碰热 | 美丽姑娘国语版在线播放 | 国产九九| 色婷婷av一区二区 | 欧美日韩一区二区三区视频播放 | 免费黄色亚洲 | 特级特黄aaaa免费看 | 亚洲精品肉丝少妇在线 | 肉色欧美久久久久久久免费看 | 国精产品999一区二区三区有 | 日韩一区二区精品葵司在线 | 91久久久久久久久久久久 | 人人玩人人添人人澡 | 一区二区三区免费观看 | 亚洲成av人片香蕉片 | 一级片在线播放 | 午夜福利电影 | 噜噜色综合 | 美国人性欧美xxxx | 亚洲无吗视频 | 苍井空亚洲精品aa片在线播放 | 国产美女裸体无遮挡免费视频 | 国产精品乱子伦免费视频 | 精品久久久久久久久中文字幕 | 中文字幕无码免费久久 | 日韩一中文字幕 | 亚洲精品a | 波多野结衣 黑人 | 欧美三级在线播放 | 日韩精品网址 | 欧洲金发美女大战黑人 | 欧美激情乱人伦 | 日本成熟视频免费视频 | 国产三级毛片视频 | 在线观看免费av网址 | 成人午夜在线观看视频 | 中文字幕精品在线 | h狠狠躁死你h出轨高h | 亚洲精品乱码久久久久久动图 | 久久99久久99精品 | аⅴ资源新版在线天堂 | 天天综合网在线 | 无码专区无码专区视频网址 | 中文在线字幕 | 污片网站在线观看 | 天天色天天干天天色 | 亚洲欧美综合在线观看 | 国产偷窥熟妇高潮呻吟 | 色视频在线观看免费 | 国产真人做爰毛片视频 | 日本免费久久 | 超污网站在线看 | 国内自拍第二页 | 中文字幕一区二区三区第十负 | 五月婷婷,六月丁香 | 中文成人无字幕乱码精品区 | 久久国产香蕉 | 午夜免费小视频 | 麻豆精品在线视频 | 婷婷四房综合激情五月 | 乱淫a裸体xxxⅹ | 91中文字日产乱幕4区 | 欧美黄色a级大片 | 不卡影院av | 人人干人人插 | 亚洲人成网址 | 久久狠狠高潮亚洲精品 | 久久先锋 | 国产福利一区二区三区 | 我要看黄色a级片 | 日本在线不卡一区二区 | 国内精品久久久久影院薰衣草 | 国产九九在线 | 亚洲天堂成人网 | 国产午夜性春猛交ⅹxxx | 羞羞答答av成人免费看 | 久久久国产精品亚洲一区 | 天天操狠狠 | 开心色怡人综合网站 | 九九热视频在线免费观看 | 欧美裸体xxx | 国产亚洲精品久久久久久移动网络 | 久久青草费线频观看 | 亚州av在线播放 | 欧美国产日本在线 | 看全色黄大色黄大片大学生图片 | 国产成人久久av免费高清密臂 | 国产免费人做人爱午夜视频 | 色鬼成人免费网站视频 | 中文国产字幕 | 草1024榴社区成人 | 久久综合网av | 国产95在线 | 亚洲 | 中文字幕不卡视频 | 毛片基地在线观看 | 日韩一区二区三区免费视频 | 国产最爽的乱淫视频国语对白 | 亚洲淫区| 无码人妻精品一区二区三区不卡 | 日本黄色片网址 | 丰满少妇xoxoxo视频 | 欧美一区二区三区视频 | 九九热在线视频免费观看 | 精品国产91久久久久久久 | 久久久久久视 | 欧美黑人做爰爽爽爽 | 国产色视频播放网站www | 久操激情| 人妻少妇乱子伦精品无码专区电影 | 欧美日韩不卡合集视频 | 精品白嫩初高中害羞小美女 | 国产色在线 | 国产 狠狠色噜噜狠狠狠狠7777米奇 | 男男军官互攻互受h啪肉np文 | 男男毛片 | 激情偷拍av| 欧洲亚洲一区二区三区四区五区 | 成人黄色三级 | 国产精品日韩av在线播放 | 日韩一级视频在线 | 日日鲁鲁夜夜狼狼视频 | 日本免费无人高清 | 激情小说专区 | 国产精品伦一区二区三区在线观看 | 一本色道综合久久欧美日韩精品 | 日本高清二区 | 丁香六月激情 | 三上悠亚久久精品 | 肉色欧美久久久久久久免费看 | 久久综合给合久久狠狠狠97色 | 亚洲欧美在线综合 | 欧美极品jiizzhd欧美爆 | 性欧美精品 | 永久在线视频 | 天天干天天射综合网 | 好会夹宝h1v1 | 2018国产精华国产精品 | 五月婷婷综合激情网 | 亚欧在线播放 | 伊人情人成综合 | 91成人免费看片 | 国产成人亚洲欧洲在线 | 亚洲浮力影院久久久久久 | 久久国产精 | 成人影院免费 | 国产又粗又猛又黄又爽无遮挡 | 中日韩精品视频 | 99久久99这里只有免费费精品 | 亚州精品天堂中文字幕 | 日批视频在线 | 亚洲乱色伦图片区小说 | 午夜理论片yy44880影院 | 四虎永久在线精品免费网址 | av网站免费在线播放 | 一级做人爰片全过 | 网站在线观看你懂的 | 欧亚一区二区三区 | 日本黄色aaa| 亚洲红桃视频 | 秋霞午夜| 97久久爽久久爽爽久久片 | 久久亚洲一区二区三区成人国产 | 色琪琪一区二区三区亚洲区 | 国产99久久久国产精品免费看 | 五月天综合激情 | 国产一区二区三区久久 | 亚洲精品无线乱码一区 | 精彩视频一区二区三区 | 在线观看视频毛片 | 免费观看日韩av | 狠狠干夜夜草 | 亚洲精品网站在线观看 | 天天躁夜夜躁天干天干2020 | 自慰无码一区二区三区 | 国产精品日日夜夜 | 亚洲精品一区二区三区四区五区 | 爱情岛论坛线路一区二区 | 国产精选一区二区 | 一本无码人妻在中文字幕免费 | 国产精品亚洲色婷婷99久久精品 | 日韩欧美激情片 | 久久久日韩精品一区二区三区 | 亚洲欧美激情国产综合久久久 | 521a人成v香蕉网站 | 欧美日韩视频在线观看免费 | 狠狠色欧美亚洲狠狠色www | 国产一区二区三区精品在线观看 | 北条麻妃精品久久中文字幕 | 色久在线 | 五十岁熟韵母乱视国产 | 精品视频成人 | 精品人伦一区二区三区蜜桃网站 | 搐搐国产丨区2区精品av | 爱爱视频在线免费观看 | 美女啪啪无遮挡 | 久久不射网站 | 91爱啪| 久久久久亚洲精品男人的天堂 | 欧美无砖专区免费 | 午夜片在线 | 国产精品一区二区羞羞答答 | 久久精品久久久久久久 | 亚洲伊人久久久 | 国产网站91 | www.九色| 在线播放无码字幕亚洲 | 国产第二页 | 中文字幕永久在线观看 | 欧美皮鞭调教www..com | 免费在线观看成人av | 性欧美激情 | 日韩一级黄 | 久久综合狠狠 | 国产精品视频播放 | 99国产在线视频 | 国产精品99久久免费 | 亚洲成av人片天堂网无码】 | 亚州国产精品 | 翘臀少妇后进一区二区 | 久久久久久久久99 | a级黄色网址 | 国产精品毛片在线完整版 | 超碰在线色 | 999精品视频 | 国产伦a视频 | 久久国产乱子伦精品免费午夜,浪货好紧 | 青青青国产在线观看免费 | 无套内谢大学处破女福利 | 神马久久网 | 北条麻妃在线一区二区免费播放 | 国产午夜精品久久精品电影 | 欧美激情按摩 | 91日日拍夜夜嗷嗷叫国产 | 午夜视频在线看 | 97久久精品人妻人人搡人人玩 | 影音先锋成人资源网 | 亚洲一区二区免费在线观看 | 亚洲免费在线观看 | 精品久久久久久乱码天堂 | 一级生活毛片 | 日韩欧美aaa | 欧美hdse| 99热这里只有精品首页 | 九九精品成人免费国产片 | 91免费观看网站 | 中国性偷拍xxxⅹ | 精品不卡一区二区 | 8天堂资源在线 | 亚洲美女激情视频 | 日韩夜夜高潮夜夜爽无码 | 亚洲精品v天堂中文字幕 | 国产传媒一级片 | 超污网站在线观看 | 亚洲日本韩国在线 | 中文字幕日韩一区二区三区 | 久久久久久久一区二区 | 午夜国产精品成人 | 99久久精品免费看国产免费软件 | 毛片其地| 久9re热视频这里只有精品 | 天天色天天 | av片大全| 日韩视频不卡 | 国产精品91在线 | 国产精品系列在线播放 | 久久在线视频精品 | www国产精品内射老熟女 | 91插插插影库永久免费 | 奇米二区 | 欧美视频在线一区二区三区 | 国产一区二区精品久久 | 小舞同人18吸乳羞羞在线观看 | 少妇熟女视频一区二区三区 | 欧洲av在线播放 | 黄网站色视频 | av一卡二卡| 撕开奶罩揉吮奶头高潮av | 岬奈奈美女教师中文字幕 | 免费av网站观看 | 日本三级成本人网站 | 国产一二三区在线 | 欧美裸体xxx| 欧美aaaaaaaaaa | 精品久久久久久综合日本 | 亚洲色图综合网 | 亚洲自偷自偷在线制服 | 免费中文字幕 | 99精品在线免费观看 | 潘金莲三级野外 | 在线观看国产一级片 | 国产色爱 | 综合色区亚洲熟妇另类 | 成年午夜精品久久久精品 | 黄色免费在线观看视频 | 亚洲精品无码久久久久久久 | 亚洲成av人片一区二区 | 国产精品亚洲а∨天堂2021 | 99精品在线看 | 欧美性大战xxxxx久久久 | 99久久婷婷国产综合精品草原 | 葵司ssni-879在线播放 | 欧美又黑又粗 | 狠狠综合久久av一区二区小说 | 国产奶头好大揉着好爽视频 | 全球成人中文在线 | 亚洲啪啪av | 黄色毛片儿 | 天天摸天天插 | 精品少妇久久久久久888优播 | √天堂| 日韩av在线永久免费 | 午夜熟女毛片蜜桃传媒 | 中文字幕在线精品视频入口一区 | 国产成人无码a区在线视频无码dvd | 国产片91| 国产youjizz| 午夜欧美精品久久久久久久 | 爱搞逼综合| awww在线天堂bd资源在线 | 色诱亚洲精品久久久久久 | 最新在线视频 | 午夜av在线免费观看 | 两个奶头被吃高潮视频 | 国产在线观看第一页 | 国产亚洲精品久久久久久 | 天天爽夜夜爱 | 国产精品一区二区三区在线看 | 免费毛片在线播放免费 | 无码高潮少妇毛多水多水 | 日本精品久久久久中文字幕乱中年 | 成人在线高清 | 看免费黄色大片 | 亚洲欧美日韩精品永久在线 | 亚洲精品777| 97久久精品无码一区二区天美 | jzzijzzij亚洲成熟少妇 | 国产精品综合久久 | 国产亚洲精品久久久久久移动网络 | 好男人中文资源在线观看 | 精品av国产一区二区三区 | 青草综合| 日韩毛片基地 | 波多av在线 | 欧美成人高清视频在线观看 | 国产区免费 | 激情xxxx| 亚洲一级影院 | 天天宗合| 91精品久久久久久久久 | 欧美黄网站在线观看 | 国产一区二区三区在线观看 | 奇米一区二区三区四区久久 | 性欧美精品久久久久久久 | 无码专区天天躁天天躁在线 | 国产成人精品牛牛影视 | 国产一区二区综合 | 国产av寂寞骚妇 | 少妇下蹲露大唇无遮挡 | 亚洲综合久 | 性生交大片免费看女人按摩摩 | 精品人妻少妇嫩草av无码专区 | 舌头伸进添得好爽高潮欧美 | 国产成人免费ā片在线观看老同学 | 无码av专区丝袜专区 | 69av视频在线观看 | 国产精品66 | 国产蜜臀av在线一区尤物 | 高清av网站 | 夜夜爽亚洲人成8888 | 熟妇人妻系列av无码一区二区 | av在线播放免费 | 五月天在线观看 | 久久精品国产亚洲一区二区 | 久久久噜噜噜久久熟女aa片 | 97自拍视频 | 香蕉婷婷 | 99在线视频免费 | 一本色道综合久久欧美日韩精品 | 久久久精品免费 | 中文无码人妻有码人妻中文字幕 | 亚欧洲精品在线 | 色综合色综合色综合 | 97香蕉碰碰人人澡人人爱 | 日日躁夜夜摸月月添添添的视频 | 久久久久久久久久久中文字幕 | sb少妇高潮二区久久久久 | 天堂一区二区三区 | 天天爽夜夜爽精品视频婷婷 | 五月婷婷国产 | 四虎影视库www111we | 男女裸体做爰爽爽全过程软件 | av丝袜在线观看 | 国产三级精品一区二区三区视频 | 制服丝袜第一页在线 | 97超碰在线播放 | 日本不卡视频在线播放 | 天天狠天天插天天透 | 暖暖成人免费视频 | 日韩极品视频 | 亚洲黄色在线观看视频 | 久久国产精品久久久久久电车 | 欧美xxxxxhd | 久久精品aaaaaa毛片 | 欧美又大又硬又粗bbbbb | 伊人蕉久 | 妇挑战三黑人4p日本中文字幕 | 丰满熟女高潮毛茸茸欧洲 | 成人涩涩视频 | 国产欧美日韩综合 | 密乳av | 91视| 一区在线免费观看 | 天堂一区在线观看 | 欧日韩无套内射变态 | 人妻无码不卡中文字幕系列 | 欧美成人精品一区二区 | 国产肥臀一区二区福利视频 | 日韩国产区 | 一品二品三品中文字幕 | 欧美三级视频网站 | 毛片久久久久久 | 久久精品国产99国产精品 | 国产乱色精品成人免费视频 | 91亚洲精品久久久蜜桃网站 | 成人精品亚洲人成在线 | 操操网| 国产精品三区四区 | 国产第一页屁屁影院 | 亚洲在线精品视频 | 欧美熟妇丰满肥白大屁股免费视频 | 欧美在线黄 | 国产精品揄拍一区二区久久国内亚洲精 | 性少妇中国内射xxxx狠干 | 日韩一区在线视频 | 欧美成人中文字幕 | 中文字幕日产每天更新40 | 免费看黄色网 | 久久国产乱子伦精品免费午夜,浪货好紧 | a天堂中文在线观看 | 在线看片免费人成视频无毒 | 国产精品毛片一区 | 250pp亚洲情艺中心欧美 | 97色综合| 免费放黄网站在线播放 | 偷拍视频一区 | 色又黄又爽18禁免费网站现观看 | 亚洲丝袜色图 | 欧美日韩免费高清一区色橹橹 | 99re在线观看 | 久久福利网| 亚洲国产精品入口 | 成人免费版欧美州 | 国产偷自拍视频 | 久久久sm调教网站 | 国产在线精品拍揄自揄免费 | 精品久久久久久国产 | 日韩免费黄色片 | 亚洲视频综合 | 亚洲精品国产成人 | 国产午夜视频在线 | 日本免费色 | 91小宝寻花一区二区三区 | 永久免费d站视频 | 日日草视频 | 精品国产乱码久久久久久夜甘婷婷 | 美女隐私黄www网站免费 | 欧美高清在线精品一区 | 伊人色播| 极品人妻少妇一区二区三区 | 一本一道人人妻人人妻αv 自拍日韩亚洲一区在线 | www,久久久| 国产h视频在线观看 | 欧美性猛烈 | 亚洲欧美日韩在线看 | 久久久久久久久久久久网站 | 81国产精品久久久久久久久久 | 成人性生交免费看 | 亚洲精品久久久久中文第一暮 | 乱h高h女np群欢| 中文av网站 | 久久99亚洲精品久久99果 | 任你躁国产自任一区二区三区 | 日韩欧美不卡在线 | 夜夜骑综合 | 尤物精品| 国产精品久久久久久久久久久久人四虎 | 国产影音先锋 | 欧美人与性动交α欧美精品图片 | 中文字幕aⅴ人妻一区二区 性色av免费网站 | 国产欧美精品在线观看 | 成人一区二区三区久久精品嫩草 | 少妇特黄a片一区二区三区 精品香蕉一区二区三区 | 亚洲成色999久久网站 | av午夜天堂| 三个男吃我奶头一边一个视频 | 人人妻一区二区三区 | 96视频在线 | 天海翼一区二区三区高清在线观看 | av播播| 少妇放荡的呻吟干柴烈火动漫 | 国产最新精品视频 | 色悠悠av| 日韩中文字幕在线免费观看 | 国产一区二区三区小说 | 日韩毛片无码永久免费看 | 欧美成人tv | 天堂中文在线8最新版精品版软件 | 日本亚洲一区二区 | 精品国产免费人成网站 | 免费在线观看av网址 | 少妇口述疯狂刺激的交换经历 | 成人久久大片91含羞草 | 欧美一区免费 | 欧美亚洲一区二区三区 | 亚洲嫩草影院 | 男女啪啪十八 | 国产美女精品人人做人人爽 | 精品综合久久88少妇激情 | 四虎在线播放 | 欧美性做爰毛片 | 精品一级黄色片 | 欧美一级一区 | 国产尤物av一区二区三区 | 久久人人爽爽人人爽人人片av | 国产网站av | 超碰在线网址 | 欧美成人精品一区二区三区在线看 | 林雅儿欧洲留学恋爱日记在线 | 欧美在线brazzers免费视频 |