日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

ES6专题——整理自阮一峰老师的ECMAScript 6入门

發(fā)布時(shí)間:2023/12/10 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 ES6专题——整理自阮一峰老师的ECMAScript 6入门 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

這里我僅僅是記錄了那些我認(rèn)為值得注意的ES6知識(shí)點(diǎn),詳細(xì)版請(qǐng)挪步https://es6.ruanyifeng.com/#docs/let


let和const命令

let聲明的變量只在它所在的代碼塊有效。

var a = []; for (let i = 0; i < 10; i++) {a[i] = function () {console.log(i);}; } a[6](); // 6

上面代碼中,變量i是let聲明的,當(dāng)前的i只在本輪循環(huán)有效,所以每一次循環(huán)的i其實(shí)都是一個(gè)新的變量,所以最后輸出的是6。你可能會(huì)問(wèn),如果每一輪循環(huán)的變量i都是重新聲明的,那它怎么知道上一輪循環(huán)的值,從而計(jì)算出本輪循環(huán)的值?這是因?yàn)?JavaScript 引擎內(nèi)部會(huì)記住上一輪循環(huán)的值,初始化本輪的變量i時(shí),就在上一輪循環(huán)的基礎(chǔ)上進(jìn)行計(jì)算

另外,for循環(huán)還有一個(gè)特別之處,就是在條件中設(shè)置循環(huán)變量的那部分是一個(gè)父作用域,而循環(huán)體內(nèi)部是一個(gè)單獨(dú)的子作用域。(感覺(jué)實(shí)現(xiàn)機(jī)制是閉包,將參數(shù)都初始化之后return一個(gè)函數(shù))(我想因?yàn)樵趂or中初始化的變量只會(huì)執(zhí)行一次并隨后記錄在引擎中,所以for循環(huán)內(nèi)部聲明的變量與for條件中的變量并不會(huì)產(chǎn)生沖突,這里我的想法是錯(cuò)誤的,原因請(qǐng)看下去)

for (let i = 0; i < 3; i++) {let i = 'abc';console.log(i); } // abc // abc // abc

上面代碼正確運(yùn)行,輸出了 3 次abc。這表明函數(shù)內(nèi)部的變量i與循環(huán)變量i不在同一個(gè)作用域,有各自單獨(dú)的作用域。

不存在變量提升

let所聲明的變量一定要在聲明后使用,否則報(bào)錯(cuò)。

// var 的情況 console.log(foo); // 輸出undefined var foo = 2;// let 的情況 console.log(bar); // 報(bào)錯(cuò)ReferenceError let bar = 2;

變量bar用let命令聲明,不會(huì)發(fā)生變量提升。這表示在聲明它之前,變量bar是不存在的,這時(shí)如果用到它,就會(huì)拋出一個(gè)錯(cuò)誤。

暫時(shí)性死區(qū)

只要塊級(jí)作用域內(nèi)存在let命令,它所聲明的變量就“綁定”(binding)這個(gè)區(qū)域,不再受外部的影響。

var tmp = 123;if (true) {tmp = 'abc'; // ReferenceErrorlet tmp; }

上面代碼中,存在全局變量tmp,但是塊級(jí)作用域內(nèi)let又聲明了一個(gè)局部變量tmp,導(dǎo)致后者綁定這個(gè)塊級(jí)作用域,所以在let聲明變量前,對(duì)tmp賦值會(huì)報(bào)錯(cuò)。

ES6 明確規(guī)定,如果區(qū)塊中存在let和const命令,這個(gè)區(qū)塊對(duì)這些命令聲明的變量,從一開(kāi)始就形成了封閉作用域凡是在聲明之前就使用這些變量,就會(huì)報(bào)錯(cuò)。

總之,在代碼塊內(nèi),使用let命令聲明變量之前,該變量都是不可用的。這在語(yǔ)法上,稱為“暫時(shí)性死區(qū)”(temporal dead zone,簡(jiǎn)稱 TDZ)。

if (true) {// TDZ開(kāi)始tmp = 'abc'; // ReferenceErrorconsole.log(tmp); // ReferenceErrorlet tmp; // TDZ結(jié)束console.log(tmp); // undefinedtmp = 123;console.log(tmp); // 123 }

上面代碼中,在let命令聲明變量tmp之前,都屬于變量tmp的“死區(qū)”。

“暫時(shí)性死區(qū)”也意味著typeof不再是一個(gè)百分之百安全的操作。

typeof x; // ReferenceError let x;

上面代碼中,變量x使用let命令聲明,所以在聲明之前,都屬于x的“死區(qū)”,只要用到該變量就會(huì)報(bào)錯(cuò)。因此,typeof運(yùn)行時(shí)就會(huì)拋出一個(gè)ReferenceError。

作為比較,如果一個(gè)變量根本沒(méi)有被聲明,使用typeof反而不會(huì)報(bào)錯(cuò)。

typeof undeclared_variable // "undefined"

上面代碼中,undeclared_variable是一個(gè)不存在的變量名,結(jié)果返回“undefined”。所以,在沒(méi)有l(wèi)et之前,typeof運(yùn)算符是百分之百安全的,永遠(yuǎn)不會(huì)報(bào)錯(cuò)。現(xiàn)在這一點(diǎn)不成立了。這樣的設(shè)計(jì)是為了讓大家養(yǎng)成良好的編程習(xí)慣,變量一定要在聲明之后使用,否則就報(bào)錯(cuò)。

有些“死區(qū)”比較隱蔽,不太容易發(fā)現(xiàn)。

function bar(x = y, y = 2) { //語(yǔ)句從左到右按順序執(zhí)行,一個(gè), 分隔兩個(gè)語(yǔ)句return [x, y]; }bar(); // 報(bào)錯(cuò)

上面代碼中,調(diào)用bar函數(shù)之所以報(bào)錯(cuò)(某些實(shí)現(xiàn)可能不報(bào)錯(cuò)),是因?yàn)閰?shù)x默認(rèn)值等于另一個(gè)參數(shù)y,而此時(shí)y還沒(méi)有聲明,屬于“死區(qū)”。如果y的默認(rèn)值是x,就不會(huì)報(bào)錯(cuò),因?yàn)榇藭r(shí)x已經(jīng)聲明了。( 這里會(huì)報(bào)錯(cuò)我猜由于此刻參數(shù)是存在默認(rèn)值的,如果你調(diào)用函數(shù)的時(shí)候沒(méi)有傳參,那么就會(huì)使用默認(rèn)值,此刻(x = y)執(zhí)行,但是y還沒(méi)有被聲明賦值過(guò),所以會(huì)報(bào)錯(cuò),而下面的例子里,x = 2已經(jīng)聲明賦值過(guò)了,所以執(zhí)行 y = x 的時(shí)候能正確執(zhí)行)

function bar(x = 2, y = x) {return [x, y]; } bar(); // [2, 2]

另外,下面的代碼也會(huì)報(bào)錯(cuò),與var的行為不同。

// 不報(bào)錯(cuò) var x = x;// 報(bào)錯(cuò) let x = x; // ReferenceError: x is not defined

上面代碼報(bào)錯(cuò),也是因?yàn)闀簳r(shí)性死區(qū)。使用let聲明變量時(shí),只要變量在還沒(méi)有聲明完成前使用,就會(huì)報(bào)錯(cuò)。上面這行就屬于這個(gè)情況,在變量x的聲明語(yǔ)句還沒(méi)有執(zhí)行完成前,就去取x的值,導(dǎo)致報(bào)錯(cuò)”x 未定義“。(一個(gè)語(yǔ)句的執(zhí)行順序是從右往左,所以x為聲明而報(bào)錯(cuò))

ES6 規(guī)定暫時(shí)性死區(qū)和let、const語(yǔ)句不出現(xiàn)變量提升,主要是為了減少運(yùn)行時(shí)錯(cuò)誤,防止在變量聲明前就使用這個(gè)變量,從而導(dǎo)致意料之外的行為。這樣的錯(cuò)誤在 ES5 是很常見(jiàn)的,現(xiàn)在有了這種規(guī)定,避免此類錯(cuò)誤就很容易了。

總之,暫時(shí)性死區(qū)的本質(zhì)就是,只要一進(jìn)入當(dāng)前作用域,所要使用的變量就已經(jīng)存在了,但是不可獲取,只有等到聲明變量的那一行代碼出現(xiàn),才可以獲取和使用該變量。

不允許重復(fù)聲明

let不允許在相同作用域內(nèi)重復(fù)聲明同一個(gè)變量。

// 報(bào)錯(cuò) function func() {let a = 10;var a = 1; }// 報(bào)錯(cuò) function func() {let a = 10;let a = 1; }

因此,不能在函數(shù)內(nèi)部重新聲明參數(shù)。(正好對(duì)應(yīng)上面的for循環(huán)中的父作用域與子作用域的解說(shuō)!)

function func(arg) {let arg; } func() // 報(bào)錯(cuò)function func(arg) {{let arg;} } func() // 不報(bào)錯(cuò)

ES6 的塊級(jí)作用域

let實(shí)際上為 JavaScript 新增了塊級(jí)作用域。

