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

ES6:下一版本的JavaScript的新特性

開發 前端
通過使用轉換器,所有的代碼實際上是轉換成了ES5。而瀏覽器一直在添加新特性,所以,即便瀏覽器完全支持某個特定的ES6特性,最后還是運行 ES5兼容版本的代碼,這樣可能表現會更糟糕。你可以期待,在你需要兼容的瀏覽器和運行環境里,所有的ES6特性最終都會被支持。

你可能已經聽說過EMCAScript6(ES6)了,這是下一個版本的Javascript,它包含了一些很棒的新特性。這些特性擁有不同程度的復雜性,對于簡單的腳本和復雜的應用程序都非常的有用。本文將盤點一些ES6的新特性,這些特性都可以用在你日常的編碼中。

請注意,只有現代瀏覽器才能支持這些新的ES6特性,雖然瀏覽器的支持各不相同。如果你需要兼容那些不支持ES6新特性的舊瀏覽器,我也會談談關于這方面的解決方案。

在本文中,大部分示例代碼都會帶有“運行代碼”的鏈接,讀者可以點擊鏈接運行示例。

[[162264]]

變量

LET

通常我們使用var關鍵字來聲明變量,現在我們同樣可以使用let,它們之間的細微差別在于作用域。使用var聲明變量時,該變量的作用域是其最近的函數,而使用let聲明變量,它的作用域只在包含它的塊。

  1. if(true) { 
  2.    let x = 1
  3. console.log(x); // undefined 

這樣可以讓代碼更加干凈整潔,可以減少無用的變量。

看看下面這個經典的數組循環:

  1. for(let i = 0, l = list.length; i < l; i++) { 
  2.    // do something with list[i] 
  3.  
  4. console.log(i); // undefined 

舉個例子,經常會有人使用變量j在同一作用域中的另外一個循環中。但是使用let聲明變量,你可以很安全地再聲明一次,因為它只在自己塊級作用域內定義和有效。

CONST

聲明塊級作用域內的變量的另一種方法是使用const。使用const,你可以聲明一個只讀的值,必須直接指定一個值,如果嘗試改變它的值或者沒有立即指定一個值,就會得到下面的錯誤:

  1. const MY_CONSTANT = 1
  2. MY_CONSTANT = 2 // Error 
  3. const SOME_CONST; // Error 

注意,你還是可以修改對象的屬性或者數組的成員

  1. const MY_CONSTANT = 1
  2. MY_CONSTANT = 2 // Error 
  3. const SOME_CONST; // Error 

箭頭函數

箭頭函數對于Javascript來說是一個非常棒的補充,它可以讓代碼更加精簡。我們首先來介紹箭頭函數,在稍后的其他例子中就會使用到它的優點。下面的代碼展示了一個箭頭函數和我們熟悉的ES5風格的兩種寫法的函數:

  1. const MY_CONSTANT = 1
  2. MY_CONSTANT = 2 // Error 
  3. const SOME_CONST; // Error 

運行代碼

我們來看看箭頭函數的語法,其中沒有function關鍵字,剩下的就是0個或多個參數、(=>)箭頭和函數表達式。注意:return語句將隱式地被添加進來。

如果是0個或多個參數,必須添加括號:

  1. // No arguments 
  2. books.map( () => 1 ); // [1, 1] 
  3. // Multiple arguments 
  4. [1,2].map( (n, index) => n * index ); // [0, 2] 

如果需要更多的邏輯或者空白區域,可以將函數表達式放在({…})塊中。

  1. let result = [12345].map( n => { 
  2.    n = n % 3
  3.    return n; 
  4. }); 

運行代碼

箭頭函數不僅僅意味著更少的字符,它的行為也不同于常規的函數。一個箭頭函數從它的外界上下文中繼承this和arguments關鍵字。這表示你 可以擺脫以前那些難看的語句,比如var that = this,而且不需要綁定函數到正確的上下文中。下面有一個例子(注意:this.title等同于ES5版本的that.title):

  1. let book = { 
  2.    title: 'X'
  3.    sellers: ['A''B'], 
  4.    printSellers() { 
  5.       this.sellers.forEach(seller => console.log(seller + ' sells ' + this.title)); 
  6.    } 
  7.  
  8. // ES5 equivalent: 
  9. var book = { 
  10.    title: 'X'
  11.    sellers: ['A''B'], 
  12.    printSellers: function() { 
  13.       var that = this
  14.       this.sellers.forEach(function(seller) { 
  15.          console.log(seller + ' sells ' + that.title) 
  16.       }) 
  17.    } 

運行代碼

字符串

方法

String的prototype中添加了幾個方便的方法,大部分是indexOf方法的變通:

  1. 'my string'.startsWith('my'); //true 
  2. 'my string'.endsWith('my'); // false 
  3. 'my string'.includes('str'); // true 

簡單有效!另外,還添加了一個方便創建重復字符串的方法:

  1. 'my '.repeat(3); // 'my my my ' 

模板字符串

模板字符串提供了一個簡潔的方式去創建字符串和實現字符串插值。你可能已經熟悉了它的語法,模板字符串基于美元符號和花括號 ${…},并且要使用反引號(`)將其包圍。

下面是一個簡單的演示:

  1. let name = 'John'
  2.    apples = 5
  3.    pears = 7
  4.    bananas = function() { return 3; } 
  5.  
  6. console.log(`This is ${name}.`); 
  7.  
  8. console.log(`He carries ${apples} apples, ${pears} pears, and ${bananas()} bananas.`); 
  9.  
  10. // ES5 equivalent: 
  11. console.log('He carries ' + apples + ' apples, ' + pears + ' pears, and ' + bananas() +' bananas.'); 

上面的示例中,和ES5相比較,模板字符串僅僅只是方便字符串的串聯。模板字符串通常應用于多行字符串,請記住,空白是字符串的一部分。

  1. let x = `1... 
  2. 2... 
  3. 3 lines long!`; // Yay 
  4.  
  5. // ES5 equivalents: 
  6. var x = "1...\n" + 
  7. "2...\n" + 
  8. "3 lines long!"
  9.  
  10. var x = "1...\n2...\n3 lines long!"

數組

Array對象現在新增了一些靜態方法以及prototype上的一些方法。

第一、Array.from方法從類數組或可迭代對象上創建Array的實例。類數組對象的例子包括:

1、函數中的arguments對象
2、document.getElementsByTagName放回的一個nodeList對象
3、新的Map和Set數據結構

  1. let itemElements = document.querySelectorAll('.items'); 
  2. let items = Array.from(itemElements); 
  3. items.forEach(function(element) { 
  4.     console.log(element.nodeType) 
  5. }); 
  6.  
  7. // A workaround often used in ES5: 
  8. let items = Array.prototype.slice.call(itemElements); 

上面的示例中,可以看出items數組擁有forEach方法,但是在itemElements集合中,這個方法是不可用的。

Array.from有一個有趣的特性是它的第二個可選參數mapFunction,這個參數允許在單次調用中創建一個新的映射數組。

  1. let navElements = document.querySelectorAll('nav li'); 
  2. let navTitles = Array.from(navElements, el => el.textContent); 

第二、Array.of方法,這個方法的行為有點像Array的構造函數,它修復了傳遞單個數字參數時的特殊情況,所以Array.of相比于new Array()更好。不過大多數情況下,我們推薦使用數組字面量。

  1. let x = new Array(3); // [undefined, undefined, undefined] 
  2. let y = Array.of(8); // [8] 
  3. let z = [123]; // Array literal 

最后,Array的prototype中添加了幾個方法,其中的find方法我覺得Javascript開發者將會非常喜歡。

1、find方法:獲取回調函數return true的第一個元素。
2、findIndex方法:獲取回調函數return true的第一個元素的索引
3、fill方法:根據給定的參數重寫數組的元素

  1. [51108].find(n => n === 10// 10 
  2. [51108].findIndex(n => n === 10// 2 
  3. [000].fill(7// [7, 7, 7] 
  4. [00000].fill(713// [0, 7, 7, 7, 0] 

Math

Math對象也添加了幾個方法。

1、Math.sign 返回一個數字的符號,有1,-1或0三個值分別表示正值,負值或0
2、Math.trunc 返回一個數字去掉小數位數后的數
3、Math.cbrt 返回一個數字的立方根

  1. [51108].find(n => n === 10// 10 
  2. [51108].findIndex(n => n === 10// 2 
  3. [000].fill(7// [7, 7, 7] 
  4. [00000].fill(713// [0, 7, 7, 7, 0] 

如果你想要學習更多的新的Math內容,點擊new number and math features in ES6

擴展操作符

擴展操作符(…)是一個非常方便的語法,它用于在數組的特殊的地方擴展元素,比如函數調用中的參數。下面展示一些例子來說明它的用處。

首先,我們來看看如何通過另一個數組來擴展數組的元素:

  1. let values = [124]; 
  2. let some = [...values, 8]; // [1, 2, 4, 8] 
  3. let more = [...values, 8, ...values]; // [1, 2, 4, 8, 1, 2, 4] 
  4. // ES5 equivalent: 
  5. let values = [124]; 
  6. // Iterate, push, sweat, repeat... 
  7. // Iterate, push, sweat, repeat... 

當使用參數調用函數時,擴展操作符同樣非常強大。

  1. let values = [124]; 
  2. doSomething(...values); 
  3. function doSomething(x, y, z) { 
  4.    // x = 1, y = 2, z = 4 
  5. // ES5 equivalent: 
  6. doSomething.apply(null, values); 

正如你所看到的,這避免了我們經常使用的fn.apply()這種委婉曲折的方式。擴展操作符語法非常靈活,因為它可以在參數列表的任何地方使用,即下面的調用方式也會產生一樣的結果:

  1. let values = [24]; 
  2. doSomething(1, ...values); 

我們已經將擴展操作符應用到Array和arguents中了。實際上,所有的可迭代的對象都可以應用擴展操作符,比如NodeList:

  1. let form = document.querySelector('#my-form'), 
  2.    inputs = form.querySelectorAll('input'), 
  3.    selects = form.querySelectorAll('select'); 
  4. let allTheThings = [form, ...inputs, ...selects]; 

現在allTheThings變成一個扁平的數組,其中包含form節點,input和select的子節點。

解構

解構提供了一個便捷的方式來從對象或數組中提取數據。下面給了一個使用數組的典型例子。

  1. let [x, y] = [12]; // x = 1, y = 2 
  2. // ES5 equivalent: 
  3. var arr = [12]; 
  4. var x = arr[0]; 
  5. var y = arr[1]; 

使用這種語法,可以一次性指定多個變量。還有另外一個作用是可以很簡單的交換兩個變量值。

  1. let x = 1
  2.    y = 2
  3. [x, y] = [y, x]; // x = 2, y = 1 

解構也能用于對象上,要保證key值匹配。

  1. let obj = {x: 1, y: 2}; 
  2. let {x, y} = obj; // x = 1, y = 2 

也可以通過這個機制來修改變量的名稱

  1. let obj = {x: 1, y: 2}; 
  2. let {x: a, y: b} = obj; // a = 1, b = 2 

還有另外一個有趣的用法是模擬多個返回值

  1. function doSomething() { 
  2.    return [12
  3. let [x, y] = doSomething(); // x = 1, y = 2 

解構同樣也可以指定argument對象的默認值,通過字面量對象,可以模擬命名參數。

  1. function doSomething({y = 1, z = 0}) { 
  2.    console.log(y, z); 
  3. doSomething({y: 2}); 

參數

默認值

在ES6中,是可以給函數參數定義一個默認值的,語法如下:

  1. function doSomething(x, y = 2) { 
  2.    return x * y; 
  3. doSomething(5); // 10 
  4. doSomething(5, undefined); // 10 
  5. doSomething(53); // 15 

這樣看起來就簡潔多了,如果是ES5之前的寫法,我們肯定要補充一些參數:

  1. function doSomething(x, y) { 
  2.    y = y === undefined ? 2 : y; 
  3.    return x * y; 

undefined或者無參時將會觸發參數的默認值。

剩余不定參數

我們已經看過了擴展操作符,不定參數與其非常相似。不定參數也使用…語法,它允許將函數末端的參數存儲在一個數組里面。

  1. function doSomething(x, ...remaining) { 
  2.    return x * remaining.length; 
  3. doSomething(5000); // 15 

模塊

模塊是Javascript中非常受歡迎的一個補充,我認為它是ES6中非常值得挖掘的一個特性。

現如今,任何重要的JS項目都會使用某種模塊系統-可能是“暴露型模塊模式”或者更廣泛的AMD和Common.js。但是,瀏覽器是沒有任何模塊 系統的特性的,總是需要為AMD或CommonJS模塊構建加載模塊,處理這些的工具包括RequireJS,Browserify和Webpack。

ES6規范中同時包含了模塊中的語法和加載機制。如果你想要在以后使用模塊,應該使用下面的語法。現代的構建工具可以通過插件支持這種格式,所以我們可以盡管去使用它。(不用擔心,我們在后面的“Transpilation”章節中會討論這個問題)。

現在,在ES6的模塊語法中,模塊被設計成使用export和import兩個關鍵字,我們來看看示例中的兩個模塊。

 

  1. // lib/math.js 
  2. export function sum(x, y) { 
  3.    return x + y; 
  4. export var pi = 3.141593
  5.  
  6. // app.js 
  7. import { sum, pi } from "lib/math"
  8. console.log('2π = ' + sum(pi, pi)); 

如你所見,代碼中有多個export語句。每一個都必須顯式地聲明輸出的值,在這個例子中,就是function和var。

示例中的import語句使用了一個語法(類似于解構)來顯式地定義了輸出的內容。要將整個模塊一起輸出,可以使用通配符“*”,結合as關鍵字給模塊一個本地名稱。

  1. // app.js 
  2. import * as math from "lib/math"
  3. console.log('2π = ' + math.sum(math.pi, math.pi)); 

模塊系統有一個默認模塊,它也可以是函數。要導出模塊內的默認值,需要提供一個本地名稱:

  1. // lib/my-fn.js 
  2. export default function() { 
  3.    console.log('echo echo'); 
  4. // app.js 
  5. import doSomething from 'lib/my-fn'
  6. doSomething(); 

注意:import語句是同步的,但是它會等到所有依賴的加載完畢才會執行。

Classes

類是ES6中討論得很多的一個特性。一些人類違反了JS的原型性質,而其他人覺得這降低了初學者和來自其他開發語言的開發者的入門門檻,并且能夠幫助他們編寫大規模應用。無論如何,它都是ES6中的一部分,我們簡單地介紹一下。

我們通過class和constructor關鍵字構建類,下面是一個簡短的示例:

  1. class Vehicle { 
  2.    constructor(name) { 
  3.       this.name = name; 
  4.       this.kind = 'vehicle'
  5.    } 
  6.    getName() { 
  7.       return this.name; 
  8.    }   
  9. // Create an instance 
  10. let myVehicle = new Vehicle('rocky'); 

注意:類的定義并不是一個普通的對象,因此類成員之間沒有使用逗號來分隔。

從一個類創建實例必須使用new關鍵字,而從一個基類繼承則使用extends:

  1. class Car extends Vehicle { 
  2.    constructor(name) { 
  3.       super(name); 
  4.       this.kind = 'car' 
  5.    } 
  6. let myCar = new Car('bumpy'); 
  7. myCar.getName(); // 'bumpy' 
  8. myCar instanceof Car; // true 
  9. myCar instanceof Vehicle; //true 

在派生類中,可以使用super關鍵字來訪問基類的構造函數或方法:

1、要訪問基類構造函數,使用super()
2、要訪問基類中的方法,是用super.getName()

類還有更多的用法,如果想要深入地學習這方面,可以看看Classes in ECMAScript6

Symbol

Symbol是一種新的原始數據類型,和Number、String一樣。我們可以使用symbol來給對象創建唯一的ID或唯一的常量。

  1. const MY_CONSTANT = Symbol(); 
  2. let obj = {}; 
  3. obj[MY_CONSTANT] = 1

注意:Object.getOwnPropertyNames方法不會返回Symbol生成鍵值,在for..in循環 中,Object.keys()和JSON.stringify()也是不可見的,這是與普通的字符串key值的區別所在。我們可以通過 Object.getOwnPropertySymbols()獲取對象中的symbol數組。

因為不可變的特點,Symbols常常與const一起配合使用:

  1. const CHINESE = Symbol(); 
  2. const ENGLISH = Symbol(); 
  3. const SPANISH = Symbol(); 
  4. switch(language) { 
  5.    case CHINESE: 
  6.       // 
  7.       break
  8.    case ENGLISH: 
  9.       // 
  10.       break
  11.    case SPANISH: 
  12.       // 
  13.       break
  14.    default
  15.       // 
  16.       break

也可以給Symbol一段字符串來描述,雖然無法通過字符串來訪問symbol本身,但是調試的時候很有用。

  1. const CONST_1 = Symbol('my symbol'); 
  2. const CONST_2 = Symbol('my symbol'); 
  3. typeof CONST_1 === 'symbol'// true 
  4. CONST_1 === CONST_2; // false 

想要學習更多的symbol內容可以查看symbol primitive

Transpilation

現在我們可以使用ES6來寫代碼了。前面介紹中提到的瀏覽器還沒有廣泛地支持ES6的特性,而且支持性各不相同。你的用戶使用的瀏覽器很有可能不完 全懂得解析ES6代碼。所以我們要將這些代碼轉換成上一個版本的Javascript(ES5),它們可以很好地運行在現代瀏覽器上,這種轉換通常被稱為 Transpilation。在瀏覽器支持ES6之前,都需要在我們的應用程序中做這一項轉換。

開始

轉換代碼并不困難,可以直接通過命令行轉換代碼,或者在Grunt和Gulp中作為一個Task包含在插件里面。有很多轉換代碼的方案,比如Babel,Traceur和TypeScript。可以看看這個使用Babel的例子many ways to start using ES6,很多ES6的特性都會進行處理。

那我們如何使用ES6呢?首先,根據你想要使用的ES6特性和你需要支持的瀏覽器或運行環境(比如Node.js),在你的工作流中結合一個編譯轉換器。如果你希望的話,還有一些監視文件變化和瀏覽器實時刷新的插件來讓你體驗無縫的編碼。

如果是從頭開始,你可能只是想要使用命令行來轉換代碼(查看例子Babel CLI documentation)。如果你已經使用過grunt或gulp之類的工具,你可以添加一個比如gulp-babel的插件,或者Webpack中的babel-loader插件。對于Grunt,有一個grunt-babel,還有很多其他的ES6-related plugins。對于使用Browserify的開發者,可以看看babelify

很多特性被轉換成ES5的兼容性代碼后,并不會有很大的開銷,通過編譯器提供的臨時性方案會有一點點的性能損耗。你可以通過各種交互環境(也稱作RELPs)來看看使用ES6代碼和編譯后的代碼是什么樣的:

1、Traceur:website,REPL
2、Babel:website,REPL
3、TypeScript:website,REPL
4、ScratchJS(chrome插件)

注意,TypeScript并不完全是一個轉換器,它是強類型的Javascript的超集,可以編譯成Javascript,它和其他轉換器一樣,支持很多ES6特性。

究竟如何使用?

通常來說,一些ES6的特性可以自由地使用,比如模塊、箭頭函數,不定參數和類。這些特性不會用太多開銷,就可以轉換成ES5代碼。而Array、 String和Math對象上和原型上的方法(比如Array.from等等)需要所謂的“polyfills”。Polyfills是對那些瀏覽器還沒 有原生支持的特性的一個臨時方案。你可以首先加載polyfills,如果瀏覽器有此函數,代碼就會正常運行,Babel和Traceur都會提供類似的 polyfills。

可以查看ES6兼容性表來 看看轉換器和瀏覽器對ES6新特性的支持情況。令人激動的是,在寫這篇文章的時候,最新的瀏覽器已經支持了所有ES6特性的55%到70%。 Microsoft Edge,Google Chrome和Mozilla Firefox相互競爭,這對整個Web的發展有很大的意義。

就我個人而言,我發現能夠很簡單地使用ES6中的新特性,比如模塊,箭頭函數和不定參數等等是一種解脫,也是對自己編碼的一個顯著的提升。現在我很享受使用ES6寫代碼,然后將其轉換成ES5代碼。ES6的優點隨著時間的增長會越來越明顯。

下一步呢?

只要安裝了一個轉換器,就可以開始使用一些小的特性,比如let和箭頭函數。記住,已經編寫好的ES5代碼,轉換器會原封不動地保留下來。當你使用 ES6去優化你的代碼,慢慢地喜歡用它,你就可以逐步將越來越多的ES6特性應用到代碼中。也許有一些代碼會有新的模塊或類語法,但是我保證一切都會越來 越好的!

除了文章中提到的特性,還有更多的ES6的東西沒有被提到,比如Map,Set,標簽模板字符串,生成器,Proxy和Promise,如果你想知道請關注后續的文章。另外,如果想要深入學習,我推薦Exploring ES6這本書,書里面提到了所有的ES6特性。

最后的思考

通過使用轉換器,所有的代碼實際上是轉換成了ES5。而瀏覽器一直在添加新特性,所以,即便瀏覽器完全支持某個特定的ES6特性,最后還是運行 ES5兼容版本的代碼,這樣可能表現會更糟糕。你可以期待,在你需要兼容的瀏覽器和運行環境里,所有的ES6特性最終都會被支持。但是在那之前,我們需要 管理好這些ES6特性的支持情況,選擇性地禁用某些ES6特性來減少轉換成ES5代碼后帶來的不必要的開銷。知道了這些,你就可以決定是否要使用ES6中 的特性。

譯者信息

小駱,90后碼農一個,潛水于互聯網中,專注web開發,喜愛寫代碼,個人博客狼狼的藍胖子

譯文鏈接:http://www.codeceo.com/article/es6-next-javascript.html
英文原文:ECMAScript 6 (ES6): What’s New In The Next Version Of JavaScript

 

責任編輯:王雪燕 來源: 碼農網
相關推薦

2009-03-08 09:50:43

Firefox新版本

2014-06-20 10:30:31

DalvikART

2012-11-22 10:28:13

SQL Server

2015-12-31 09:58:01

谷歌安卓Android

2023-11-23 10:21:11

ECMAScriptJavaScript

2015-07-17 13:27:16

MySQL 5.7

2025-11-19 08:23:37

2025-02-20 09:52:45

C# 6開發代碼

2020-06-29 09:46:30

微軟瀏覽器Windows

2021-08-02 09:55:06

Linux Mint開發工作官網

2015-07-17 13:45:12

MySQL 5.7

2009-12-18 13:43:07

Ruby 1.9版本

2015-07-17 13:43:09

MySQL 5.7

2012-03-05 09:58:25

Android酸橙派

2010-06-07 12:54:34

2022-06-27 06:02:27

geopandas開發Python

2009-05-05 09:19:59

Solaris 10509更新Solaris 11

2010-03-16 14:05:57

Eclipse 3.6

2017-08-31 14:25:34

前端JavascriptES6

2020-07-01 07:58:20

ES6JavaScript開發
點贊
收藏

51CTO技術棧公眾號

日韩一级理论片| 日日夜夜精品网站| 日韩三级一区二区三区| 亚洲bt欧美bt精品777| 91国偷自产一区二区三区观看| 亚洲成人精品电影在线观看| 一级全黄少妇性色生活片| 国产一区二区三区四区三区四 | 午夜成人免费影院| 视频一区中文字幕国产| 欧美成人中文字幕| 免费黄色在线视频| 国产女人高潮毛片| 亚洲国产国产亚洲一二三| 国产一区二区日韩精品欧美精品| 亚洲制服在线观看| 色尼玛亚洲综合影院| 亚洲伦在线观看| 欧美日韩在线观看一区二区三区| 久久免费视频播放| 欧美亚洲国产激情| 色婷婷精品大在线视频| 亚洲黄色网址在线观看| 日本国产在线| 国产精品一级片| 国产精品人成电影| 国产成人免费看| 亚州综合一区| 五月婷婷另类国产| 国产综合色一区二区三区| 中文字幕第三页| 亚洲欧美网站| 亚洲91精品在线| 超碰在线国产97| 成人黄色av| 亚洲欧美一区二区三区久久| 特级特黄刘亦菲aaa级| 韩国一区二区三区视频| 欧美色偷偷大香| 伊人婷婷久久| 国产美女性感在线观看懂色av | 90岁老太婆乱淫| 91精品尤物| 日韩欧美一级二级三级久久久| 自拍偷拍21p| 欧美日韩尤物久久| 国产精品人妖ts系列视频| 久久综合福利| 亚洲AV成人无码一二三区在线| 高清不卡一区二区| 99热99热| 99热这里只有精品99| 国产老妇另类xxxxx| 国产在线拍揄自揄视频不卡99| 亚洲精品一区二区三区在线播放| 视频二区欧美| 欧美天天综合色影久久精品| 日韩视频免费播放| 福利成人导航| 婷婷综合五月天| 免费无码毛片一区二三区| 免费观看成年在线视频网站| 欧美a级理论片| 欧美黄色性视频| 久草视频免费在线播放| 亚洲电影在线| 91av成人在线| aaa在线视频| 喷白浆一区二区| 国产一区二区在线播放| 91超薄丝袜肉丝一区二区| 九九视频精品免费| 51国偷自产一区二区三区| 精品久久在线观看| 成人动漫一区二区三区| 久久精品日产第一区二区三区乱码 | 亚洲国产欧美在线成人app| 国产福利在线观看视频| 奇米亚洲欧美| 久久精品国产亚洲精品2020| 欧美成人精品欧美一级| 最新成人av网站| 欧日韩在线观看| 亚洲天堂777| 懂色av一区二区夜夜嗨| 久久精品中文字幕一区二区三区| 国产一级片在线| 亚洲免费在线观看视频| 欧美变态另类刺激| 51一区二区三区| 日韩女优毛片在线| 一级片手机在线观看| 婷婷激情图片久久| 亚洲3p在线观看| 一区二区三区精| zzijzzij亚洲日本少妇熟睡| 日韩欧美第二区在线观看| 成人三级黄色免费网站| 亚洲一区二区三区四区的| 激情综合网婷婷| 日韩成人18| 国产午夜精品视频免费不卡69堂| 欧美三根一起进三p| 午夜亚洲性色视频| 亚洲自拍偷拍第一页| 日本天堂在线| 亚洲最色的网站| 亚洲色图 在线视频| 高潮按摩久久久久久av免费| 中文字幕一区二区精品| 亚洲视频免费播放| 国产毛片精品国产一区二区三区| 鲁片一区二区三区| 国精一区二区三区| 欧美区一区二区三区| 亚洲男人在线天堂| 欧美一区在线看| 国产精品一区二区三区久久| 手机看片一区二区| |精品福利一区二区三区| 91国视频在线| 中文在线综合| 久久亚洲国产精品| 国产亚洲精品熟女国产成人| 日韩母乳在线| 九九精品在线观看| 日本成人一级片| 91玉足脚交白嫩脚丫在线播放| 黄色a级在线观看| 亚洲欧美在线成人| 国产丝袜精品视频| 日韩精品视频免费播放| 国产精品自拍av| 一区二区三区国产福利| 性欧美freehd18| 亚洲美女视频网站| av大片在线免费观看| 成人免费的视频| 喜爱夜蒲2在线| 经典三级久久| 久久久国产精品x99av| 中文字幕在线观看1| 久久久久久久性| 欧美 日韩 国产一区| 久久久久观看| 久久人人爽人人爽人人片av高请| 亚洲国产日韩在线观看| 一区二区三区四区精品在线视频| 又色又爽又黄视频| 综合激情在线| av资源一区二区| 欧美黄色视屏| 精品国产123| 国产午夜激情视频| 91丨porny丨最新| 动漫av网站免费观看| 亚洲精品推荐| 国产精品高精视频免费| 成人性爱视频在线观看| 3d动漫精品啪啪一区二区竹菊| 亚洲综合20p| 天天做天天爱天天爽综合网| 91青草视频久久| 日本片在线观看| 亚洲国产精品热久久| 综合激情网五月| 国产视频亚洲色图| 中国黄色片一级| 欧美偷窥清纯综合图区| 俺去亚洲欧洲欧美日韩| 国产精品高潮呻吟av| 亚洲精品久久久久久国产精华液| av地址在线观看| 亚洲黄色av| 欧美一区二区综合| 国模私拍视频在线播放| 日韩第一页在线| 中国a一片一级一片| 亚洲精品乱码久久久久久黑人 | 亚洲成人五区| 欧美亚洲视频在线观看| 欧洲日本在线| 亚洲精品一线二线三线无人区| 天堂在线免费观看视频| 国产精品久久久久久久久动漫| 人妻换人妻仑乱| 午夜在线精品| 中文字幕成人一区| 欧美天堂社区| 91色视频在线导航| 麻豆网站免费在线观看| 日韩在线免费视频观看| 日韩一级片免费看| 欧美人狂配大交3d怪物一区| 亚洲国产综合久久| 国产精品麻豆一区二区| 亚洲AV成人精品| 日韩电影一区二区三区| 大西瓜av在线| 天堂va欧美ⅴa亚洲va一国产| 97高清免费视频| 免费看美女视频在线网站| 精品国产91洋老外米糕| 136福利视频导航| 欧美日韩亚洲一区二区三区| 在线观看美女av| 久久亚洲影视婷婷| 国产一卡二卡三卡四卡| 久久精品国产精品亚洲精品| 国产真人做爰毛片视频直播| 91亚洲成人| 奇米精品在线| 精品三级av| 91久久偷偷做嫩草影院| 桃色一区二区| 91av在线播放视频| 性欧美ⅴideo另类hd| 日韩在线观看免费| 国产免费av在线| 日韩精品电影网| 人妻va精品va欧美va| 91精品国产日韩91久久久久久| 久久久精品毛片| 欧美性极品xxxx娇小| 精品人妻在线播放| 亚洲精品久久嫩草网站秘色| 操她视频在线观看| 激情丁香综合五月| 成人午夜激情av| 久久一二三四| 久久久噜噜噜www成人网| 亚洲伦伦在线| 草草视频在线免费观看| 欧美va亚洲va日韩∨a综合色| 亚洲乱码一区二区三区| 欧美精品一区二区三区中文字幕| 久久国产精品久久精品国产| 久久激情av| 精品国产乱码久久久久久久软件| 国产精东传媒成人av电影| 高清日韩一区| 国产欧美一区二区三区米奇| 成人高清在线观看| jizz国产精品| 国产精品露出视频| 精品资源在线| 久久国产精品一区二区三区| 欧美三级自拍| 欧美日韩精品久久久免费观看| 婷婷精品在线| 欧美日韩中文国产一区发布| 免费久久精品| 天天爽天天狠久久久| 日韩一区自拍| 99re99热| 精品99视频| 国产 福利 在线| 视频一区二区三区中文字幕| 国产自偷自偷免费一区| 一区二区三区午夜视频| 黄色网在线视频| 国模 一区 二区 三区| 国产曰肥老太婆无遮挡| 中文高清一区| 欧美精品国产精品久久久| 伊人久久大香线蕉综合网蜜芽| 日本免费一区二区三区| 成人高清电影网站| 精品日韩在线播放| 激情婷婷欧美| 大香煮伊手机一区| 久久er精品视频| 久久久久中文字幕亚洲精品| 成人毛片视频在线观看| 亚欧洲乱码视频| 国产精品久久久久久久久晋中| 成人免费精品动漫网站| 亚洲成人激情av| 成人黄色三级视频| 日韩精品中午字幕| 男操女在线观看| 久久久精品久久| 99热99re6国产在线播放| 青草青草久热精品视频在线网站| 人人玩人人添人人澡欧美| 岛国视频一区免费观看| 国产精品欧美三级在线观看| 国产精品福利视频| 欧美日本成人| 97超碰在线视| 老妇喷水一区二区三区| 亚洲欧美激情一区二区三区| 久久综合99re88久久爱| 国产1区2区3区4区| 一本一本大道香蕉久在线精品| 国产女人18毛片水真多| 亚洲欧美国产高清va在线播| 成人区精品一区二区不卡| 欧美综合在线第二页| 日本亚州欧洲精品不卡| 奇米视频888战线精品播放| 黄色在线成人| 91亚洲免费视频| 久久女同精品一区二区| 少妇影院在线观看| 欧美日韩久久一区| 亚洲人在线观看视频| 久久不射电影网| 免费在线观看一区| 精品国产乱码久久久久久郑州公司| 久久国产综合| 欧美三级午夜理伦三级| 成人免费黄色大片| 国产波霸爆乳一区二区| 欧美午夜不卡在线观看免费| 天天操天天舔天天干| 欧美大尺度在线观看| 久久久国产精品网站| 欧美日韩综合精品| 国产一区二区高清| 久久久久国产免费| 亚洲伦理在线精品| 91亚洲国产成人久久精品麻豆 | 在线观看免费版| 欧美在线性爱视频| 精品自拍偷拍| 六月婷婷激情综合| 国产麻豆精品theporn| 91香蕉视频污在线观看| 在线视频亚洲一区| 欧美一区二区少妇| 欧美一级淫片丝袜脚交| 国内精品偷拍| 免费在线看黄色片| 国产91露脸合集magnet| 欧美黑人猛猛猛| 日韩一区二区免费在线电影| 老司机av在线免费看| 国产欧美亚洲精品| 久久一区二区中文字幕| 日韩一级免费片| 国产精品情趣视频| 中文字幕一区二区免费| 伊人久久久久久久久久久久久 | 久久久久久亚洲精品| 涩爱av色老久久精品偷偷鲁| 潘金莲一级淫片aaaaaa播放1| 国产尤物一区二区| 欧美一区二区三区爽爽爽| 91精品蜜臀在线一区尤物| 二区三区在线观看| 99re在线观看视频| 伊人精品在线| 特级西西人体4444xxxx| 色哟哟一区二区在线观看| 国产剧情在线观看| 国产精品一区二区久久国产| 天天做天天爱天天爽综合网| 在线观看视频你懂得| 五月综合激情网| 黄色的视频在线免费观看| 国产成人在线播放| 999国产精品999久久久久久| 999久久久精品视频| 一区二区三区四区精品在线视频| 人妻精品无码一区二区| 日韩av大片免费看| 欧美a级片视频| xxxx国产视频| 欧美色道久久88综合亚洲精品| 国产在线自天天| 国产日韩在线一区| 国产精品av久久久久久麻豆网| 亚洲av无码一区二区三区网址 | 99国产精品久久久久99打野战| 色综合视频一区中文字幕| 秋霞在线一区| 特级丰满少妇一级| 亚洲一区视频在线观看视频| 色视频免费在线观看| 91精品久久久久久久久| 狠狠噜噜久久| 全黄一级裸体片| 91精品中文字幕一区二区三区| 国产精品yjizz视频网| 亚洲自拍偷拍网址| 亚洲深夜av| 小泽玛利亚一区| 亚洲黄色www网站| 日日夜夜综合| 亚洲 高清 成人 动漫| 国产精品看片你懂得| 日本精品一二区| 成人激情黄色网| 噜噜爱69成人精品| 欧美黄色免费看| 国产一区二区三区视频免费| 亚洲啊v在线免费视频| 亚洲一区二区三区四区五区xx| 亚洲午夜电影网|