function f1() {let n = 5;if (true) {let n = 10;}console.log(n); // 5 }

上面的函數(shù)有兩個(gè)代碼塊,都聲明了變量n,運(yùn)行后輸出 5。這表示外層代碼塊不受內(nèi)層代碼塊的影響。如果兩次都使用var定義變量n,最后輸出的值才是 10。

ES6 允許塊級(jí)作用域的任意嵌套。

{{{{{let insane = 'Hello World'}console.log(insane); // 報(bào)錯(cuò) }}}};

上面代碼使用了一個(gè)五層的塊級(jí)作用域,每一層都是一個(gè)單獨(dú)的作用域。第四層作用域無(wú)法讀取第五層作用域的內(nèi)部變量。

內(nèi)層作用域可以定義外層作用域的同名變量。

{{{{let insane = 'Hello World';{let insane = 'Hello World'} }}}};

塊級(jí)作用域的出現(xiàn),實(shí)際上使得獲得廣泛應(yīng)用的匿名立即執(zhí)行函數(shù)表達(dá)式(匿名 IIFE)不再必要了。

// IIFE 寫法 (function () {var tmp = ...;... }());// 塊級(jí)作用域?qū)懛?{let tmp = ...;... }

塊級(jí)作用域與函數(shù)聲明

函數(shù)能不能在塊級(jí)作用域之中聲明?這是一個(gè)相當(dāng)令人混淆的問(wèn)題。

ES5 規(guī)定,函數(shù)只能在頂層作用域函數(shù)作用域之中聲明,不能在塊級(jí)作用域聲明。

// 情況一 if (true) {function f() {} }// 情況二 try {function f() {} } catch(e) {// ... }

上面兩種函數(shù)聲明,根據(jù) ES5 的規(guī)定都是非法的。

但是,瀏覽器沒(méi)有遵守這個(gè)規(guī)定,為了兼容以前的舊代碼,還是支持在塊級(jí)作用域之中聲明函數(shù),因此上面兩種情況實(shí)際都能運(yùn)行,不會(huì)報(bào)錯(cuò)。

ES6 引入了塊級(jí)作用域,明確允許在塊級(jí)作用域之中聲明函數(shù)。ES6 規(guī)定,塊級(jí)作用域之中,函數(shù)聲明語(yǔ)句的行為類似于let,在塊級(jí)作用域之外不可引用。

function f() { console.log('I am outside!'); }(function () {if (false) {// 重復(fù)聲明一次函數(shù)ffunction f() { console.log('I am inside!'); }}f(); }());

上面代碼在 ES5 中運(yùn)行,會(huì)得到“I am inside!”,因?yàn)樵趇f內(nèi)聲明的函數(shù)f會(huì)被提升到函數(shù)頭部,實(shí)際運(yùn)行的代碼如下。

// ES5 環(huán)境 function f() { console.log('I am outside!'); }(function () {function f() { console.log('I am inside!'); }if (false) {}f(); }());

ES6 就完全不一樣了,理論上會(huì)得到“I am outside!”。因?yàn)閴K級(jí)作用域內(nèi)聲明的函數(shù)類似于let,對(duì)作用域之外沒(méi)有影響。但是,如果你真的在 ES6 瀏覽器中運(yùn)行一下上面的代碼,是會(huì)報(bào)錯(cuò)的,這是為什么呢?

// 瀏覽器的 ES6 環(huán)境 function f() { console.log('I am outside!'); }(function () {if (false) {// 重復(fù)聲明一次函數(shù)ffunction f() { console.log('I am inside!'); }}f(); }()); // Uncaught TypeError: f is not a function

上面的代碼在 ES6 瀏覽器中,都會(huì)報(bào)錯(cuò)。

原來(lái),如果改變了塊級(jí)作用域內(nèi)聲明的函數(shù)的處理規(guī)則,顯然會(huì)對(duì)老代碼產(chǎn)生很大影響。為了減輕因此產(chǎn)生的不兼容問(wèn)題,ES6 在附錄 B里面規(guī)定,瀏覽器的實(shí)現(xiàn)可以不遵守上面的規(guī)定,有自己的行為方式。

  • 允許在塊級(jí)作用域內(nèi)聲明函數(shù)。
  • 函數(shù)聲明類似于var,即會(huì)提升到全局作用域或函數(shù)作用域的頭部。
  • 同時(shí),函數(shù)聲明還會(huì)提升到所在的塊級(jí)作用域的頭部。(是函數(shù)聲明還是整個(gè)函數(shù)都提升到塊級(jí)作用域?)

注意,上面三條規(guī)則只對(duì) ES6 的瀏覽器實(shí)現(xiàn)有效,其他環(huán)境的實(shí)現(xiàn)不用遵守,還是將塊級(jí)作用域的函數(shù)聲明當(dāng)作let處理。

根據(jù)這三條規(guī)則,瀏覽器的 ES6 環(huán)境中,塊級(jí)作用域內(nèi)聲明的函數(shù),行為類似于var聲明的變量。上面的例子實(shí)際運(yùn)行的代碼如下。

// 瀏覽器的 ES6 環(huán)境 function f() { console.log('I am outside!'); } (function () {var f = undefined; // 函數(shù)聲明類似于var,即會(huì)提升到全局作用域或函數(shù)作用域的頭部if (false) {function f() { console.log('I am inside!'); } //同時(shí),函數(shù)還會(huì)提升到所在的塊級(jí)作用域的頭部。}f(); }()); // Uncaught TypeError: f is not a function

考慮到環(huán)境導(dǎo)致的行為差異太大,應(yīng)該避免在塊級(jí)作用域內(nèi)聲明函數(shù)。如果確實(shí)需要,也應(yīng)該寫成函數(shù)表達(dá)式,而不是函數(shù)聲明語(yǔ)句。

// 塊級(jí)作用域內(nèi)部的函數(shù)聲明語(yǔ)句,建議不要使用 {let a = 'secret';function f() {return a;} }// 塊級(jí)作用域內(nèi)部,優(yōu)先使用函數(shù)表達(dá)式 {let a = 'secret';let f = function () {return a;}; }

另外,還有一個(gè)需要注意的地方。ES6 的塊級(jí)作用域必須有大括號(hào),如果沒(méi)有大括號(hào),JavaScript 引擎就認(rèn)為不存在塊級(jí)作用域

// 第一種寫法,報(bào)錯(cuò) if (true) let x = 1;// 第二種寫法,不報(bào)錯(cuò) if (true) {let x = 1; }

上面代碼中,第一種寫法沒(méi)有大括號(hào),所以不存在塊級(jí)作用域,而let只能出現(xiàn)在當(dāng)前作用域的頂層,所以報(bào)錯(cuò)。第二種寫法有大括號(hào),所以塊級(jí)作用域成立。

函數(shù)聲明也是如此,嚴(yán)格模式下,函數(shù)只能聲明在當(dāng)前作用域的頂層。(我猜是因?yàn)槿绻麤](méi)有{},變量或者函數(shù)都存在當(dāng)前作用域頂層的下一級(jí)非塊級(jí)作用域中(不知名作用域……),所以會(huì)報(bào)錯(cuò)?)

// 不報(bào)錯(cuò) 'use strict'; if (true) {function f() {} }// 報(bào)錯(cuò) 'use strict'; if (true)function f() {}

const

const聲明一個(gè)只讀的常量。一旦聲明,常量的值就不能改變。

const PI = 3.1415; PI // 3.1415PI = 3; // TypeError: Assignment to constant variable.

上面代碼表明改變常量的值會(huì)報(bào)錯(cuò)。

const聲明的變量不得改變值,這意味著,const一旦聲明變量,就必須立即初始化不能留到以后賦值。

const foo; // SyntaxError: Missing initializer in const declaration

上面代碼表示,對(duì)于const來(lái)說(shuō),只聲明不賦值,就會(huì)報(bào)錯(cuò)。

const的作用域與let命令相同:只在聲明所在的塊級(jí)作用域內(nèi)有效。

if (true) {const MAX = 5; }MAX // Uncaught ReferenceError: MAX is not defined

const命令聲明的常量也是不提升,同樣存在暫時(shí)性死區(qū),只能在聲明的位置后面使用。

if (true) {console.log(MAX); // ReferenceErrorconst MAX = 5; }

上面代碼在常量MAX聲明之前就調(diào)用,結(jié)果報(bào)錯(cuò)。

const聲明的常量,也與let一樣不可重復(fù)聲明。

var message = "Hello!"; let age = 25;// 以下兩行都會(huì)報(bào)錯(cuò) const message = "Goodbye!"; const age = 30;

本質(zhì)

const實(shí)際上保證的,并不是變量的值不得改動(dòng),而是變量指向的那個(gè)內(nèi)存地址所保存的數(shù)據(jù)不得改動(dòng)。對(duì)于簡(jiǎn)單類型的數(shù)據(jù)(數(shù)值、字符串、布爾值),值就保存著變量指向的那個(gè)內(nèi)存地址,因此等同于常量。但對(duì)于復(fù)合類型的數(shù)據(jù)(主要是對(duì)象和數(shù)組),變量指向的內(nèi)存地址,保存的只是一個(gè)指向?qū)嶋H數(shù)據(jù)的指針,const只能保證這個(gè)指針是固定的(即總是指向另一個(gè)固定的地址),至于它指向的數(shù)據(jù)結(jié)構(gòu)是不是可變的,就完全不能控制了。因此,將一個(gè)對(duì)象聲明為常量必須非常小心。

const foo = {};// 為 foo 添加一個(gè)屬性,可以成功 foo.prop = 123; foo.prop // 123// 將 foo 指向另一個(gè)對(duì)象,就會(huì)報(bào)錯(cuò) foo = {}; // TypeError: "foo" is read-only

上面代碼中,常量foo儲(chǔ)存的是一個(gè)地址,這個(gè)地址指向一個(gè)對(duì)象。不可變的只是這個(gè)地址,即不能把foo指向另一個(gè)地址,但對(duì)象本身是可變的,所以依然可以為其添加新屬性。

下面是另一個(gè)例子。

const a = []; a.push('Hello'); // 可執(zhí)行 a.length = 0; // 可執(zhí)行 a = ['Dave']; // 報(bào)錯(cuò)

上面代碼中,常量a是一個(gè)數(shù)組,這個(gè)數(shù)組本身是可寫的,但是如果將另一個(gè)數(shù)組賦值給a,就會(huì)報(bào)錯(cuò)。

如果真的想將對(duì)象凍結(jié),應(yīng)該使用Object.freeze方法。

const foo = Object.freeze({});// 常規(guī)模式時(shí),下面一行不起作用; // 嚴(yán)格模式時(shí),該行會(huì)報(bào)錯(cuò) foo.prop = 123;

上面代碼中,常量foo指向一個(gè)凍結(jié)的對(duì)象,所以添加新屬性不起作用,嚴(yán)格模式時(shí)還會(huì)報(bào)錯(cuò)。

除了將對(duì)象本身凍結(jié),對(duì)象的屬性也應(yīng)該凍結(jié)。下面是一個(gè)將對(duì)象徹底凍結(jié)的函數(shù)。(遞歸)

var constantize = (obj) => {Object.freeze(obj);Object.keys(obj).forEach( (key, i) => {if ( typeof obj[key] === 'object' ) {constantize( obj[key] );}}); };

ES6 聲明變量的六種方法

ES5 只有兩種聲明變量的方法:var命令和function命令。ES6 除了添加let和const命令,后面章節(jié)還會(huì)提到,另外兩種聲明變量的方法:import命令和class命令。所以,ES6 一共有 6 種聲明變量的方法。

頂層對(duì)象的屬性

頂層對(duì)象,在瀏覽器環(huán)境指的是window對(duì)象,在 Node 指的是global對(duì)象。ES5 之中,頂層對(duì)象的屬性與全局變量是等價(jià)的。

window.a = 1; a // 1a = 2; window.a // 2

這樣的設(shè)計(jì)帶來(lái)了幾個(gè)很大的問(wèn)題,首先是沒(méi)法在編譯時(shí)就報(bào)出變量未聲明的錯(cuò)誤,只有運(yùn)行時(shí)才能知道因?yàn)槿肿兞靠赡苁琼攲訉?duì)象的屬性創(chuàng)造的,而屬性的創(chuàng)造是動(dòng)態(tài)的);其次,程序員很容易不知不覺(jué)地就創(chuàng)建了全局變量(比如打字出錯(cuò));最后,頂層對(duì)象的屬性是到處可以讀寫的,這非常不利于模塊化編程。另一方面,window對(duì)象有實(shí)體含義,指的是瀏覽器的窗口對(duì)象,頂層對(duì)象是一個(gè)有實(shí)體含義的對(duì)象,也是不合適的。

ES6 為了改變這一點(diǎn),一方面規(guī)定,為了保持兼容性,var命令和function命令聲明的全局變量,依舊是頂層對(duì)象的屬性;另一方面規(guī)定,let命令、const命令、class命令聲明的全局變量,不屬于頂層對(duì)象的屬性。也就是說(shuō),從 ES6 開(kāi)始,全局變量將逐步與頂層對(duì)象的屬性脫鉤。

var a = 1; // 如果在 Node 的 REPL 環(huán)境,可以寫成 global.a // 或者采用通用方法,寫成 this.a window.a // 1let b = 1; window.b // undefined

上面代碼中,全局變量a由var命令聲明,所以它是頂層對(duì)象的屬性;全局變量b由let命令聲明,所以它不是頂層對(duì)象的屬性,返回undefined。

globalThis 對(duì)象

JavaScript 語(yǔ)言存在一個(gè)頂層對(duì)象,它提供全局環(huán)境(即全局作用域),所有代碼都是在這個(gè)環(huán)境中運(yùn)行。但是,頂層對(duì)象在各種實(shí)現(xiàn)里面是不統(tǒng)一的。

  • 瀏覽器里面,頂層對(duì)象是window,但 Node 和 Web Worker 沒(méi)有window。
  • 瀏覽器和 Web Worker 里面,self也指向頂層對(duì)象,但是 Node 沒(méi)有self。
  • Node 里面,頂層對(duì)象是global,但其他環(huán)境都不支持。

同一段代碼為了能夠在各種環(huán)境,都能取到頂層對(duì)象,現(xiàn)在一般是使用this變量,但是有局限性。

  • 全局環(huán)境中,this會(huì)返回頂層對(duì)象。但是,Node 模塊和 ES6 模塊中,this返回的是當(dāng)前模塊。
  • 函數(shù)里面的this,如果函數(shù)不是作為對(duì)象的方法運(yùn)行,而是單純作為函數(shù)運(yùn)行,this會(huì)指向頂層對(duì)象。但是,嚴(yán)格模式下,這時(shí)this會(huì)返回undefined。
  • 不管是嚴(yán)格模式,還是普通模式,new Function('return this')(),總是會(huì)返回全局對(duì)象。但是,如果瀏覽器用了 CSP(Content Security Policy,內(nèi)容安全策略),那么eval、new Function這些方法都可能無(wú)法使用。

綜上所述,很難找到一種方法,可以在所有情況下,都取到頂層對(duì)象。下面是兩種勉強(qiáng)可以使用的方法。

// 方法一 (typeof window !== 'undefined'? window: (typeof process === 'object' &&typeof require === 'function' &&typeof global === 'object')? global: this);// 方法二 var getGlobal = function () {if (typeof self !== 'undefined') { return self; }if (typeof window !== 'undefined') { return window; }if (typeof global !== 'undefined') { return global; }throw new Error('unable to locate global object'); };

現(xiàn)在有一個(gè)提案,在語(yǔ)言標(biāo)準(zhǔn)的層面,引入globalThis作為頂層對(duì)象。也就是說(shuō),任何環(huán)境下,globalThis都是存在的,都可以從它拿到頂層對(duì)象,指向全局環(huán)境下的this。

墊片庫(kù)global-this模擬了這個(gè)提案,可以在所有環(huán)境拿到globalThis。


變量的解構(gòu)賦值

基本用法

ES6 允許按照一定模式,從數(shù)組對(duì)象中提取值,對(duì)變量進(jìn)行賦值,這被稱為解構(gòu)(Destructuring)。

let [a, b, c] = [1, 2, 3];

上面代碼表示,可以從數(shù)組中提取值,按照對(duì)應(yīng)位置,對(duì)變量賦值。

本質(zhì)上,這種寫法屬于“模式匹配”,只要等號(hào)兩邊的模式相同,左邊的變量就會(huì)被賦予對(duì)應(yīng)的值。下面是一些使用嵌套數(shù)組進(jìn)行解構(gòu)的例子。

let [foo, [[bar], baz]] = [1, [[2], 3]]; foo // 1 bar // 2 baz // 3let [ , , third] = ["foo", "bar", "baz"]; third // "baz"let [x, , y] = [1, 2, 3]; x // 1 y // 3let [head, ...tail] = [1, 2, 3, 4]; head // 1 tail // [2, 3, 4]let [x, y, ...z] = ['a']; x // "a" y // undefined z // []

另一種情況是不完全解構(gòu),即等號(hào)左邊的模式,只匹配一部分的等號(hào)右邊的數(shù)組。這種情況下,解構(gòu)依然可以成功。

let [x, y] = [1, 2, 3]; x // 1 y // 2let [a, [b], d] = [1, [2, 3], 4]; a // 1 b // 2 d // 4

如果等號(hào)的右邊不是數(shù)組(或者嚴(yán)格地說(shuō),不是可遍歷的結(jié)構(gòu),參見(jiàn)《Iterator》一章),那么將會(huì)報(bào)錯(cuò)。

// 報(bào)錯(cuò) let [foo] = 1; let [foo] = false; let [foo] = NaN; let [foo] = undefined; let [foo] = null; let [foo] = {};

上面的語(yǔ)句都會(huì)報(bào)錯(cuò),因?yàn)榈忍?hào)右邊的值,要么轉(zhuǎn)為對(duì)象以后不具備 Iterator 接口(前五個(gè)表達(dá)式),要么本身就不具備 Iterator 接口(最后一個(gè)表達(dá)式)。

對(duì)于 Set 結(jié)構(gòu),也可以使用數(shù)組的解構(gòu)賦值。

let [x, y, z] = new Set(['a', 'b', 'c']); x // "a"

事實(shí)上,只要某種數(shù)據(jù)結(jié)構(gòu)具有 Iterator 接口,都可以采用數(shù)組形式的解構(gòu)賦值。

function* fibs() {let a = 0;let b = 1;while (true) {yield a;[a, b] = [b, a + b];} }let [first, second, third, fourth, fifth, sixth] = fibs(); sixth // 5

上面代碼中,fibs是一個(gè) Generator 函數(shù)(參見(jiàn)《Generator 函數(shù)》一章),原生具有 Iterator 接口。解構(gòu)賦值會(huì)依次從這個(gè)接口獲取值

默認(rèn)值

解構(gòu)賦值允許指定默認(rèn)值。

let [foo = true] = []; foo // truelet [x, y = 'b'] = ['a']; // x='a', y='b' let [x, y = 'b'] = ['a', undefined]; // x='a', y='b'

注意,ES6 內(nèi)部使用嚴(yán)格相等運(yùn)算符(===)判斷一個(gè)位置是否有值。所以,只有當(dāng)一個(gè)數(shù)組成員嚴(yán)格等于undefined,默認(rèn)值才會(huì)生效

let [x = 1] = [undefined]; x // 1let [x = 1] = [null]; x // null

上面代碼中,如果一個(gè)數(shù)組成員是null,默認(rèn)值就不會(huì)生效,因?yàn)?strong>null不嚴(yán)格等于undefined。

console.log(undefined === undefined) // true console.log(null === null) // true console.log(NaN === NaN) // false console.log(null)//null console.log(typeof null)//object

如果默認(rèn)值是一個(gè)表達(dá)式,那么這個(gè)表達(dá)式是惰性求值的,即只有在用到的時(shí)候,才會(huì)求值。

function f() {console.log('aaa'); }let [x = f()] = [1];

上面代碼中,因?yàn)閤能取到值,所以函數(shù)f根本不會(huì)執(zhí)行。上面的代碼其實(shí)等價(jià)于下面的代碼。

let x; if ([1][0] === undefined) {x = f(); } else {x = [1][0]; }

默認(rèn)值可以引用解構(gòu)賦值的其他變量,但該變量必須已經(jīng)聲明。

let [x = 1, y = x] = []; // x=1; y=1 let [x = 1, y = x] = [2]; // x=2; y=2 let [x = 1, y = x] = [1, 2]; // x=1; y=2 let [x = y, y = 1] = []; // ReferenceError: y is not defined

上面最后一個(gè)表達(dá)式之所以會(huì)報(bào)錯(cuò),是因?yàn)閤用y做默認(rèn)值時(shí),y還沒(méi)有聲明。

對(duì)象的解構(gòu)賦值

解構(gòu)不僅可以用于數(shù)組,還可以用于對(duì)象。

let { foo, bar } = { foo: 'aaa', bar: 'bbb' }; foo // "aaa" bar // "bbb"

對(duì)象的解構(gòu)與數(shù)組有一個(gè)重要的不同。數(shù)組的元素是按次序排列的,變量的取值由它的位置決定;而對(duì)象的屬性沒(méi)有次序,變量必須與屬性同名,才能取到正確的值。

let { bar, foo } = { foo: 'aaa', bar: 'bbb' }; foo // "aaa" bar // "bbb"let { baz } = { foo: 'aaa', bar: 'bbb' }; baz // undefined

上面代碼的第一個(gè)例子,等號(hào)左邊的兩個(gè)變量的次序,與等號(hào)右邊兩個(gè)同名屬性的次序不一致,但是對(duì)取值完全沒(méi)有影響。第二個(gè)例子的變量沒(méi)有對(duì)應(yīng)的同名屬性,導(dǎo)致取不到值,最后等于undefined。

如果解構(gòu)失敗,變量的值等于undefined。

let {foo} = {bar: 'baz'}; foo // undefined

對(duì)象的解構(gòu)賦值,可以很方便地將現(xiàn)有對(duì)象的方法,賦值到某個(gè)變量。

// 例一 let { log, sin, cos } = Math;// 例二 const { log } = console; log('hello') // hello

上面代碼的例一將Math對(duì)象的對(duì)數(shù)、正弦、余弦三個(gè)方法,賦值到對(duì)應(yīng)的變量上,使用起來(lái)就會(huì)方便很多。例二將console.log賦值到log變量。

如果變量名與屬性名不一致,必須寫成下面這樣。

let { foo: baz } = { foo: 'aaa', bar: 'bbb' }; baz // "aaa"let obj = { first: 'hello', last: 'world' }; let { first: f, last: l } = obj; f // 'hello' l // 'world'

這實(shí)際上說(shuō)明,對(duì)象的解構(gòu)賦值是下面形式的簡(jiǎn)寫(參見(jiàn)《對(duì)象的擴(kuò)展》一章)。

let { foo: foo, bar: bar } = { foo: 'aaa', bar: 'bbb' };

也就是說(shuō),對(duì)象的解構(gòu)賦值的內(nèi)部機(jī)制,是先找到同名屬性,然后再賦給對(duì)應(yīng)的變量。真正被賦值的是后者,而不是前者。

let { foo: baz } = { foo: 'aaa', bar: 'bbb' }; baz // "aaa" foo // error: foo is not defined

上面代碼中,foo是匹配的模式,baz才是變量。真正被賦值的是變量baz,而不是模式foo。

與數(shù)組一樣,解構(gòu)也可以用于嵌套結(jié)構(gòu)的對(duì)象。

let obj = {p: ['Hello',{ y: 'World' }] };let { p: [x, { y }] } = obj; x // "Hello" y // "World"

注意,這時(shí)p是模式,不是變量,因此不會(huì)被賦值。如果p也要作為變量賦值,可以寫成下面這樣。

let obj = {p: ['Hello',{ y: 'World' }] };let { p, p: [x, { y }] } = obj; x // "Hello" y // "World" p // ["Hello", {y: "World"}]

下面是嵌套賦值的例子。

let obj = {}; let arr = [];({ foo: obj.prop, bar: arr[0] } = { foo: 123, bar: true });obj // {prop:123} arr // [true]

如果解構(gòu)模式是嵌套的對(duì)象,而且子對(duì)象所在的父屬性不存在,那么將會(huì)報(bào)錯(cuò)。

// 報(bào)錯(cuò) let {foo: {bar}} = {baz: 'baz'};

上面代碼中,等號(hào)左邊對(duì)象的foo屬性,對(duì)應(yīng)一個(gè)子對(duì)象。該子對(duì)象的bar屬性,解構(gòu)時(shí)會(huì)報(bào)錯(cuò)。原因很簡(jiǎn)單,因?yàn)閒oo這時(shí)等于undefined,再取子屬性就會(huì)報(bào)錯(cuò)。

注意,對(duì)象的解構(gòu)賦值可以取到繼承的屬性。

const obj1 = {}; const obj2 = { foo: 'bar' }; Object.setPrototypeOf(obj1, obj2);const { foo } = obj1; foo // "bar"

上面代碼中,對(duì)象obj1的原型對(duì)象是obj2。foo屬性不是obj1自身的屬性,而是繼承自obj2的屬性,解構(gòu)賦值可以取到這個(gè)屬性。

默認(rèn)值

對(duì)象的解構(gòu)也可以指定默認(rèn)值。

var {x = 3} = {}; x // 3var {x, y = 5} = {x: 1}; x // 1 y // 5var {x: y = 3} = {}; y // 3var {x: y = 3} = {x: 5}; y // 5var { message: msg = 'Something went wrong' } = {}; msg // "Something went wrong"

默認(rèn)值生效的條件是,對(duì)象的屬性值嚴(yán)格等于undefined

var {x = 3} = {x: undefined}; x // 3var {x = 3} = {x: null}; x // null

上面代碼中,屬性x等于null,因?yàn)閚ull與undefined不嚴(yán)格相等,所以是個(gè)有效的賦值,導(dǎo)致默認(rèn)值3不會(huì)生效。

注意點(diǎn)

(1)如果要將一個(gè)已經(jīng)聲明的變量用于解構(gòu)賦值,必須非常小心。

// 錯(cuò)誤的寫法 let x; {x} = {x: 1}; // SyntaxError: syntax error

上面代碼的寫法會(huì)報(bào)錯(cuò),因?yàn)?strong> JavaScript 引擎會(huì)將{x}理解成一個(gè)代碼塊,從而發(fā)生語(yǔ)法錯(cuò)誤(這里可以理解為代碼塊 = 代碼塊,所以會(huì)報(bào)錯(cuò))。只有不將大括號(hào)寫在行首,避免 JavaScript 將其解釋為代碼塊,才能解決這個(gè)問(wèn)題。

// 正確的寫法 let x; ({x} = {x: 1});

上面代碼將整個(gè)解構(gòu)賦值語(yǔ)句,放在一個(gè)圓括號(hào)里面,就可以正確執(zhí)行。關(guān)于圓括號(hào)與解構(gòu)賦值的關(guān)系,參見(jiàn)下文。

(2)解構(gòu)賦值允許等號(hào)左邊的模式之中,不放置任何變量名。因此,可以寫出非常古怪的賦值表達(dá)式。

({} = [true, false]); ({} = 'abc'); ({} = []);

上面的表達(dá)式雖然毫無(wú)意義,但是語(yǔ)法是合法的,可以執(zhí)行。

(3)由于數(shù)組本質(zhì)是特殊的對(duì)象,因此可以對(duì)數(shù)組進(jìn)行對(duì)象屬性的解構(gòu)。

let arr = [1, 2, 3]; let {0 : first, [arr.length - 1] : last} = arr; first // 1 last // 3

上面代碼對(duì)數(shù)組進(jìn)行對(duì)象解構(gòu)。數(shù)組arr的0鍵對(duì)應(yīng)的值是1,[arr.length - 1]就是2鍵,對(duì)應(yīng)的值是3。方括號(hào)這種寫法,屬于“屬性名表達(dá)式”(數(shù)組默認(rèn)屬性名都是下標(biāo))(參見(jiàn)《對(duì)象的擴(kuò)展》一章)。

字符串的解構(gòu)賦值

字符串也可以解構(gòu)賦值。這是因?yàn)榇藭r(shí),字符串被轉(zhuǎn)換成了一個(gè)類似數(shù)組的對(duì)象

const [a, b, c, d, e] = 'hello'; a // "h" b // "e" c // "l" d // "l" e // "o"

類似數(shù)組的對(duì)象都有一個(gè)length屬性,因此還可以對(duì)這個(gè)屬性解構(gòu)賦值。

let {length : len} = 'hello'; len // 5

數(shù)值和布爾值的解構(gòu)賦值

解構(gòu)賦值時(shí),如果等號(hào)右邊是數(shù)值和布爾值,則會(huì)先轉(zhuǎn)為對(duì)象

let {toString: s} = 123; s === Number.prototype.toString // truelet {toString: s} = true; s === Boolean.prototype.toString // true

上面代碼中,數(shù)值和布爾值的包裝對(duì)象都有toString屬性,因此變量s都能取到值。

解構(gòu)賦值的規(guī)則是,只要等號(hào)右邊的值不是對(duì)象或數(shù)組,就先將其轉(zhuǎn)為對(duì)象。由于undefined和null無(wú)法轉(zhuǎn)為對(duì)象(可是null又稱為空對(duì)象,typeof null = object……),所以對(duì)它們進(jìn)行解構(gòu)賦值,都會(huì)報(bào)錯(cuò)。

let { prop: x } = undefined; // TypeError let { prop: y } = null; // TypeError

函數(shù)參數(shù)的解構(gòu)賦值

函數(shù)的參數(shù)也可以使用解構(gòu)賦值。

function add([x, y]){return x + y; }add([1, 2]); // 3

上面代碼中,函數(shù)add的參數(shù)表面上是一個(gè)數(shù)組,但在傳入?yún)?shù)的那一刻,數(shù)組參數(shù)就被解構(gòu)成變量x和y。對(duì)于函數(shù)內(nèi)部的代碼來(lái)說(shuō),它們能感受到的參數(shù)就是x和y。

下面是另一個(gè)例子。

[[1, 2], [3, 4]].map(([a, b]) => a + b); // [ 3, 7 ]

函數(shù)參數(shù)的解構(gòu)也可以使用默認(rèn)值。

function move({x = 0, y = 0} = {}) {return [x, y]; }move({x: 3, y: 8}); // [3, 8] move({x: 3}); // [3, 0] move({}); // [0, 0] move(); // [0, 0]

上面代碼中,函數(shù)move的參數(shù)是一個(gè)對(duì)象,通過(guò)對(duì)這個(gè)對(duì)象進(jìn)行解構(gòu),得到變量x和y的值。如果解構(gòu)失敗,x和y等于默認(rèn)值。

注意,下面的寫法會(huì)得到不一樣的結(jié)果。

function move({x, y} = { x: 0, y: 0 }) {return [x, y]; }move({x: 3, y: 8}); // [3, 8] => move({x, y} = { x: 0, y: 0 } = {x: 3, y: 8}) move({x: 3}); // [3, undefined] => move({x, y} = { x: 0, y: 0 } = {x: 3, y: undefined}) move({}); // [undefined, undefined] => move({x, y} = { x: 0, y: 0 } = {x: undefined, y: undefined}) move(); // [0, 0] => move({x, y} = { x: 0, y: 0 })

上面代碼是為函數(shù)move的參數(shù)指定默認(rèn)值,而不是為變量x和y指定默認(rèn)值,所以會(huì)得到與前一種寫法不同的結(jié)果。

undefined就會(huì)觸發(fā)函數(shù)參數(shù)的默認(rèn)值。

[1, undefined, 3].map((x = 'yes') => x); // [ 1, 'yes', 3 ]

圓括號(hào)問(wèn)題

解構(gòu)賦值雖然很方便,但是解析起來(lái)并不容易。對(duì)于編譯器來(lái)說(shuō),一個(gè)式子到底是模式,還是表達(dá)式,沒(méi)有辦法從一開(kāi)始就知道,必須解析到(或解析不到)等號(hào)才能知道。

由此帶來(lái)的問(wèn)題是,如果模式中出現(xiàn)圓括號(hào)怎么處理。ES6 的規(guī)則是,只要有可能導(dǎo)致解構(gòu)的歧義,就不得使用圓括號(hào)。

但是,這條規(guī)則實(shí)際上不那么容易辨別,處理起來(lái)相當(dāng)麻煩。因此,建議只要有可能,就不要在模式中放置圓括號(hào)。

不能使用圓括號(hào)的情況

以下三種解構(gòu)賦值不得使用圓括號(hào)。

(1)變量聲明語(yǔ)句

// 全部報(bào)錯(cuò) let [(a)] = [1];let {x: (c)} = {}; let ({x: c}) = {}; let {(x: c)} = {}; let {(x): c} = {};let { o: ({ p: p }) } = { o: { p: 2 } };

上面 6 個(gè)語(yǔ)句都會(huì)報(bào)錯(cuò),因?yàn)樗鼈兌际?strong>變量聲明語(yǔ)句,模式不能使用圓括號(hào)。

(2)函數(shù)參數(shù)

函數(shù)參數(shù)也屬于變量聲明,因此不能帶有圓括號(hào)。

// 報(bào)錯(cuò) function f([(z)]) { return z; } // 報(bào)錯(cuò) function f([z,(x)]) { return x; }

(3)賦值語(yǔ)句的模式

// 全部報(bào)錯(cuò),這樣就等于 語(yǔ)句 = 代碼塊 ({ p: a }) = { p: 42 }; ([a]) = [5];

上面代碼將整個(gè)模式放在圓括號(hào)之中,導(dǎo)致報(bào)錯(cuò)。

// 報(bào)錯(cuò) [({ p: a }), { x: c }] = [{}, {}];

上面代碼將一部分模式放在圓括號(hào)之中,導(dǎo)致報(bào)錯(cuò)。

可以使用圓括號(hào)的情況

可以使用圓括號(hào)的情況只有一種:賦值語(yǔ)句的非模式部分,可以使用圓括號(hào)。

[(b)] = [3]; // 正確 ({ p: (d) } = {}); // 正確 [(parseInt.prop)] = [3]; // 正確

上面三行語(yǔ)句都可以正確執(zhí)行,因?yàn)槭紫人鼈兌际琴x值語(yǔ)句,而不是聲明語(yǔ)句;其次它們的圓括號(hào)都不屬于模式的一部分。第一行語(yǔ)句中,模式是取數(shù)組的第一個(gè)成員,跟圓括號(hào)無(wú)關(guān);第二行語(yǔ)句中,模式是p,而不是d;第三行語(yǔ)句與第一行語(yǔ)句的性質(zhì)一致。

用途

變量的解構(gòu)賦值用途很多。

(1)交換變量的值

let x = 1; let y = 2;[x, y] = [y, x];

上面代碼交換變量x和y的值,這樣的寫法不僅簡(jiǎn)潔,而且易讀,語(yǔ)義非常清晰。

(2)從函數(shù)返回多個(gè)值

函數(shù)只能返回一個(gè)值,如果要返回多個(gè)值,只能將它們放在數(shù)組或?qū)ο罄锓祷亍S辛私鈽?gòu)賦值,取出這些值就非常方便。

// 返回一個(gè)數(shù)組function example() {return [1, 2, 3]; } let [a, b, c] = example();// 返回一個(gè)對(duì)象function example() {return {foo: 1,bar: 2}; } let { foo, bar } = example();

(3)函數(shù)參數(shù)的定義

解構(gòu)賦值可以方便地將一組參數(shù)與變量名對(duì)應(yīng)起來(lái)。

// 參數(shù)是一組有次序的值 function f([x, y, z]) { ... } f([1, 2, 3]);// 參數(shù)是一組無(wú)次序的值 function f({x, y, z}) { ... } f({z: 3, y: 2, x: 1});

(4)提取 JSON 數(shù)據(jù)

解構(gòu)賦值對(duì)提取 JSON 對(duì)象中的數(shù)據(jù),尤其有用。

let jsonData = {id: 42,status: "OK",data: [867, 5309] };let { id, status, data: number } = jsonData;console.log(id, status, number); // 42, "OK", [867, 5309]

上面代碼可以快速提取 JSON 數(shù)據(jù)的值。

(5)函數(shù)參數(shù)的默認(rèn)值

jQuery.ajax = function (url, {async = true,beforeSend = function () {},cache = true,complete = function () {},crossDomain = false,global = true,// ... more config } = {}) { <=!!!!// ... do stuff };

指定參數(shù)的默認(rèn)值,就避免了在函數(shù)體內(nèi)部再寫var foo = config.foo || 'default foo';這樣的語(yǔ)句。

(6)遍歷 Map 結(jié)構(gòu)

任何部署了 Iterator 接口的對(duì)象,都可以用for...of循環(huán)遍歷。Map 結(jié)構(gòu)原生支持 Iterator 接口,配合變量的解構(gòu)賦值,獲取鍵名和鍵值就非常方便。

const map = new Map(); map.set('first', 'hello'); map.set('second', 'world');for (let [key, value] of map) {console.log(key + " is " + value); } // first is hello // second is world

如果只想獲取鍵名,或者只想獲取鍵值,可以寫成下面這樣。

// 獲取鍵名 for (let [key] of map) {// ... }// 獲取鍵值 for (let [,value] of map) {// ... }

(7)輸入模塊的指定方法

加載模塊時(shí),往往需要指定輸入哪些方法。解構(gòu)賦值使得輸入語(yǔ)句非常清晰。

const { SourceMapConsumer, SourceNode } = require("source-map");

?

?

?

總結(jié)

以上是生活随笔為你收集整理的ES6专题——整理自阮一峰老师的ECMAScript 6入门的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

日日干天天操 | 在线观看你懂的网站 | 久久精品国产免费看久久精品 | 久久午夜影视 | 久久国内免费视频 | 午夜精品一区二区三区在线 | 中文字幕av有码 | 国产精品一区二区三区在线播放 | 综合铜03 | 日韩免费观看一区二区三区 | 99久久精品久久久久久清纯 | 欧美色婷 | 色av资源网 | 国产精品免费人成网站 | 一区二区 精品 | 亚洲午夜久久久久久久久久久 | 99久久精品国产一区二区三区 | 成人动漫精品一区二区 | 人人涩| 99视频在线观看一区三区 | 99久久精品久久亚洲精品 | 一区二区三区在线不卡 | 97在线观看视频免费 | 国产精品aⅴ | 免费的国产精品 | 中文字幕字幕中文 | 日韩av免费一区 | 午夜一级免费电影 | 日本免费久久高清视频 | 婷婷四房综合激情五月 | 日韩av不卡在线观看 | 国产精品女同一区二区三区久久夜 | 日韩在线中文字幕 | 日日干,天天干 | 美女亚洲精品 | 亚洲黄色a| 欧美精品一区二区在线播放 | 97超碰人人澡人人爱学生 | 日韩高清免费在线观看 | 久久视频这里有久久精品视频11 | 亚洲激情中文 | 欧美少妇bbwhd| 五月婷网站 | 亚洲精品玖玖玖av在线看 | 国产精品99久久久精品 | 国产黄在线免费观看 | 欧美一级片免费播放 | 日韩va欧美va亚洲va久久 | 色婷婷亚洲婷婷 | 国产在线最新 | 99热高清 | 国产福利免费看 | 久久久久久激情 | 精品国产亚洲日本 | www.com黄色| 亚洲精品国久久99热 | 国产伦精品一区二区三区高清 | 国产精品激情在线观看 | 高清精品久久 | 久久无码精品一区二区三区 | 99精品在线观看 | 精品亚洲网 | 人人看97| 中文欧美字幕免费 | 成人中文字幕av | 精品久久久久久久久久久久 | 亚洲午夜精品久久久久久久久 | av中文字幕电影 | 色综合五月天 | 中文字幕a∨在线乱码免费看 | 亚洲免费观看在线视频 | 欧美日韩一区二区三区免费视频 | 欧美性另类 | 欧美性黄网官网 | 亚洲国产免费看 | 日韩欧美国产视频 | 欧美午夜精品久久久久久浪潮 | 精品爱爱 | 欧美99久久| 久久久综合九色合综国产精品 | 日韩欧美视频一区二区 | 狠狠色丁香婷婷综合橹88 | 日韩精品一区二区在线观看视频 | 色婷婷免费视频 | 天天爱综合 | 国产精品成人一区二区 | 国产v视频 | 亚洲最大av | 亚洲日日日| 国产亚洲视频在线观看 | 久草剧场| 91午夜精品 | 国产最新视频在线 | 99精品在线观看 | 精品国产综合区久久久久久 | 亚洲精品视频在线观看免费视频 | 久久国产经典视频 | 亚洲精品视频在线播放 | 狠狠干天天干 | 韩日精品在线 | 99精品国产在热久久 | 免费观看全黄做爰大片国产 | 久草a视频| 91精品国产高清自在线观看 | 精品国产一区二区三区久久 | 天堂在线免费视频 | 波多野结衣一区 | av中文字幕网站 | 成人免费色| 欧美精彩视频 | 中文字幕一区二区三区四区久久 | 免费黄色网址网站 | 久久免费国产精品1 | 日本午夜在线亚洲.国产 | 国产在线国偷精品产拍免费yy | 天天曰天天 | 在线观看午夜av | www婷婷| www.国产毛片 | 国产视频在线观看一区二区 | 久久综合毛片 | 精品av网站| 日韩毛片一区 | 成人av网页| 日韩高清在线不卡 | 色停停五月天 | 欧美日韩在线观看不卡 | 日本高清免费中文字幕 | 超碰999| 亚洲精品视频二区 | 夜夜夜影院 | 免费在线一区二区 | 91精品综合在线观看 | 亚在线播放中文视频 | 中国一级特黄毛片大片久久 | 免费看成人片 | 91av国产视频 | 久久久久久久久久久久久久免费看 | 国产精品欧美久久久久无广告 | 日韩国产在线观看 | 成人三级网址 | 精品国产一二三 | 国产精品一区二区三区在线 | 国产麻豆成人传媒免费观看 | 免费网站v | 在线免费观看av网站 | 狠狠插狠狠干 | 色婷婷狠狠五月综合天色拍 | 人人插人人看 | 精品一区二区久久久久久久网站 | 在线免费观看涩涩 | 久久免费视频在线观看30 | 中文字幕免费在线 | 久久伊人91| 精品欧美一区二区三区久久久 | 久草在线免费资源 | 一区二区精品视频 | 免费日韩av电影 | 男女啪啪免费网站 | 99精品视频在线观看 | 国产日韩亚洲 | 久久美女精品 | 国产尤物一区二区三区 | 最近中文字幕第一页 | 国产精品毛片一区视频播不卡 | 99精品一区二区三区 | 五月亚洲综合 | 精品久久久久一区二区国产 | 日日干网 | 免费黄色av | 国产麻豆精品95视频 | 国产一二区视频 | 国产尤物一区二区三区 | 麻豆国产精品一区二区三区 | 久久这里精品视频 | 日韩在线观看不卡 | 狠狠的操狠狠的干 | 亚洲一区二区三区在线看 | 久久69精品久久久久久久电影好 | 久久中文字幕导航 | 久久久久久久久网站 | 久久久精品国产免费观看同学 | 久久人人爽视频 | 日韩精品久久久 | 精品国产一区二区三区在线观看 | 欧美xxxx性xxxxx高清 | 国产三级在线播放 | 久久综合狠狠 | 久久国产精品免费看 | 久久激情电影 | 欧美综合在线视频 | 久福利 | 成人中文字幕+乱码+中文字幕 | 国产精品成人一区二区 | 视频精品一区二区三区 | 精品视频不卡 | 成人在线小视频 | 亚洲午夜精品久久久久久久久久久久 | 成人午夜网址 | ww亚洲ww亚在线观看 | 午夜视频黄 | 91丨九色丨蝌蚪丨对白 | 成人毛片一区 | 国产青春久久久国产毛片 | 国产区高清在线 | 亚洲精品观看 | 中文字幕永久免费 | 片网站| 成人精品福利 | 欧美有色 | 久99久精品视频免费观看 | 亚洲a资源| 91麻豆精品国产91 | 免费色视频网站 | 久久免费视频7 | 亚洲精品成人 | 草久视频在线观看 | 国产丝袜美腿在线 | 国产91精品看黄网站在线观看动漫 | 麻豆精品传媒视频 | 伊人五月天.com | 色综合天天综合网国产成人网 | 天天拍天天操 | 在线国产中文字幕 | 亚洲精品视频www | 波多野结衣电影一区二区三区 | 亚洲激精日韩激精欧美精品 | 欧美日韩啪啪 | 日本三级人妇 | 色综合久久久久综合体桃花网 | 综合网久久 | 欧美一区二区在线 | 91av九色| 国产精品美女久久 | 狠狠操夜夜 | 色黄视频免费观看 | 97夜夜澡人人爽人人免费 | 精品在线视频一区 | 夜色成人av | 五月婷婷一区二区三区 | 日韩精品视频第一页 | av在线收看 | 久久久久国产精品免费免费搜索 | av综合站| 一区二区三区在线看 | 日本久久久精品视频 | 久青草视频在线观看 | 97在线免费观看 | 色99导航| 视频二区| 亚洲精品美女 | 99视频在线精品免费观看2 | 夜夜操网 | 国产精品18久久久久久首页狼 | 欧美小视频在线 | 午夜视频在线观看一区 | 亚洲国产精久久久久久久 | 国内精品二区 | 久久在线视频精品 | 97小视频 | 免费观看91视频大全 | 在线观看国产www | 国产精品久久久久久婷婷天堂 | 亚洲精品色 | 亚洲精品国精品久久99热一 | 美女黄频网站 | 国产精品美女久久久久久 | 成人性生交大片免费观看网站 | 一区二区三区电影 | 人人插人人做 | 黄色录像av | 99久久久成人国产精品 | 久久免费视频6 | 亚洲欧洲美洲av | 成人久久视频 | 在线观看日本高清mv视频 | 在线观看免费黄色 | 亚洲精品xxxx | 久热电影 | 麻豆视频在线观看免费 | 一区二区中文字幕在线观看 | 日韩三级成人 | 综合在线观看色 | 91桃花视频 | 欧美精品久久久久久久久久白贞 | 草在线视频 | 美女久久久久久久久久 | 欧美成a人片在线观看久 | 免费日韩电影 | 在线草| 1000部国产精品成人观看 | 九九日九九操 | 人人插人人 | 91av在线看| 久久免费一 | av电影在线免费观看 | 曰本免费av | 99精品国产一区二区三区麻豆 | 日韩精品三区四区 | 国产九九热 | 日韩大陆欧美高清视频区 | 91视频在线观看下载 | www最近高清中文国语在线观看 | 97看片| 综合婷婷丁香 | 精品国产aⅴ一区二区三区 在线直播av | 夜夜骑天天操 | 夜添久久精品亚洲国产精品 | 久久综合九色九九 | 精品一区二区三区香蕉蜜桃 | 伊人开心激情 | 夜夜夜 | av福利免费 | 免费视频久久久久久久 | 色婷婷亚洲精品 | 日日麻批40分钟视频免费观看 | 青草草在线视频 | 亚洲播播| 日韩精品一区不卡 | 久久国产美女 | 色久五月 | 日韩电影一区二区在线 | 免费看国产精品 | 亚洲观看黄色网 | 五月天,com | 日b黄色片| 国产一级免费播放 | 日韩在线视频网站 | 日韩在线资源 | 成在线播放| 国产91在线看| 国产精品久久久久久久久久久杏吧 | 超碰在线观看av.com | 国产专区在线播放 | 欧美日韩中文字幕在线视频 | 999久久 | 欧美日韩亚洲在线 | 国产精品乱码高清在线看 | 在线观看免费成人av | 中文字幕久久精品亚洲乱码 | 久久久久久片 | 亚洲激精日韩激精欧美精品 | 日韩在线观看一区二区三区 | 亚洲国产免费看 | 久久综合射 | 成人99免费视频 | 天天干天天拍天天操天天拍 | 国产精品一区在线 | 国产成人精品电影久久久 | 久久久国产精品人人片99精片欧美一 | 91精品国产乱码久久 | 91视频国产高清 | 国产69精品久久app免费版 | av在线成人 | 欧美日韩精品在线播放 | 欧美激情操 | 国产精品6 | 中文字幕高清免费日韩视频在线 | 亚洲va欧美va人人爽春色影视 | 国产高清免费av | av在线小说 | 日韩在线资源 | 西西444www高清大胆 | 青青射| 精品国产一区二区三区男人吃奶 | 午夜国产一区二区 | 久久 精品一区 | 99色视频在线| 久久天天躁夜夜躁狠狠85麻豆 | 国内精品久久久久国产 | 亚洲激情 在线 | 五月天激情电影 | 国产传媒中文字幕 | 久久人人97超碰国产公开结果 | 免费观看的黄色片 | 在线视频免费观看 | 色播五月婷婷 | 亚洲高清网站 | 中文字幕av在线 | 中日韩男男gay无套 日韩精品一区二区三区高清免费 | 91九色在线观看 | 在线成人性视频 | 激情av一区二区 | 黄色aa久久| 日韩欧美高清视频在线观看 | 国产精品午夜8888 | 亚洲国产精久久久久久久 | 日韩美女免费线视频 | 在线视频99| 97人人模人人爽人人喊中文字 | 在线日韩精品视频 | 久久精品网站免费观看 | 黄污视频网站大全 | av网站播放 | 一本—道久久a久久精品蜜桃 | 福利二区视频 | 在线小视频| 国内一区二区视频 | 亚洲精品一区中文字幕乱码 | 最近最新mv字幕免费观看 | 国产一区二区三精品久久久无广告 | 日韩av影视在线观看 | 亚洲精品动漫在线 | 少妇av网| 四虎永久免费在线观看 | 久久综合五月 | 日韩黄在线观看 | 毛片网站在线观看 | 久久99电影| 97电影网手机版 | 国产成人精品久久亚洲高清不卡 | 日日日天天天 | 亚洲国产欧美在线人成大黄瓜 | 四虎国产精品成人免费影视 | 一区二区三区高清在线观看 | 国产爽视频 | 超碰夜夜 | 国产精品午夜久久 | 激情综合色播五月 | 日韩欧美精品一区二区三区经典 | 国产精品久久久999 国产91九色视频 | 久久国产一区 | 国产亚洲观看 | 国产一区欧美一区 | 黄色大片中国 | 成人免费在线视频观看 | 黄a在线看| 国产视频日韩视频欧美视频 | 天天操天天操天天操天天操天天操 | 色姑娘综合网 | 国产福利一区二区三区在线观看 | 国产一区精品在线 | 亚洲一区视频在线播放 | 亚洲在线成人精品 | 亚洲精品自拍视频在线观看 | 久久久国产在线视频 | 伊人小视频 | 九七视频在线 | 国产99久久久欧美黑人 | 欧美韩日视频 | 国产一线二线三线性视频 | 国产91粉嫩白浆在线观看 | www.com.日本一级| 黄色av电影免费观看 | 欧美不卡视频在线 | 欧美高清成人 | 亚洲永久精品在线 | 夜色成人av | 人人精品 | 狠狠躁夜夜a产精品视频 | 久久婷婷国产色一区二区三区 | 91精品国产综合久久婷婷香蕉 | 99高清视频有精品视频 | 国产精品久久久久国产a级 激情综合中文娱乐网 | 伊人看片 | 就要色综合 | 香蕉视频网址 | 免费看短 | 婷婷在线精品视频 | 日韩精品短视频 | 91av在线不卡| 天堂av在线7 | 亚洲一区二区天堂 | 国产直播av | 成人在线播放免费观看 | 午夜 在线| 午夜性生活 | 日韩午夜在线观看 | 九九热在线精品视频 | 91av在线国产 | 久久激情精品 | 国产精品毛片久久 | 综合在线观看色 | 在线va视频 | 尤物97国产精品久久精品国产 | 99精品国产兔费观看久久99 | 久久亚洲区| 五月婷婷黄色网 | 毛片区| 国产中的精品av小宝探花 | 婷婷午夜 | 伊人天天操 | 日本深夜福利视频 | 国产亚洲成av人片在线观看桃 | 欧美日韩免费观看一区二区三区 | 2021av在线 | 久久国产91| 亚洲电影在线看 | 在线观看免费视频你懂的 | 亚洲精品黄色在线观看 | 国产精品永久免费视频 | 国产麻豆果冻传媒在线观看 | 欧美精品久久久久久久久免 | 日韩中文字幕国产精品 | 操夜夜操 | 在线激情影院一区 | 久久99精品国产99久久6尤 | 女人魂免费观看 | 国产九色视频在线观看 | 欧美日韩大片在线观看 | 国产视频1区2区3区 久久夜视频 | 色综合欧洲 | 久久久亚洲精华液 | 99久久精品免费一区 | 日韩av一区二区在线播放 | 久久久久久久久久久久电影 | 天堂av在线中文在线 | 又黄又刺激视频 | 五月婷婷爱 | 亚洲尺码电影av久久 | 久草在线视频新 | 国产精品久久久久三级 | 亚洲精品中文字幕在线观看 | 成人在线黄色 | 成人黄色大片网站 | 网址你懂的在线观看 | 精品毛片久久久久久 | 中文字幕在线久一本久 | 五月丁色 | 国产精品av在线 | 综合久久网站 | 日韩精品网址 | 在线免费看黄网站 | 91精品国产三级a在线观看 | 黄色1级大片 | 在线色亚洲 | 天天天操天天天干 | 亚洲黄色成人网 | 九九九九精品 | 夜夜躁狠狠躁日日躁视频黑人 | 精品视频久久久久久 | 亚洲国产精品传媒在线观看 | 色综合久久88色综合天天6 | 91手机在线看片 | 欧美久久99| 国产成人三级三级三级97 | 国产91免费在线观看 | 香蕉久草 | 成人亚洲免费 | 国产成人精品日本亚洲999 | 亚州免费视频 | 一区二区三区在线观看中文字幕 | 日韩极品在线 | 久久精品久久久久 | 一级黄色片在线免费看 | 国产午夜三级一区二区三桃花影视 | 深夜男人影院 | 欧美精品视 | 夜夜骑天天操 | 九九亚洲视频 | 国产精品毛片久久久 | 国产成人三级在线观看 | 久久精品一区二区三区中文字幕 | 久久这里只有精品久久 | 久久久久9999亚洲精品 | 国产精品字幕 | 久久成人免费 | 西西大胆免费视频 | av片一区二区| 久久国产精品免费观看 | 九九视频网站 | 国内精品久久久久久中文字幕 | av视屏在线 | 午夜婷婷网 | 狠狠色香婷婷久久亚洲精品 | 超碰在线最新地址 | 成年人在线观看 | 高清免费在线视频 | 在线直播av| 日韩一区二区久久 | 成人a级黄色片 | 国产视频资源在线观看 | 日本精品视频一区二区 | 精品一区二区在线免费观看 | 成人欧美一区二区三区在线观看 | 日韩免费电影网站 | 亚洲综合网站在线观看 | 黄色软件在线观看 | 在线观看国产一区 | 久久久精品在线观看 | 人人澡超碰碰 | 亚洲作爱视频 | 夜夜躁狠狠躁日日躁视频黑人 | 国产真实精品久久二三区 | 久久第四色 | 99热这里只有精品免费 | 9在线观看免费高清完整版在线观看明 | 精品国产aⅴ麻豆 | 米奇影视7777 | 五月天久久综合 | 婷婷丁香激情网 | 亚洲午夜激情网 | 91在线在线观看 | 久久色在线播放 | 天天射天天爽 | 夜夜狠狠| 日韩精品视频在线免费观看 | 一区电影| 久久久久久久久精 | www狠狠操| 97成人在线免费视频 | 不卡在线一区 | 亚洲午夜精品在线观看 | 香蕉97视频观看在线观看 | 激情丁香5月 | 国产乱码精品一区二区三区介绍 | 欧美久久影院 | 久久永久视频 | 天天射天天干天天 | 欧美analxxxx| 欧美成人黄 | 色综合天天做天天爱 | 国产99一区 | 国产精品久久在线观看 | 亚洲欧美国产视频 | 亚洲天堂首页 | 久久看免费视频 | 亚洲精品中文在线 | 色欧美成人精品a∨在线观看 | 久久午夜精品视频 | 久久综合激情 | 国产精品丝袜在线 | 国产一区二区三区在线免费观看 | 免费看片色 | 日韩在线观看av | 日韩女同av | 精品亚洲成人 | 欧美极品一区二区三区 | www五月| 久久精品爱视频 | 日本黄区免费视频观看 | a在线v| 久久人人97超碰com | 日韩在线观看不卡 | 国产精品久久久久久久久费观看 | 婷婷久月 | 欧美激情精品久久 | 欧美日韩免费观看一区=区三区 | 中文在线字幕免 | av电影亚洲 | 亚洲播放一区 | 玖玖在线视频观看 | 天天人人 | 天天拍天天干 | 日韩av电影免费在线观看 | 激情视频综合网 | 中文字幕一区在线观看视频 | 国产一二三在线视频 | 成人午夜久久 | 国产精品成人久久久久久久 | 黄色小说18 | 亚洲一区网 | 黄av免费在线观看 | 色综合久久88色综合天天免费 | 色综合久久久 | 黄色性av| 深爱开心激情网 | 五月天综合在线 | 九九热在线观看视频 | 97福利视频 | 999成人网 | 亚洲国产综合在线 | 久热只有精品 | 黄污在线观看 | 中文字幕高清有码 | 成人国产精品免费观看 | 久久夜色精品国产欧美乱极品 | 日韩精品免费一区二区在线观看 | 成人xxxx| 欧洲一区二区在线观看 | 久久久一本精品99久久精品 | 最近久乱中文字幕 | 五月婷在线观看 | 激情视频国产 | 91试看| 99精品国产免费久久久久久下载 | 特黄特黄的视频 | 欧美久久久久久久久 | 少妇做爰k8经典 | 久久久九九 | 午夜.dj高清免费观看视频 | www日韩| 人人添人人澡人人澡人人人爽 | 欧美最猛性xxx | 国产精品9999 | 国产午夜精品一区二区三区 | 欧美另类高潮 | 五月激情丁香图片 | 国产精品麻豆果冻传媒在线播放 | 亚洲jizzjizz日本少妇 | 久久免费在线观看视频 | 高清不卡毛片 | 日韩久久久久久久久久 | 一二区精品 | 99精品视频在线观看视频 | 日韩免费看视频 | 中文字幕在线观看免费高清完整版 | 国产一区网 | 国内精品99| 中文字幕日韩在线播放 | 美女久久视频 | 国产成人精品一区二区三区 | 中字幕视频在线永久在线观看免费 | 青青草在久久免费久久免费 | 在线播放亚洲 | 精品国产一区二区三区免费 | 午夜精品成人一区二区三区 | 人人干干人人 | 国产精品伦一区二区三区视频 | 天天射综合网视频 | 亚洲精品久久久久999中文字幕 | 狠狠干我| 国产视频网站在线观看 | 在线观看黄色大片 | 免费色婷婷 | 成年人免费看的视频 | 免费亚洲片 | 麻豆精品在线视频 | 亚洲乱码精品久久久 | 久久激情久久 | 99久热精品| 日本免费久久高清视频 | 看全黄大色黄大片 | 成人全视频免费观看在线看 | 国产黄色看片 | 久久视频免费在线观看 | 97成人精品视频在线播放 | av再线观看 | 成人性生交视频 | 激情五月视频 | 日韩动态视频 | 5月丁香婷婷综合 | 亚洲高清视频在线观看 | 久久福利| 免费毛片一区二区三区久久久 | 国产精品黄色影片导航在线观看 | 久久特级毛片 | 在线国产一区 | 一区二区三区在线免费 | 国产精品涩涩屋www在线观看 | 香蕉视频久久久 | 色老板在线 | 婷婷六月色 | 久久99久久99精品免观看软件 | 精品国产aⅴ一区二区三区 在线直播av | 色综合天天狠狠 | 国产视频美女 | 99视频导航| 成年人网站免费在线观看 | av短片在线观看 | 97av在线视频免费播放 | 99精品视频播放 | 福利一区在线视频 | 四虎www. | 亚洲精品视频中文字幕 | 色鬼综合网 | 久久综合狠狠综合久久综合88 | 免费网站观看www在线观看 | 91久久精品日日躁夜夜躁国产 | 在线观看免费av网 | 东方av免费在线观看 | 国产在线视频导航 | 日本一区二区高清不卡 | 欧美极品少妇xxxxⅹ欧美极品少妇xxxx亚洲精品 | 99九九99九九九视频精品 | 久久综合免费视频 | 久久久免费高清视频 | 日韩免费久久 | 精品一区二区亚洲 | 麻豆成人小视频 | 日本精品一区二区三区在线播放视频 | 婷婷色综合网 | a黄色影院| 最近更新好看的中文字幕 | 免费的黄色的网站 | 91丨九色丨丝袜 | 国产高清视频在线观看 | 五月婷婷综 | 日韩电影一区二区在线 | 欧美日比视频 | 一级精品视频在线观看宜春院 | 麻豆精品在线 | 女人18毛片90分钟 | 亚洲在线免费视频 | 国产中文视 | 久热国产视频 | 亚洲 欧美 91 | 夜夜骑天天操 | 91夫妻自拍 | 国产精品 日韩 欧美 | 久久99精品国产麻豆宅宅 | 在线免费观看麻豆视频 | 丰满少妇麻豆av | 久久久久免费精品视频 | 成人国产精品一区二区 | 午夜国产一区 | a黄色片在线观看 | 日本黄色一级电影 | 欧美精品在线一区二区 | 亚洲日本国产 | 97精品国产aⅴ | 国产又粗又猛又黄视频 | 欧美一区二区在线 | 日韩在线视 | 久操视频在线免费看 | 美国av大片 | 九九热在线播放 | 亚洲区精品| 日本精品午夜 | 久久艹在线 | 91麻豆福利 | 97在线看| 在线观看视频99 | 天堂视频一区 | 亚洲精品美女在线观看播放 | 国产色网站 | 人人dvd| 99在线观看 | 久久久香蕉视频 | 免费视频成人 | 久久国产精品免费一区 | 欧美日韩中文字幕综合视频 | 国产精品第十页 | 成人网在线免费视频 | 色综合天天色综合 | 色婷婷狠狠五月综合天色拍 | 最近中文字幕免费大全 | 一区精品在线 | 91成人破解版| 日本精品va在线观看 | 狠狠狠狠干 | 九色porny真实丨国产18 | 免费成人结看片 | 日本久久成人中文字幕电影 | 人人草在线观看 | www.色婷婷.com | 91豆花在线| 国产色影院 | 色www精品视频在线观看 | 久久久一本精品99久久精品66 | 九九热久久免费视频 | 在线成人免费电影 | 国产精品视频免费 | 婷婷日| 欧美成人h版电影 | 国产成人免费av电影 | 色综合天天色 | 免费看片网址 | 狠狠干狠狠插 | 国产一区在线播放 | 国产成人av电影在线 | 国产在线观看91 | 成人av中文字幕 | 国产大片免费久久 | 97操碰 | 午夜av免费在线观看 | 婷婷丁香久久五月婷婷 | 国产99在线免费 | 狠狠狠狠狠狠操 | 久久成人国产精品入口 | 亚洲欧美国产精品18p | 国产伦精品一区二区三区照片91 | 亚洲精品观看 | 成人免费xxxxxx视频 | 国产麻豆精品一区二区 | 国产二区视频在线观看 | 国产在线观看,日本 | 色视频成人在线观看免 | 精品一二三四视频 | 国产在线a视频 | 婷婷干五月 | 99久久久国产精品美女 | 日韩欧美精选 | 久久欧洲视频 | 91免费观看网站 | 夜夜骑日日 | 深爱婷婷久久综合 | 免费一级特黄毛大片 | 婷婷中文字幕综合 | 国产亚洲精品xxoo | 激情综合六月 | www.在线看片.com| 干综合网 | 久久久久久久久毛片精品 | 免费福利片2019潦草影视午夜 | 久久久久久久久久久福利 | 欧美a视频 | 亚洲视频在线视频 | 日韩欧美视频在线观看免费 | 最新国产福利 | 日本韩国精品一区二区在线观看 | 日日操天天操夜夜操 | 国产精品久久久久久久久软件 | 黄色成人小视频 | 中文字幕av在线不卡 | 蜜臀久久99精品久久久无需会员 | 国产一区在线视频播放 | 免费观看性生活大片 | 91精品少妇偷拍99 | 在线免费看黄色 | 国产高清视频免费最新在线 | 免费精品人在线二线三线 | 久久精品日产第一区二区三区乱码 | 色综合久久88色综合天天免费 | 国产又粗又猛又色又黄视频 | 在线导航av | 日日操操操 | 久久这里只有精品1 | 天天操操操操操 | 午夜精品久久 | 欧美另类网站 | 欧美日韩精 | 中文字幕91视频 | 亚洲精品小视频 | 国产vs久久 | 日韩久久午夜一级啪啪 | 色激情在线 | 人人爱天天操 | 亚洲欧美成人网 | 91精品啪在线观看国产 | 亚洲黄色免费在线 | 在线之家免费在线观看电影 | 97视频在线看 | 欧美日韩一区二区免费在线观看 | 中文字幕乱偷在线 | 日韩电影在线一区 | 亚洲精品乱码久久久久久高潮 | 亚洲成aⅴ人在线观看 | 日韩视频1 | av在线影片| 69久久夜色精品国产69 | 国产黄| 日日干干| 国产精品综合久久久 | 亚洲一区二区精品视频 | 91在线视频| 天天综合网在线 | 91九色porny蝌蚪主页 | 99久久999久久久精玫瑰 | 日韩电影中文字幕在线 | 久久理论片 | 91精品网站 | 日本三级吹潮在线 | 六月婷婷色| 国产精品9999久久久久仙踪林 | 欧美一级在线看 | 精品国产诱惑 | 亚洲三级在线 | 狠狠躁日日躁狂躁夜夜躁av | 国产视频久久久久 | 四虎在线观看 | 国产精品久久久久久久久婷婷 | 狠狠的干狠狠的操 | 免费成人在线电影 | 国产xvideos免费视频播放 | 最近中文字幕完整高清 | 国产亚洲视频在线 | 热久久视久久精品18亚洲精品 | 黄色三级免费看 | 亚洲国产精品久久久久久 | 996久久国产精品线观看 | 欧美日一级片 | 久久天天躁夜夜躁狠狠躁2022 | 成人a视频片观看免费 | 午夜性生活 | 五月婷婷激情综合 | 久久精品日韩 | 免费视频黄 | 国产无遮挡又黄又爽馒头漫画 | 99re久久精品国产 | 99久久精品国产系列 | 亚洲成人网在线 | 日韩网站视频 | www亚洲视频| 黄网站色成年免费观看 | 丁香婷婷激情 | 中日韩三级视频 | 欧美老少交 | 色操插| www.香蕉视频 | 曰本三级在线 | 国产一级91 | 97av精品 | 久久免费成人 | 五月婷婷综合在线视频 | 激情影院在线 | 日韩精品久久久久久久电影99爱 | 亚洲永久精品在线 | 亚洲成人av在线播放 | 国产黄色一级大片 | 国产美女视频免费观看的网站 | 国产资源免费在线观看 | 99色在线播放| 国色天香av | 天天色播 | 人人添人人澡人人澡人人人爽 | 久久免费视频网 | 蜜臀av性久久久久av蜜臀三区 |