欧美亚洲韩国_av电影院在线看_久久久久97_台湾佬中文娱乐网欧美电影

站長資訊網
最全最豐富的資訊網站

抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點

抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點

相關學習推薦:javascript

前言

說起JavaScript,大家都知道是一門腳本語言。那么ES是什么鬼呢?ES全稱ECMAScript ,是JavaScript語言的國際標準。

最近總結了條js的基礎特性相關的知識點,大家一起看一下吧

抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點

1.嚴格模式

  • 使用嚴格模式,可以在函數內部進行較為嚴格的全局和局部的錯誤條件檢查
  • 嚴格模式的編譯指示,"use strict"
  • 創建全局變量,未聲明變量,非嚴格模式下為創建全局變量;嚴格模式下為拋出ReferenceError
  • 對變量調用delete操作符,刪除變量,非嚴格模式下為靜默失敗;嚴格模式下為拋出ReferenceError
  • 操作對象情況下:a,只讀屬性賦值會拋出TypeError;b,對不可配置的屬性使用delete操作符會拋出TypeError;c,為不可擴展的對象添加屬性會拋出TypeError。
  • 重名屬性情況:a,非嚴格模式下沒有錯誤,以第二個屬性為準;b,嚴格模式下會拋出語法錯誤。
  • 函數參數必須唯一,重名參數,在非嚴格模式下沒有錯誤,只能訪問第二個參數;嚴格模式下,會拋出錯誤。
function funValue(value) {     value="dada";     alert(value); // dada     alert(argument[0]); // 非嚴格模式:dada     // 嚴格模式模式 dadaqianduan}  funValue('dadaqianduan');復制代碼
  • 訪問arguments.callee和arguments.caller,在非嚴格模式下沒有問題,嚴格模式下拋出TypeError。

2.Class基礎語法

在JavaScript當中如何聲明一個類?如何定義類中的方法?如何實例化對象?

我們來看看下面的代碼示例:

// es5let dada = function(type) {    this.type = type }  dada.prototype.study = function() {    console.log('魔王哪吒'); }let da1 = new dada('程序員')let da2 = new dada('It')  da1.constructor.prototype.study = function() {    console.log('dadaqianduan'); } da1.study()復制代碼

JavaScript constructor 屬性

定義和用法

constructor 屬性返回對創建此對象的數組函數的引用。

語法

object.constructor

constructor 是一種用于創建和初始化class創建的對象的特殊方法。

// es6class Da {  constructor(name) { // 構造函數內寫屬性     this.name = name;   }   eat() { // 構造函數外寫方法     console.log('i eat')   } }const da1 = new Da('da1');console.log(da1.name); // da1console.log(da1);復制代碼
  1. 一個類中只能有一個名為“constructor"的方法,出現多次構造函數constructor方法會拋出一個SyntaxError錯誤
  2. 在一個構造方法中可以使用super來調用一個父類的構造方法
  3. 如果沒有指定一個構造函數方法constructor方法,就會使用一個默認的構造函數

3.類的屬性Setter和Getter

var daObj = {  get val() {   return ;  },  set val(value) {  } }復制代碼

get:

var da = {    a: 1,     get val(){        return this.a + 1;     } }console.log(da.val);//2da.val = 100;console.log(da.val);//2class Da { constructor(type) {  this.type = type  }  get age() {  return 1  }  set age(val) {  this.realAge = val  }  eat() {  console.log('i am eat')  } }let da1 = new Da('da1')console.log(da1.age) da1.age = 1console.log(da1.realAge)復制代碼
class Da {  constructor(type, age) {   this.type = type   this.age1 = age  }  get age() {   return this._age  }  set age(val) {   this._age = val  } }復制代碼

利用set/get實現對element.innerHTML封裝

class myHTMLElement {  constructor(element) {   this.element = element  }  get html() {   return this.element.innerHTML  }  set html(value) {   this.element.innerHTML = value  } }復制代碼

設置一個閉包,通過一定的規則來限制對它的修改:

let myName = 'dada' class Da {  constructor(type) {   this.type = type  }  get name() {   return myName  }  set name(val) {   myName = val  } }復制代碼

4.靜態方法

在es5中實現的靜態方法:

let Da = function (type) { this.type = type this.eat = function() {  console.log('i eat')  } } Da.study = function(book) { console.log('i book'); }復制代碼
let Da = function(type) { this.type = type } Da.prototype.eat = function() {  Da.walk() console.log('i am') } Da.walk = function(){ console.log('walk') }let da1 = new Da('da1') da1.eat()// walk// i am復制代碼

靜態方法在你的實例化對象是找不到的

在es6中的靜態方法,標記static

class Da {  constructor(type) {   this.type = type  }  eat() {   console.log('i eat')  }  static study() {   console.log('i study')  } }復制代碼

5.如何繼承一個類

在es5中的繼承:

// 定義一個父類 let Da = function(type) {  this.type = type } // 定義方法 Da.prototype.eat = function() {  console.log('i am') } // 定義靜態方法 Da.study = function(book) {  console.log('i study') } // 定義子類 let Da1 = function() {  // 初始化父類  Da.call(this, 'da1');  this.run = function() {   console.log('i run')  } } // 繼承 Da1.prototype = Da.prototype復制代碼

在es6中的繼承

class Da { constructor(type) {  this.type = type  }  eat() {  // Da.walk();   console.log('i eat')  } static walk(){  console.log('i walk')  } }class da extends Da { // 構造函數  //constructor (type) {   //super(type)  //}  run() {  console.log('i run')  } }let da1 = new da('da1')復制代碼

6.面向對象編程Class

類的聲明,屬性,方法,靜態方法,繼承,多態,私有屬性

// 類的聲明 let Da = function(type) {  this.type = type  this.eat = function() {   console.log('i eat');  } }  let da = new Da('da');復制代碼
// prototype let Da = function(type) {  this.type = type } Da.prototype.eat = function() {  console.log('i eat') } let da1 = new Da('da1')復制代碼

es6中的Class

class Da {  // 構造函數  constructor(type) {   this.type = type  }  // 方法  walk() {   console.log('i walk')  } } let da = new Da('da'); // console.log(typeof Da); function復制代碼

7.函數參數的默認值

函數參數是從左到右解析,如果沒有默認值會被解析成 undefined

// 參數默認值 function da (x,y,z) { } function sum() {  let num = 0  Array.prototype.forEach.call(arguments, function(item){   num += item * 1  })  Array.from(arguments).forEach(function(item){   num += item * 1  })  return num }復制代碼
// 不確定 function sum(...nums) {  let num = 0  nums.forEach(function(item){   num += item * 1  })  return num } console.log(sum(1,2,3,4,5))復制代碼
function sum () {   let num = 0   Array.prototype.forEach.call(arguments, function (item) {     num += item * 1   })   return num }  function sum (...nums) {   let num = 0   nums.forEach(function (item) {     num += item * 1   })   return num }復制代碼

8.es6箭頭函數

箭頭函數表達式的語法比函數表達式更簡潔,并且沒有自己的this,arguments,super或new.target。箭頭函數表達式更適用于那些本來需要匿名函數的地方,并且它不能用作構造函數。

() => {} // function Da() {} // let da = function() {} let da = () => {  console.log('hello') } da()  let da = name => {}復制代碼
const materials = [  'Hydrogen',  'Helium',  'Lithium',  'Beryllium'];console.log(materials.map(material => material.length));// expected output: Array [8, 6, 7, 9]復制代碼

拓展

判斷函數有幾個參數

  1. 在 ES5 中可以在函數體內使用 arguments 來判斷。
  2. 在 ES6 中可以借助 Function.length 來判斷。(統計第一個默認參數前面的變量數)
console.log(sum(...[4])) console.log(sum.apply(null, [4]))復制代碼

9.JavaScript中的三個點(…)

JavaScript當中,函數的參數前面有三個點,代表什么呢?我們看下代碼示例:

function myFunc(a, b, ...args) {  console.log(a); // 22  console.log(b); // 98  console.log(args); // [43, 3, 26] }; myFunc(22, 98, 43, 3, 26);復制代碼
function myFunc(x, y, ...params) { // used rest operator here   console.log(x);  console.log(y);  console.log(params); }var inputs = ["a", "b", "c", "d", "e", "f"]; myFunc(...inputs); // used spread operator here// "a"// "b"// ["c", "d", "e", "f"]復制代碼
var obj1 = { foo: 'bar', x: 42 };var obj2 = { foo: 'baz', y: 13 };var clonedObj = { ...obj1 };// Object { foo: "bar", x: 42 }var mergedObj = { ...obj1, ...obj2 };// Object { foo: "baz", x: 42, y: 13 }復制代碼

10.Object Property

JS中對象的屬性定義,代碼示例如下:

let x = 'da1'; let y = 'da2'; let obj = {  x,  y } console.log(obj);  // 結果 {x:'da1',y:'da2'}復制代碼
let x=1; let y=2; let z=3 let obj = {  'x': x,  y,  [z+y]: 4,  * hello() { // 異步   console.log('dada')  } } // function* functionName() {} obj.hello()復制代碼

11.Set數據結構

Set存儲的成員不允許的重復的(它類似于數組)

Set 本身是一個構造函數,用來生成 Set 數據結構。

const s = new Set();  [2, 3, 5].forEach(x => s.add(x));  Set 函數可以接受一個數組(或類似數組的對象)作為參數,用來初始化  const set = new Set([1, 2, 3, 4, 4]);復制代碼

實現數組去重

var arr = [1,1,2,2,3,3]; // step1:數組轉集合 var s = new Set(arr); // 已經去掉重復值,當前不是數組,而集合 s.size; // 3 // step2:集合轉數組 console.log([...s]); // 1,2,3;  // Array.form 方法可以將 Set 結構轉為數組 const items = new Set([1, 2, 3]); const arr = Array.from(items);  function dada(array) {   return Array.from(new Set(array)); }  dada([1, 1, 2])復制代碼

Set的遍歷

  • keys():返回鍵名的遍歷器
  • values():返回鍵值的遍歷器
  • entries():返回鍵值對的遍歷器
  • forEach():使用回調函數遍歷每個成員

操作方法

  • add(value)添加某個值,返回Set結構本身。
  • delete(value)刪除某個值,返回一個布爾值,表示刪除是否成功。
  • has(value)返回一個布爾值,表示該值是否為Set的成員。
  • clear()清除所有成員,沒有返回值。
let set = new Set([1, 2, 3, 4, 4]);  // 添加數據  let addSet = set.add(5); console.log(addSet); // Set(5) {1, 2, 3, 4, 5}  // 刪除數據  let delSet = set.delete(4); console.log(delSet); // true  // 查看是否存在數據 4 let hasSet = set.has(4); console.log(hasSet); // false  // 清除所有數據 set.clear(); console.log(set); // Set(0) {}復制代碼

實現并集(Union)、交集(Intersect)和差集(Difference)

let a = new Set([1, 2, 3]); let b = new Set([4, 3, 2, 1]);  // 并集 let union = new Set([...a, ...b]); // Set {1, 2, 3, 4}  // 交集 let intersect = new Set([...a].filter(x => b.has(x))); // set {1, 2, 3}  // 差集 let difference = new Set([...b].filter(x => !a.has(x))); // Set {4}復制代碼

12.Map數據結構

JS當中的哈希表,使用方法如下:

let map = new Map() map.set(1, 2) map.set(3, 4) map.set(1, 3) console.log(map)  創建 var da = new Map(); var jeskson = {}; 遍歷 da.forEach(function(value,key,map){} 長度 da.size 刪除 //da.delete() 刪除key,全部清楚da.clear() 新增 da.set(key,value) da.has(查索引值)  da.forEach((value,key) =>{ })  for( let [key, value] of map){}  // let map = new Map( [[1,2], [3,4]] )  map的key任意都可以 let o = function() {  console.log('o') } map.set(o, 3) console.log(map.get(o)); // 3復制代碼
// map.js var Dictionary = function() {  var items = {};  // 檢查鍵  this.has = function(key) {   return key in items;  }  // 添加鍵值對  this.set = function(key, value){   items[key] = value;  }  // 通過鍵移除元素  this.delete = function(key) {   if(this.has(key)){    delete items[key]    return true   }   return false  }  // 鍵獲取值  this.get = function(key){   return this.has(key) ? items[key] : undefined;  }  // 列表返回字典值  this.values = function() {   var values = [];   for(var k in items) {    if(this.has(k)) {     values.push(items[k])    }   }   return values;  }  // 獲取全部鍵名  this.keys = function() {   return Object.keys(items);  }  // 獲取私有變量items  this.getItems = function() {   return items;  } }復制代碼

Map數據結構,它類似于對象,也是鍵值對的集合,但是“鍵”的范圍不限于字符串,各種類型的值(包括對象)都可以當作鍵。

13.Object.assign(對象的拷貝)

Object.assign() 方法用于將所有可枚舉屬性的值從一個或多個源對象復制到目標對象。它將返回目標對象。

const target = { a: 1, b: 2 }; const source = { b: 4, c: 5 };  const returnedTarget = Object.assign(target, source);  console.log(target); // expected output: Object { a: 1, b: 4, c: 5 }  console.log(returnedTarget); // expected output: Object { a: 1, b: 4, c: 5 }  > Object { a: 1, b: 4, c: 5 } > Object { a: 1, b: 4, c: 5 }復制代碼

語法

Object.assign(target, ...sources)復制代碼

參數

target復制代碼

目標對象

sources復制代碼

源對象

返回值

目標對象。

const obj = { a: 1 }; const copy = Object.assign({}, obj); console.log(copy); // { a: 1 }復制代碼
  • Object.assign()拷貝的是(可枚舉)屬性值
  • Object.assign方法的第一個參數是目標對象,后面的參數都是源對象
  • 如果目標對象與源對象有同名屬性,或多個源對象有同名屬性,則后面的屬性會覆蓋前面的屬性
  • 由于undefined和null無法轉成對象,所以如果它們作為參數,就會報錯
  • 如果undefined和null不在首參數,就不會報錯
  • 如果源對象某個屬性的值是對象,那么目標對象拷貝得到的是這個對象的引用(這個對象的任何變化,都會反映到目標對象上面。)
Object.assign(undefined) // 報錯 Object.assign(null) // 報錯  let obj = {a: 1}; Object.assign(obj, undefined) === obj // true Object.assign(obj, null) === obj // true  const obj1 = {a: {b: 1}}; const obj2 = Object.assign({}, obj1);  obj1.a.b = 2; obj2.a.b // 2  const target = { a: { b: 'c', d: 'e' } } const source = { a: { b: 'hello' } } Object.assign(target, source) // { a: { b: 'hello' } }  const source = {   get foo() { return 1 } }; const target = {};  Object.assign(target, source) // { foo: 1 }復制代碼

Object.assign復制的是屬性值value,如果屬性值是一個引用類型,那么復制的其實是引用地址,就會存在引用共享的問題(Object.assign(target,source1,…,sourceN)淺拷貝的過程)

要點:

抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點
function ObjectAssign(target, ...sources) {  // 對第一個參數的判斷,不能為undefined和null  if(target === undefined || target === null) {   throw my TypeError('error');  }  // 將第一個參數轉為對象(不是對象轉換為對象)  const targetObj = Object(target);  // 將源對象自身的所有可枚舉屬性復制到目標對象  for(let i = 0; i<sources.length; i++){   let source = sources[i];   // 對于undefined和null在源中不會報錯,會直接跳過   if(source !== undefined && source !== null) {    // 將源象轉換成對象    // 需要將源自身的可枚舉數據進行復制    // Reflect.ownKeys(obj)    const keysArray = Reflect.ownKeys(Object(source));    for (let nextIndex = 0; nextIndex < keysArray.length; nextIndex++) {     const nextKey = keysArray[nextIndex];     // 去除不可枚舉屬性     const desc = Object.getOwnPropertyDescriptor(source,nextKey);     if(desc!==undefined&&desc.enumerable){      targetObj[nextKey] = source[nextKey];     }    }   }  }  return targetObj; } if(typeof Object.myAssign !== 'function'){  Object.defineProperty(Object, 'myAssign', {   value: ObjectAssign,   writable: true,   enumerable: false,   configurable: true  }); }復制代碼

淺拷貝 Object.assign 的實現原理

拷貝第一層的基本類似值和第一層的引用類型地址:

let da1 = { name: 'da1', age: 1}let da2 = { name: 'da2', study: {  title: 'web'  } }let da3 = Object.assign(da1,da2);console.log(da3);// {// name: 'da2',// age: 1,// study: { title: 'web' }// }console.log( da1 === da3); // trueda2.name = 'da22'; da2.study.title = 'web2';console.log(da2);// {// name: 'da22',// study: { title: 'web2' }// }console.log(da1);// {// age: 1,// name: 'da2',// study: { title: 'web2' }// }復制代碼

如果源對象的屬性值是一個指向對象的引用,它也只拷貝這個引用地址哦!

let da1 = { name: 'da1', age: 1}let da2 = { a: Symbol('dadaqianduan'), b: null, c: undefined}let da3 = Object.assign(da1, da2);console.log(da3);// {// name: 'da1',// age: 1,// a: Symbol('dadaqianduan'),// b: null,// c: undefined// }console.log(da1 === da3); // true復制代碼
抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點
抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點
抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點
抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點
抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點
let map = new Map([iterable]) // Map是用來實現字典的功能-Object鍵值對復制代碼
抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點

動態屬性鍵

// ES5 code var   key1 = 'one',   obj = {     two: 2,     three: 3   };  obj[key1] = 1;  // obj.one = 1, obj.two = 2, obj.three = 3  // ES6 code const   key1 = 'one',   obj = {     [key1]: 1,     two: 2,     three: 3   };  // obj.one = 1, obj.two = 2, obj.three = 3  // ES6 code const   i = 1,   obj = {     ['i' + i]: i   };  console.log(obj.i1); // 1復制代碼

補充:前端面試考點,HTML和CSS,性能優化,原型,作用域,異步,各種手寫代碼,DOM事件和Ajax,HTTP協議。

  • css(布局,定位,移動端響應式)
  • es(原型,原型鏈,作用域,閉包,異步,單線程)
  • webapi(DOM BOM,Ajax跨域,事件存儲)
  • 開發環境(版本管理,調試抓包,打包構建)
  • 運行環境(頁面渲染,性能優化,web安全)
  • 網絡通訊
  1. 布局(盒模型,BFC,float,flex)
  2. 定位,圖文樣式,移動端響應式(rem,media query,vw/vh),動畫、漸變
  3. 變量類型和計算(值類型和引用類型,類型判斷,邏輯運算)
  4. 原型和原型鏈(class,繼承,原型,原型鏈,instanceof)
  5. 作用域和閉包(作用域,自由變量,閉包,this)
  6. 異步(單線程,callback,應用場景,Promise,event-loop,async/await,微任務/宏任務)
  7. 模塊化(ES6 Module)
  8. DOM(樹形結構,節點操作,屬性,樹結構操作,性能)
  9. BOM(navigator,screen,location,history)
  10. 事件(綁定,冒泡,代理)
  11. ajax(XMLHttpRequest,狀態碼,跨域)
  12. 存儲(cookie,localStorage,sessionStorage)
  13. 開發環境(git,調試,webpack和babel,linux命令)
  14. 運行環境(頁面加載:加載,渲染。性能優化:加載資源優化,渲染優化。安全:xss,CSRF)
  15. HTTP協議:狀態碼,Method,Restful API,headers,緩存策略

14.模板文字

模板文字是es2015/es6的新功能,與es5及以下版本相比,可以通過新穎的方式使用字符串,先只需要反引號代替單引號或雙引號即可:

const module_string = `dadaqianduan`復制代碼

它們之所以獨特是因為它們提供了很多用引號構建的普通字符串不具備的功能:

  1. 提供了定義多行字符串的語法;
  2. 提供了一種簡單的方法來插值字符串中的變量和表達式
  3. 允許您使用模板標簽創建DSL(領域特定的語言)

使用多行字符串

在es6之前的版本:

// 要創建跨越兩行的字符串,必須在行尾使用字符const dada =   'dada    dadaqianduan'   // 呈現效果:在兩行上創建一個字符串,但是僅在一行上呈現復制代碼

要在多行上呈現,則需要使用n在每行的末尾添加

const string =   'dada 魔王哪吒n    dadaqianduan'復制代碼

使用反引號打開模板文字后,只需要按enter鍵就行:

const dada = `dadaqianduan  魔王哪吒`復制代碼

在這里請記住空間是有意義的:

const da = `First             Second`復制代碼
抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點

使用trim()方法,可以消除第一個字符之前的任何空格

插補:模板文字提供了一種將變量和表達式插入字符串的簡便的方法

const da = `dadaqianduan ${mydada}`  ${}里面可以添加任何東西  const da1 = `dada ${1+2+3}` const da2 = `dada ${dafun() ? 'x' : 'y'}`復制代碼

15.什么是解構賦值

let da = ['hello', 'world'] let [firstName, surName] = da cosole.log(firstName, surName);復制代碼

解構賦值在于賦值,拷貝出來賦值給變量,而賦值的元素本身不會發生改變

默認值

let [da1, da2] = [];console.log(da1); // undefinedconsole.log(da2); // undefined復制代碼

給變量賦值(默認值),防止出現undefined的情況:

let [da1= 'da1', da2 = 'da2']=['dadaqianduan]  console.log(da1); // dadaqianduan console.log(da2); // da2復制代碼

解構分配

ES5中的索引提取這些值:

var myArray = ['a', 'b', 'c'];var   one   = myArray[0],   two   = myArray[1],   three = myArray[2];// one = 'a', two = 'b', three = 'c'復制代碼

ES6解構允許使用更簡單方法:

const [one, , three] = myArray;// one = 'a', three = 'c'復制代碼

使用rest運算符(...)提取剩余元素:

const [one, ...two] = myArray;// one = 'a', two = ['b, 'c']復制代碼
const myObject = {  one:   'a',  two:   'b',  three: 'c'};// ES6 destructuring exampleconst {one: first, two: second, three: third} = myObject;// first = 'a', second = 'b', third = 'c'復制代碼

可變值交換

var a = 1, b = 2;// ES5 swapvar temp = a; a = b; b = temp;// a = 2, b = 1// ES6 swap back[a, b] = [b, a];// a = 1, b = 2[b, c, d, e, a] = [a, b, c, d, e];復制代碼

在ES6中,我們可以為任何參數分配默認值

function dada(param = {}) {復制代碼

函數返回多個值(函數只能返回一個值,但可以是一個復雜的對象或多維數組)

function f() {  return [1, 2, 3]; }const [a, b, c] = f();// a = 1, b = 2, c = 3復制代碼

ES6 JavaScript深度解構

默認情況下,找不到的屬性為undefined

var {da} = {bar: 'dada'}console.log(da)// undefined復制代碼

如果訪問不存在的父級的深層嵌套屬性,則將獲得異常。

var {da:{bar}} = {dada: 'dadaqianduan'}// Exception復制代碼
var key = 'dadaqianduan'var { [key]: foo } = { dadaqianduan: 'bar' }console.log(foo)// 'bar'復制代碼
var {da=3} = { da: 2 }console.log(da)// 2var {da=3} = { da: undefined }console.log(da)// 3var {da=3} = { bar: 2 }console.log(da)// 3var [a] = []console.log(a)//  undefinedvar [b=10] = [undefined]console.log(b)//  10var [c=10] = []console.log(c)//  10function da () {  return {    x: 1,    y: 2   } }var {x, y} = da()console.log(x)// 1console.log(y)// 2復制代碼

16.異步操作

Callback

Promise

function loadScript(src) { return new Promise((resolve, reject) => {  let script = document.createElement('script')   script.src = src   script.onload = () => resolve(src)   script.onerror = (err) => reject(err)  document.head.append(script)  }) }復制代碼
function loadScript(src) { let script = document.createElement('script');  script.src = src; document.head.append(script) }復制代碼
var promise = new Promise(function(resolve, reject){  resolve('傳遞給then的值') }) promise.then(function(value){  console.log(value) },function(error){  console.error(error) })復制代碼

Promise對象是用于表示一個異步操作的最終完成(或失敗),以及其結果值。

示例:

const promise = new Promise((resolve, reject) => {  setTimeout(() => {   resolve('da');  }, 200); });  promise.then((value) => {  console.log(value); });  console.log(promise);復制代碼

語法:

new Promise(function (resolve,reject){...});復制代碼

描述:Promise對象是一個代理對象,被代理的值在Promise對象創建時可能是未知的,它允許你為異步操作的成功和失敗分別綁定相應的處理方法,這讓異步方法可以像同步方法那樣返回值,但并不是立即返回最終執行結果,而是一個能代表未來出現的結果的promise對象。

一個Promise有以下幾種狀態:

  1. pending,初始狀態,既不是成功,也不是失敗狀態。
  2. fulfilled,意味著操作成功完成。
  3. rejected,意味著操作失敗。

pending狀態的Promise對象可能會變為fulfilled狀態并傳遞一個值給相應的狀態處理方法。

抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點

Promise.prototype.thenPromise.prototype.catch方法返回promise對象,所以它們可以被鏈式調用。

方法:

Promise.all(iterable)

  1. 返回一個新的promise對象
  2. 在iterable參數對象里所有的promise對象都成功時,才會觸發成功
  3. 當任何一個iterable里面的promise對象失敗,才會觸發promise對象的失敗
  4. 成功狀態會把一個包含iterable里所有promise返回值的數組作為成功回調的返回值,順序和iterable的順序一樣
  5. 如果這個新的promise對象觸發了失敗,會把iterable里的第一個觸發失敗的promise對象的錯誤信息作為它的失敗信息
  6. 場景,多用于處理多個promise對象的狀態集合

Promise.any(iterable)

  1. 接收一個Promise對象的集合,當其中的一個promise成功,就返回那個成功的promise的值

Promise.reject(reason)

  1. 返回一個狀態為失敗的Promise對象,然后將失敗信息傳遞給對應的處理方法

Promise.resolve(value)

  1. 返回一個狀態由給定value決定的Promise對象

Promise原型

屬性:Promise.prototype.constructor返回被創建的實例函數,默認為Promise函數。

方法:

  • Promise.prototype.catch(onRejected)
  • Promise.prototype.then(onFulfilled,onRejected)
  • Promise.prototype.finally(onFinally)
function myAsyncFunction(url) { return new Promise((resolve, reject) => {  const xhr = new XMLHttpRequest();   xhr.open('GET',url);   xhr.onload = () => resolve(xhr.responseText);   xhr.onerror = () => reject(xhr.statusText);   xhr.send();  }); }復制代碼

17.ES6代理

  1. 默認情況下,代理不執行任何操作

示例:

var target = {}var handler = {}var proxy = new Proxy(target, handler) proxy.a = 'b'console.log(target.a)// 'b'console.log(proxy.c === undefined)// true復制代碼

為了更好地了解代理的有用性,讓我們做一些小練習。

示例:

想象一下,您已經17歲了,即將滿18歲。并且您希望您的程序在打開時自動向您祝賀。為此,您可以使用代理。

var person = {  name: "dada",  age: 17};  person = new Proxy(person, {   set(target, property, value) {    if (value === 18) {      console.log("Congratulations! You are of legal age");      Reflect.set(target, property, value);      return true;     }   } });  person.age = 18;if (value < 13 && value > 99) {  throw new Error('The age should be between 13 and 99') } else {  Reflect.set(target, property, value) }復制代碼

語法:

let p = new Proxy(target, handler)復制代碼
  1. target 用Proxy包裝的目標對象
  2. handler 一個對象,其屬性是當執行一個操作時定義代理的行為的函數

如果不想再調用key的時候,返回undefined:

console.log(o.dada || '')復制代碼

使用Proxy

let o = {  name: 'dada', age: 1}let handler = {  get(obj, key) {  return Reflect.has(obj, key)?obj[key]:''  } }let p = new Proxy(o, handler)console.log(p.from)復制代碼

希望從服務器獲取的數據只讀,不允許修改:

for (let [key] of Object.entries(response.data)) {   Object.defineProperty(response.data, key, {   writable: false  }) }復制代碼

使用Proxy:

let data = new Proxy(response.data, {  set(obj, key, value) {   return false  } })復制代碼

檢驗邏輯代碼:

// Validator.jsexport default(obj, key, vlaue) => { if(Reflect.has(key) && value > 20) {   obj[key] = value  } }import Validator from './Validator'let data = new Proxy(response.data, { set: Validator })復制代碼

使用Proxy,對讀寫進行監控:

let validator = {  set(target, key, value) {  if(key === 'age') {   if(typeof value !== 'number' || Number.isNaN(value)) {    throw new TypeError('Age must be a number')    }   if(value<=0){    throw new TypeError('Age must be a positive number')    }   }  return true  } }const person = { age: 12 }const proxy = new Proxy(person,validator) proxy.age = 'dada' // TypeError numberproxy.age = NaNproxy.age = 0 // positive numberproxy.age = 3復制代碼

示例:每個對象都有一個自己的id

class Component { constructor() {  this.proxy = new Proxy({   id: Math.random().toString(36).slice(-8)   })  }  get id() {  return this.proxy.id  } }復制代碼
抱著枸杞奮戰多夜,我總結了JavaScript與ES的25個重要知識點

18.Generator

function * dada() {  for(let i=0; i<2; i++ {   yield console.log(i);  } }  const da = dada() da.next() da.next()復制代碼

Generator函數與普通函數的區別在于定義的時候有一個*,執行下面函數:

function* dada() { console.log('dadaqianduan'); } dada(); // 沒有執行函數   如需要輸出,改為: var da = dada(); da.next();復制代碼

要生成一個自增的id:

var count_id = 0; function dada_id() { count_id ++; return count_id; }復制代碼

方法

Generator.prototype.next() 返回一個由 yield表達式生成的值。  Generator.prototype.return() 返回給定的值并結束生成器。  Generator.prototype.throw() 向生成器拋出一個錯誤。復制代碼

書寫風格:

function *da() { }  function* da(){ }復制代碼

方法

Generator對象方法:next,return,throw

通過Next方法來獲取每一次遍歷的結果,這個方法返回一個對象,這個對象包含兩個value和done。

value:當前程序的運行結果 done:遍歷是否結束

next是可以接收參數的,這個參數可以讓你在generator外部給內部傳遞數據,這個參數就是作為yield的返回值。

return()方法可以讓generator遍歷終止

function * da() {  yield 1  yield 2  yield 3 } var d = da() console.log(d.next()) // {value:1,done:false} console.log(d.return()) // {value:undefined,done:true} console.log(d.next()) // {value:undefined,done:true}復制代碼

return可以傳入參數,作為返回的value的值

function * da() {  yield 1  yield 2  yield 3 } var d = da() console.log(d.nex()) // {value:1,done:false} console.log(d.return(100)) // {value:100,done:true} console.log(d.next()) // {value:undefined,done:true}復制代碼

throw()方法在generator外部控制內部執行的“終斷”

generator函數聲明:

function* genFunc(){...} const genObj = genFunc();復制代碼

generator表達式:

const genFunc = function* () {...} const genObj = genFunc();復制代碼

對象中定義:

const obj = {  * generatorMethod(){   ...  } } const genObj = obj.generatorMethod();復制代碼

類定義(類聲明或類表達式):

class MyClass{  * generatorMethod(){   ...  } } const myInst = new MyClass(); const genObj = myInst.generatorMethod();復制代碼

最簡單的iterator遍歷規范:

authors[Symbol.iterator] = function(){  // this  return {   next(){    return{     done:false,     value:1    }   }  } }復制代碼

19.module

在es6前,js文件之間的導入,導出是借助require.js,sea.js,如現在使用import,export,來實現原生javascript的導入,導出。

export:

導出變量或者常量  export const da = 'dadaqianduan' export let da1 = 'da1' export var da2 = 'da1'  const name = 'dada' let name1 = 'dada1' export {  name,  name1 }  導出函數 export function da(value){  console.log(value) }  const da = (value) => {  console.log(value); }  export {  da }  導出Object export({  name: 'da1',  message: 'dadaqianduan' })  let da = {  name: 'name1' } export {  da }  導出Class class Da {  constructor(){   this.id = 1  } } export {  Da }  export class Da {  constructor() {   this.id = 1  } }  修改導出名稱 const name = 'da1' export {  name as cname } export default name復制代碼

import

// 直接導入 const name = 'dada' let name1 = 'dada1' var name2 = 'dada2' export {  name as cname } export default name2  import name2, {name1, name} from A復制代碼
export const sqrt = Math.sqrt; export function square(x) {  return x * x; } export function dada(x,y) {  return sqrt(square(x) + square(y)); }  import {square,da} from 'da'; console.log(square(11)); // 121 console.log();復制代碼
export default function() {...} import myFunc from 'myFunc'; export default class{...} import MyClass from 'MyClass'; const inst = new MyClass();復制代碼

20.import, export

require --lib.js-- function add(x,y){  return x + y } module.exports = {  add: add, };  --main.js-- var add = require('lib').addd; console.log(add(1,2));復制代碼
import --lib.js-- export function add(x,y) {  return x + y } --main.js-- import {add} from 'lib'; console.log(add(1,2));復制代碼
--lib.js-- export const sqrt = Math.sqrt; export function square(x) {  return x * x; } export function da(x,y) {  return sqrt(square(x)+square(y)); } --main.js-- import {square, da} from 'lib'   --myFunc.js-- export default function() {...}; --main.js-- import myFunc from 'myFunc'; myFunc();復制代碼

21.Array.prototype.includes,Promise

該方法判斷一個數組是否包含一個指定的值,返回布爾值

let da1 = [1,2,3]; console.log(da1.includes(2));復制代碼
arr.find(function(item){ return item === 1; })  arr.filter(function(item){ return item === 2; })  Math.pow(2,3)->2**3復制代碼
async function firstAsync(){  let promise = new Promise ((resolve,reject) => {   setTimeout(function(){    resolve('dadaqianduan')   },1000)  })  console.log(await promise)  console.log(await Promise.resolve(1))  console.log(2)  return Promise.resolve(3) } firstAsync().then(val => {  console.log(val) })復制代碼

await后面是Promise對象

Object.values()返回一個數組,其元素是再對象上找到的可枚舉屬性值。

let da = {  'da': 1,  'da2': 2 } console.log(Object.value(da)) // [1,2]  Object.values是在對象上找到可枚舉的屬性的值,所以只要這個對象是可枚舉的就可以復制代碼

Object.entries()方法返回一個給定對象自身可枚舉屬性的鍵值對數組

22.JS異步進階

題目一:

Promise.resolve().then(()=>{  console.log(1) }).catch(()=>{  console.log(2) }).then(()=>{  console.log(3) })復制代碼

題目二:

Promise.resolve().then(()=>{  console.log(1)  throw new Error('da') }).catch(()=>{  console.log(2) }).then(()=>{  console.log(3) })復制代碼

題目三:

Promise.resolve().then(()=>{  console.log(1)  throw new Error('da') }).catch(()=>{  console.log(2) }).catch(()=>{  console.log(3) })復制代碼

題目四:

async function fn() {  return 1 } (async function() {  const a = fn() // ??  const b = await fn() // ?? })()復制代碼

題目五:

console.log(100) setTimeout( () => {  console.log(200) }) Promise.resolve().then( ()=> {  console.log(300) }) console.log(400)復制代碼

題目六:

async function async1() {  console.log('async1 start')  await async2()  console.log('async1 end') }  async function async2 () {  console.log('async2') }  console.log('script start')  setTimeout(function(){  console.log('setTimeout') },0)  async1()  new Promise(function (resolve){  console.log('promise1')  resolve() }).then(function(){  console.log('promise2') })  console.log('script end')復制代碼

加載圖片:

// 加載 function  loadImg(src) {  const p = new Promise(   (resolve,reject) => {    const img = document.createElement('img')    img.onload = () =>{     resolve(img)    }    img.onerror = () =>{     const err = new Error('圖片加載失敗')     reject(err)    }    img.src = src   }  )  return p } const url = 'https' const p = loadImg(url)  p.then(img =>{  console.log(img.width)  return img }).then(img =>{  console.log(img.height) }).catch(ex => {  console.error(ex) })復制代碼
async function async1() {  console.log('async1 start') // 2  await async2() // undefined  console.log('async1 end') // 5 } async function async2() {  console.log('async2') // 3 } console.log('script start') // 1 async1() console.log('script end') // 4復制代碼

for…of常用于異步的遍歷

function add(num) {  return new Promise(resolve => {   setTimeout(()=>{    resolve(num*num)   },1000)  }) } const nums = [1,2,3] nums.forEach(async(i)=>{  const res = await add(i) })復制代碼

23.宏任務和微任務

宏任務:setTimeout,setInterval,ajax等 微任務:Promise async/await

微任務執行時比宏任務要早:

宏任務:DOM渲染后觸發,如setTimeout

微任務:DOM渲染前觸發,如Promise

24.For await of 異步操作集合

function da(time) {  return new Promise(function(resolve,reject){   setTimeout(function(){    resolve(time)   },time)  }) } async function test() {  let arr = [da(2000),da(1000),da(3000)]  for await (let item of arr) {   console.log(Date.now(), item)  } }復制代碼
const input = {  a: 1,  b: 2 } const output = {  ...input,  c: 3 } console.log(output)  const input = {  a: 1,  b: 2,  c: 3 } let {a, ...rest } = input復制代碼

25Array.prototype.flat()

該方法會按照一個可指定的深度遞歸遍歷數組,并將所有元素與遍歷到的子數組中的元素合為一個新數組。

Array.prototype.flat()建議將數組遞歸展平至指定范圍depth并返回新數組。

depth(指定要提取嵌套數組的結構深度)

語法:Array.prototype.flat(depth)

depth —默認值1,Infinity用于展平所有嵌套數組。

const numbers = [1, 2, [3, 4, [5, 6]]];  // Considers default depth of 1 numbers.flat();   > [1, 2, 3, 4, [5, 6]]  // With depth of 2 numbers.flat(2);   > [1, 2, 3, 4, 5, 6]  // Executes two flat operations numbers.flat().flat();   > [1, 2, 3, 4, 5, 6]  // Flattens recursively until the array contains no nested arrays  numbers.flat(Infinity) > [1, 2, 3, 4, 5, 6]復制代碼

語法:Array.prototype.flatMap(callback)

callback:function產生新Array的元素。

const numbers = [1, 2, 3];  numbers.map(x => [x * 2]); > [[2], [4], [6]]  numbers.flatMap(x => [x * 2]); > [2, 4, 6]復制代碼

Object.fromEntries

Object.fromEntries執行與的相反操作Object.entries。它將一組鍵值對轉換為一個對象。

const records = [['name','da'], ['age', 32]];  const obj = Object.fromEntries(records);  > { name: 'da', age: 32}  Object.entries(obj);  > [['name','Mathew'], ['age', 32]];復制代碼

Symbol.prototype.description

只讀屬性,返回Symbol對象的可選描述:

Symbol('desc').toString(); > "Symbol(desc)"  Symbol('desc').description;   > "desc"  Symbol('').description;       > ""  Symbol().description; > undefined復制代碼

完結,笑納。

想了解

贊(0)
分享到: 更多 (0)
網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
主站蜘蛛池模板: 伊人福利在线 | 国户精品久久久久久久久久久不卡 | 在线免费观看国产视频 | 亚洲成人午夜影院 | 看av网站 | 在线成人免费视频 | 亚洲乱轮视频 | 久久精品免费观看 | av永久网站| 亚洲色域网 | 什么网站可以看毛片 | 欧洲一区二区视频 | 午夜a区 | 日本黄色大片在线观看 | 国产剧情av在线播放 | 国产操操操 | 黄色大片免费在线观看 | 国产精品6| 久久艳片www.17c.com | 丁香六月欧美 | 日韩中文在线观看 | 亚洲第一黄网 | 免费婷婷 | 欧美日韩在线观看一区二区三区 | 激情久久一区 | 五月婷综合网 | 国产一二 | 亚洲欧美激情一区二区三区 | av色播| 上原亚衣在线观看 | 免费一级淫片 | 免费av视屏 | 色蜜桃av| 男操女视频在线观看 | 人人澡人人爱 | 国产性自拍 | 国产一区黄色 | 日韩欧美精品久久 | 黄色免费网站视频 | 97se亚洲国产综合自在线小说 | 国产传媒在线观看 | 一级黄色大片免费看 | 一区二区免费在线视频 | 毛片在线免费视频 | www.毛片.com| 日日夜夜免费精品 | 久草最新视频 | 国产色播 | 99热只有 | 丰满大乳少妇在线观看网站 | 中文字幕免费播放 | 久久一视频 | 亚洲国产网 | 午夜资源 | 国产一级黄 | 91精品国产综合久久久久久 | 在线免费黄 | 亚洲国产中文字幕 | 色一情一伦一子一伦一区 | 在线观看亚洲视频 | 欧美高清免费 | 毛片毛多水多 | 中文字幕欧美日韩在线 | 亚洲午夜久久久久久久久红桃 | 69产性猛交xxxx乱大交 | 华人色| 五月婷婷激情 | 久久久观看 | 日韩理论片| 最近好看的2019中文在线一页 | 欧美亚洲激情视频 | 亚洲一级片大全 | 日韩中文字幕免费 | 国产精品日韩欧美 | 久久精品一区 | 97超碰伊人 | 浪荡奴双性跪着伺候 | 欧美乱大交xxxxx | 18在线观看免费入口 | 日韩乱论 | 91精品综合 | 亚洲成色 | 河北彩花av在线播放 | 狠狠操狠狠 | 亚洲伦理中文字幕 | 婷婷色婷婷 | 天天天操操操 | 999亚洲欲妇 | 国产91成人 | 亚欧美视频 | 男人天堂av网| 91禁动漫在线 | 中文字幕33页 | 欧美一性一乱一交一视频 | 欧美一区精品 | 伊人久久九| 精品国产99| 国产视频黄色 | 人人爱人人看 | 亚洲欧美日韩国产 | 欧美一级淫片 | 91欧美激情一区二区三区成人 | 97福利社 | 综合在线观看 | 欧美伦理一区二区三区 | 国产成人在线视频播放 | 一级黄网站 | 日本xxxx在线观看 | 亚洲乱码一区av黑人高潮 | 成人先锋av | 极品粉嫩国产48尤物在线播放 | 精品福利一区二区 | 一级做a爰片 | 成人xxxx| 乱视频在线观看 | 在线免费观看av网址 | 精品日日夜夜 | 国产网红主播三级精品视频 | 看av在线 | 欧美a视频在线观看 | 亚洲性夜 | 成人精品一区二区三区 | 天堂伊人| 亚洲精品第五页 | 四虎在线免费观看 | 女同爱爱视频 | 国产一区二区免费看 | 国产日韩精品一区二区 | 成人xxx视频 | 久久男人 | 91在线影院 | 69国产精品视频免费观看 | 91成人在线播放 | 日韩女优在线观看 | 国产又粗又爽视频 | 一级成人黄色片 | 中文字幕日韩精品一区 | 在线观看成人小视频 | av福利网站| 久免费一级suv好看的国产 | 少妇与公做了夜伦理69 | 一级片免费观看视频 | 色婷婷一区二区三区 | 国产精品高潮呻吟av久久4虎 | 青娱乐国产在线 | 亚洲毛片欧洲毛片国产一品色 | 天堂视频免费在线观看 | 久久一级片免费看 | 色狠狠久久av大岛优香 | 日韩精品在线看 | 在线观看视频一区二区三区 | 国产精品久久久久久久免费看 | 国产在线观看成人 | 午夜专区| 亚洲黄色片网站 | 国内成人av | 亚洲加勒比| 免费看黄色小视频 | 多男调教一女折磨高潮高h www久久久com | 亚洲综合自拍偷拍 | 久久精品国产一区二区 | 综合网视频 | 99亚洲视频 | 永久免费视频 国产 | 免费一级黄 | 日b免费视频 | 成人免费福利网站 | 精品久久91 | 农村妇女毛片精品久久久 | 亚洲精品九九 | 一区二区亚洲 | 亚洲精品成人久久 | 日本久久黄色 | 国产精品黄色av | 国产精品久久久久久久久免费看 | 亚洲视频欧美 | 金瓶狂野欧美性猛交xxxx | 毛片在线看片 | 91av色| 亚洲女人天堂av | 亚洲精品视频在线观看免费 | 99国产在线播放 | 波多野结衣三区 | 中文字幕欧美在线观看 | 丝袜调教91porn | 久久久国产精品视频 | 午夜影院福利视频 | 日韩毛片网 | 欧美做受视频 | 婷婷综合六月 | 国产一区二区在线播放视频 | 欧美永久免费 | www.天堂在线 | wwwav在线| 狠狠操网站 | 中文字幕日本视频 | wwwxxx亚洲| 中文综合网 | 国产精品老牛影视 | 91精品国产乱码久久久张津瑜 | h国产视频 | 亚洲天堂网在线观看 | 久久精品性 | 人人干人人艹 | 91在线公开视频 | 九一国产精品 | 99精品一区二区三区 | 一a一片一级一片啪啪 | 白浆导航| 波多野结衣av在线免费观看 | 欧美成人精品激情在线视频 | 波多野结衣av在线播放 | 日本一区二区精品 | 狠狠干2018 | 2018国产精华国产精品 | 在线免费黄色av | 成人午夜在线观看视频 | 黄色片一区二区三区 | 国产乱妇4p交换乱免费视频 | 操女人网址| 7777精品伊人久久久大香 | 国产高清在线 | 亚洲自拍一区在线观看 | 一本色道综合久久欧美日韩精品 | 国产v亚洲v天堂无码 | wwwwxxxxx日本 | 五月天伊人网 | 草草视频在线观看 | 超碰cao草棚gao进入蜜桃 | 亚洲综合自拍偷拍 | 国产精品成人一区二区网站软件 | 另类自拍偷拍 | 日韩国产激情 | 一级黄色网址 | 精品一区在线播放 | 打开免费观看视频在线播放 | 欧美日韩一二三 | 日韩欧美在线一区二区 | theav精尽人亡av | 国产福利午夜 | 国外亚洲成av人片在线观看 | 最近中文字幕无免费 | 曰韩中文字幕 | 亚洲剧情在线 | 欧美黄色录像带 | 久草99| 自拍亚洲综合 | 少妇高潮久久久 | 色之久久综合 | 久久久久夜 | 亚洲日本在线播放 | 国产一级片一区二区 | 日本裸体xx少妇18在线 | 欧美极品少妇xxxxⅹ免费视频 | 国产女人爽到高潮久久久4444 | 日韩中文字幕免费观看 | 91久久国产 | 牛牛澡牛牛爽一区二区 | 午夜精品久久久久久久久久久 | 欧洲精品久久 | 久久久精| 美国黄色一级大片 | 伊人成年综合网 | 蜜美杏av| 中文字幕自拍偷拍 | 狠狠2020| 日韩精品视频免费播放 | 午夜视频在线观看网站 | 久久这里有精品视频 | 成人黄色一级 | 国产精品区二区三区日本 | 春闺艳妇(h)高h产乳 | 日韩在线视频看看 | 伊人95| 亚洲视频天堂 | 成人福利片 | 免费观看成年人视频 | 中文在线第一页 | 夜夜爽88888免费视频4848 | 亚洲天堂2024 | 欧产日产国产69 | 日本精品影院 | 四虎在线观看视频 | 国产在线视频资源 | 国产重口老太伦 | 大色av| 国产精品1| 91色网站| 国产精品福利一区二区三区 | 亚洲天堂123| 永久在线观看 | 91香蕉久久 | 污视频在线网站 | 怡红院男人的天堂 | 日本久久精品视频 | 中文字幕网站在线 | 亚洲精品97| 日日干日日射 | 伊人久久综合影院 | 国产精品欧美久久久久天天影视 | 久久精热 | 国产成人啪精品午夜在线观看 | 欧美一区二区三区免费视频 | 亚洲伦理久久 | 欧美与黑人午夜性猛交久久久 | 亚洲成人精品女人久久久 | 黄色成年人网站在线观看 | 免费高清毛片 | 国产91丝袜在线播放 | 亚洲综合成人网 | 成人看的毛片 | 97视频久久| 99re久久精品国产 | 成年人视频在线看 | 色偷偷888欧美精品久久久 | 狠狠躁夜夜躁人人爽天天高潮 | 国产免费黄色网址 | 欧美另类极品videosbest使用方法 | 免费在线a| 欧美日韩一级视频 | 一本大道综合伊人精品热热 | 韩国午夜影院 | 18岁毛片| 久久一区二区三区视频 | 色av网站| 特级毛片在线 | 欧美日韩aaa | 放荡闺蜜高h苏桃情事h | 国产欧美日韩在线播放不了吗 | 一区二区免费 | www色av| 中文字幕在线精品 | 亚洲综合1区 | 亚洲性在线观看 | 亚洲羞羞| 91最新在线 | 好吊妞这里只有精品 | 久草综合在线 | 久草婷婷| 天堂综合网 | 调教亲女小嫩苞h文小说 | 日韩精品伦理 | 成人a免费看 | 欧美日韩中文在线观看 | 在线看日韩av | 黄色av日韩| 成人网战| 亚洲日本不卡 | www.国产在线观看 | 色5月婷婷 | 秋霞午夜鲁丝一区二区老狼 | www.在线观看网站 | 国模私拍一区二区三区 | www久久久 | 亚洲成人中文字幕 | 在线看黄网 | 57pao国产精品一区 | eee女女色www网站 | 国产寡妇一级农村野外战 | 国产性xxx | 91九色在线观看 | 黄色一级片| 国产精品免费视频观看 | 国内偷拍一区 | 日韩狠狠操 | 日韩黄色三级 | 精品国产乱码久久久久久婷婷 | 亚洲自拍一区在线观看 | 日本成人片网站 | 不用播放器的av网站 | 成年人黄色 | 国产91视频在线观看 | 九九热视频精品 | av日韩在线播放 | 性生活视频在线播放 | 国产欧美日韩亚洲 | 性色生活片 | 欧美午夜视频 | 九一国产在线观看 | 免费精品久久 | 秋霞国产午夜精品免费视频 | 天堂成人在线观看 | 国产精品国产三级国产aⅴ浪潮 | 亚洲免费成人网 | 色噜噜一区二区三区 | 黄色激情视频网站 | 日韩精品一区二区不卡 | 禁网站在线观看免费视频 | 久久毛片视频 | 国产特级淫片免费看 | 超碰999 | 亚洲视频99 | 男操女视频网站 | 一级片在线观看视频 | 8mav精品成人 | 春闺艳妇(h)高h产乳 | 午夜一级黄色大片 | 夜夜爽88888免费视频4848 | 日韩中文字幕在线 | 久久一区二区三区四区 | 亚洲一卡一卡 | 黄色免费播放 | 久久久久久免费 | av免费在线网站 | 日韩国产在线观看 | 黄色激情视频在线观看 | 狠狠夜夜 | 尤物视频在线免费观看 | 亚洲美女激情视频 | 久久成人福利 | 成人午夜免费毛片 | 久久99精品波多结衣一区 | 激情综合网五月天 | 亚洲精品一 | 夜夜爽88888免费视频4848 | 国产a级免费 | 午夜一区在线观看 | 欧美图片一区二区三区 | 操皮视频 | 日韩一区二区在线观看视频 | h狠狠躁死你h高h | 亚洲一区二区a | av综合导航 | 亚洲午夜精品久久久 | 亚洲激情视频在线观看 | 少妇一级淫片免费视频 | 亚洲男人天堂网址 | 日韩欧美一级 | 中文字幕福利视频 | 伊人视屏 | 亚洲欧美日韩久久 | 奇米在线观看 | 国产激情网站 | www.日批 | 国产人人草 | 在线免费一级片 | 一级黄色网 | 美日韩av在线 | 精品久久久久一区二区 | 国产爱搞| 人人草人人看 | 亚洲xxxxxx| 成人欧美一区二区三区在线播放 | 和漂亮岳做爰3中文字幕 | 免费av黄色| 少妇精品偷拍高潮白浆 | 日本不卡123| 福利色播 | 国产精品女人久久久 | 日本特级a一片免费观看 | 亚洲性av| 国产精品欧美久久久久一区二区 | 日韩第三页 | 久久久久久久久久久久久女国产乱 | 国产精品一区二区在线免费观看 | 亚洲国产成人一区二区精品区 | 亚洲风情av | 国产视频精选 | 91视频一区| 91人人干 | 热久久国产精品 | 欧美性猛交xxxxx水多 | 乱h高h3p男女三人行 | 呦女精品 | 精品少妇一区二区三区免费观 | 婷婷五月小说 | 欧美一本在线 | 亚洲精品午夜aaa久久久 | 黄色av网站网址 | 日日爱669| 亚洲国产精品成人无久久精品 | 色优久久| 国产乱码久久久 | 欧美久久久久久久 | 91视频免费看 | 午夜av在线 | 色屁屁草草影院ccyycom | 国产啊啊啊啊 | 日韩中文字幕在线观看 | 日本精品一二三 | 国产欧美综合视频 | 日韩精品一区二区三区在线 | 欧美在线激情视频 | 精品久久久久久久久久久久久久久久久 | 国产超薄肉色丝袜足j | 4438亚洲最大 | 国产精品资源网 | 久久久久久久久久久免费av | 久久九九免费视频 | 中文字幕第31页 | 97超碰导航 | 色婷婷综合网 | 久久免费黄色网址 | 成人有色视频 | 亚洲精品久久久久久下一站 | 亚洲免费在线 | 亚洲午夜精品久久久 | 欧美精品日韩 | 欧美精品一区二 | av网址在线看 | 久久爱资源网 | 欧美精品导航 | 久久这里有精品 | 看全色黄大色黄大片女图片第一次 | 欧美日韩在线免费视频 | 国产福利资源在线 | 九九精品视频在线观看 | 黄色网免费| 午夜影视av | 永久91嫩草亚洲精品人人 | 网友自拍av| 4438全国最大成人网 | 麻豆精品免费观看 | 911美女片黄在线观看游戏 | 乱xxxxx普通话对白 | 中文字幕成人动漫 | 国产一级α片 | 国产欧美中文字幕 | 欧美亚一区二区三区 | 亚洲成色999久久网站 | 精品欧美乱码久久久久久 | 97视频免费 | 久久久社区| 成人精品三级av在线看 | 久久综合99 | 一本一道波多野结衣一区二区 | 成人短视频在线播放 | 五月综合色 | 日韩欧美一区二区三区视频 | 久久亚洲高清 | 国产精品久久麻豆 | 免费精品在线 | 亚洲欧美日本国产 | 69国产精品视频免费观看 | 久久国产热 | 国产精品一二三 | 日韩欧美偷拍 | 一级特级毛片 | 国内精品久久久久久久影视简单 | 国产亚洲va天堂va777 | 亚洲视频中文字幕 | 欧美黑人一级爽快片淫片高清 | 麻豆婷婷| 99久久精品免费 | 最新av中文字幕 | 久久aⅴ国产欧美74aaa | 又长又硬又粗一区二区三区 | 在线观看视频区 | 日韩不卡一二三区 | 亚洲欧美日韩在线一区 | 狠狠干中文字幕 | 精品久久久久久久久久久久久久久 | 午夜视频h | 国产精品久久久久久久久久久新郎 | 日韩欧美中字 | 91久久久久久久久久久久 | 91国偷自产一区二区三区观看 | 成人区精品一区二区婷婷 | 91未成人在线观看喷潮 | 污视频免费看 | 又紧又大又爽精品一区二区 | 国产福利一区二区三区 | 五月天激情婷婷 | 久久婷婷影院 | 日韩和的一区二区 | av播放网站| 免费欧美| 成人网一区 | 国产精品v欧美精品v日韩 | 国产美女无遮挡免费视频 | 欧美日韩xxxx| 精品国产乱码久久久久夜 | 裸体按摩www性xxxcom | 国产色吧| 91精品国产综合久久久蜜臀粉嫩 | 久久国产香蕉视频 | 成人午夜大片 | 自拍偷拍2019 | 国产成人亚洲综合a∨婷婷 精品久久久久久国产 | 日韩中文字幕久久 | 国产午夜精品一区 | 最近更新2019中文字幕 | 一起草国产 | 成人免费在线看片 | 青草视频在线观看免费 | 可以看的av网址 | 精品一区视频 | 久久视频免费看 | 美梦视频大全在线观看高清 | 亚洲第一第二区 | 在线男人天堂网 | 刘亦菲久久免费一区二区 | 男人插女人视频网站 | 黄色日韩| 国产精品自产拍在线观看 | 国产高清日韩 | 九九综合久久 | 欧美少妇诱惑 | 偷拍精品一区二区三区 | 99视频在线 | 国产一级视频 | 亚洲精品.www | 日韩精品免费 | 男女激情av| 成人看片17c.com | 国产精品成人一区二区网站软件 | 香蕉私人影院 | a天堂中文| 婷综合 | 91在线精品视频 | 欧美一级大片免费看 | 正在播放91 | av天天有 | 日韩成人福利 | 日韩视频免费观看高清 | 五月涩 | 亚洲а∨天堂久久精品喷水 | 国产精品久久久久久久久搜平片 | 亚洲精品自拍偷拍 | 婷婷六月在线 | 在线观看中文字幕2021 | 成年人免费看视频 | 日韩av在线播放观看 | 亚洲无人区码一码二码三码 | 国产a一级片 | 精品久久成人 | 亚洲精品国产第一综合99久久 | 国产成人久久 | www.性欧美| 国产欧美一区二区三区在线看蜜臂 | 国产精品视频专区 | 久久国产美女 | a级片黄色 | av官网在线 | 伊人网中文字幕 | 色婷av| 黄瓜视频在线免费看 | 天天上天天干 | 玖玖在线免费视频 | 欧美一级视频免费观看 | 成人在线网址 | 欧美人一级淫片a免费播放 www.日韩高清 | 夜夜爽av | 中文在线a∨在线 | 欧美视频一区二区 | caoporn视频在线 | 久久久一 | 俺来也在线视频 | 亚洲一区二区三区国产精华液 | 亚洲永久在线 | www.亚洲综合 | 伊人影视在线 | 欧美一区二区人人喊爽 | 咪咪色图 | 伊人网免费视频 | 亚洲精品中文字幕在线观看 | 91在线观看视频网站 | 老色批永久免费网站www | 黄色一级片免费观看 | 91在线影院 | 欧美区在线 | 91偷拍视频| 妖精视频一区二区三区 | 国产精品视频观看 | 欧美第一页 | 久久99精品一区二区三区 | 成年人香蕉视频 | 越南性xxxx精品hd | 国产一区黄 | 精品视频九九 | 天天干天天天 | 日韩少妇精品 | 在线看黄网 | xxxx午夜 | 性福利影院 | 九九热免费在线视频 | 综合激情五月婷婷 | wwwav在线| 真人bbbbbbbbb毛片 | 男生插女生视频 | 国产免费高清视频 | 亚洲男女视频在线观看 | 亚洲精选av| 久久男人的天堂 | 欧美大波大乳巨大乳 | 伊人久艹| 99精品视频免费看 | 围产精品久久久久久久 | 亚洲综合av一区二区三区 | 看一级大片| 伊人影院在线视频 | 亚洲高清中文字幕 | 中国一极毛片 | 国产精品一区二区在线免费观看 | 成人免费视频国产免费 | 午夜成人免费影院 | 亚洲成人av网址 | 男女激情啪啪 | 特级淫片aaaaaaa级 | 欧美日韩亚洲综合 | 一区二区三区手机在线观看 | 欧美日韩国产成人 | 男人的天堂久久 | 又粗又硬国语对白 | 天天爽夜夜爽夜夜爽 | 国产精品九九九九九 | 亚洲一区在线播放 | 四虎黄色片 | 国产成人a亚洲精品 | 午夜草逼 | 97视频网站 | 黄色福利| 欧美做爰猛烈床戏大尺度 | av亚洲在线观看 | 亚洲久久视频 | 插插插91 | 日韩三级在线免费观看 | 欧美黄色a级 | 中文字幕无人区二 | 国产三级午夜理伦三级 | 国产伦精品一区二区三区在线 | 日韩精品视频在线观看免费 | 在线免费看av | av高清在线| 一区二区三区高清视频在线观看 | 亚洲精品播放 | 亚洲依依 | 国产又爽又黄的视频 | аⅴ资源新版在线天堂 | 伊人影院在线播放 | 99热免费观看 | 成人激情四射网 | 波多野结衣在线播放视频 | 7777奇米影视 | 亚洲黄色精品视频 | www.69视频 | 亚洲在线一区二区三区 | 国产黄色片视频 | 午夜男人的天堂 | 亚洲欧美爱爱 | 天天爽天天做 | 亚洲精品91天天久久人人 | 欧美一级淫片免费视频黄 | 欧美二区在线观看 | 欧美亚洲另类在线 | 91成人亚洲 | 欧美一区久久 | 国产精品人人爽 | 欧美视频不卡 | 亚洲精品一区二区三区蜜桃久 | 国产伦精品一区二区三区免费优势 | 香蕉视频黄色片 | 亚洲欧美另类一区 | 黄瓜视频在线观看污 | 亚洲精品一区中文字幕乱码 | 日韩视频在线播放 | 青青操久久 | 亚洲国产视频在线观看 | 夜夜骑天天操 | 伊人网五月天 | 欧美色吊丝 | 精品视频久久久久 | 色av色婷婷| 亚洲女同在线观看 | 激情全身裸吻胸 | 在线中文字幕网站 | 蜜桃精品噜噜噜成人av | 成年人性视频 | 99热这里只有精品99 | 亚欧av在线播放 | 欧美日韩无 | 久久综合激情网 | 天天操免费视频 | 伊人福利| 不卡日本 | 超碰免费在线播放 | 日韩av网页| 欧美日韩在线观看一区二区三区 | av福利院 | 五月婷婷国产 | 亚洲成人自拍偷拍 | 日韩久草 | 自拍99页| 免费成人高清视频 | 欧美三级在线 | 国产精品suv一区二区69 | 国产精品热久久 | 99国产精品久久久 | 日韩精品在线一区二区三区 | 极品色av | 亚洲九区 | 久久久综合网 | 久久大香伊蕉在人线观看热2 | 日韩在线黄色 | 91在线视频一区 | 免费精品久久 | 黄色aaa大片 | 另类小说av | 美女精品一区 | 免费中文字幕在线观看 | 日韩区欧美区 | 福利精品| 最近中文字幕日本 | 国产三级在线观看 | 亚洲午夜久久久久久久久 | 国产乱码精品一区二区三区精东 | 日韩中文字幕第一页 | 亚洲操比| 国产午夜麻豆影院在线观看 | 黄色1级视频 | 免费成人看视频 | 瑟瑟在线观看 | 91精品国产乱码久久久张津瑜 | 这里只有精品免费视频 | 三级福利视频 | 欧美9999| 三级黄色在线视频 | 一本加勒比hezyo综合 | 五月婷婷六月丁香 | 国产一区欧美二区 | 午夜在线观看免费视频 | 中文字幕有码在线视频 | 成人免费一级伦理片在线播放 | 99在线免费观看 | 99精品免费视频 | 直接看毛片| 毛片官网 | 欧美与黑人午夜性猛交久久久 | 国产欧美不卡 | 伊人超碰在线 | 成年人看片网站 | 一区二区三区免费在线观看 | 美女插插 | 国产又粗又硬又长又爽的演员 | 国产精品一区二区三区四区五区 | 99成人精品视频 | 婷婷久久伊人 | 亚洲视频1 | 成人黄色在线视频 | 黑人巨大精品欧美一区二区免费 | 日本黄色片一级 | 毛片久久久 | 在线免费91 | 成人av一区二区三区在线观看 | 色伊人网 | 毛片99| 亚洲成人黄色小说 | 久操福利视频 | 国产原创av在线 | 一本一道久久 | 国产日韩欧美高清 | 你懂的欧美 | 国产精品久久久久久久久免费高清 | 亚洲四虎影院 | 两性囗交做爰视频 | www啪啪 | 在线中文字幕网站 | 韩国美女啪啪 | 自拍第1页| 日韩成人在线观看视频 | 悟空影视大全免费高清观看在线 | 成人在线视频网址 | 看国产毛片 | 午夜性刺激免费视频 | 欧美一级黄视频 | 美女精品网站 | 亚洲欧美色视频 | 国产大片aaa | 黄色免费网站在线 | 亚洲福利视频导航 | 亚洲欧美综合一区 | 国产黄色一区二区三区 | 亚洲精品成人在线视频 | 天天综合网久久综合网 | 亚洲精品国产精品乱码不99按摩 | 国产午夜精品一区二区三区四区 | 特级特黄aaaa免费看 | 成人爽a毛片一区二区免费 激情伊人 | 蜜臀视频网站 | 九色porn蝌蚪 | 色香蕉在线视频 | 欧美亚一区二区三区 | 日本一级淫片免费放 | 开心六月婷婷 | 蜜臀久久99精品久久久久宅男 | 情涩快播 | 亚洲视频中文字幕 | 久操福利在线 | 日韩国产欧美一区二区 | 国产一区亚洲 | 久久99久久99精品免视看婷婷 | 三级av | 国产精品资源在线 | 福利一区二区三区四区 | 免费国产 | 午夜视频在线免费观看 | 秋霞免费av | 伊人在线视频 | 九九热精品视频在线播放 | 日韩六区 | www.黄色小说.com | 国产日韩在线观看视频 | 91精品国产综合久久福利软件 | 91干| 一区二区三区四区视频在线观看 | 日韩免费视频一区 | 国产午夜在线观看 | 在线观看黄 | 久久草视频在线 | 中国女人一级一次看片 | 日韩精品xxx | jizz内谢中国亚洲jizz | 宅男视频污 | 欧洲亚洲一区二区 | 在线观看免费视频一区 | 啪啪av| 台湾swag在线播放 | 99成人在线视频 | 最近中文字幕日本 | 香蕉久久视频 | 一区二区视频欧美 | 香蕉视频在线免费 | 国产www在线观看 | 亚洲综合性 | 中文字幕123区 | 国产资源视频 | 超碰男人的天堂 | 成人女同在线观看 | 久久伊人色 | 黄色大片日本 | 久久精品一区二区三区四区 | 在线日韩精品在线 | 99精品久久久久久中文字幕 | 五月婷婷丁香六月 | 亚洲高清视频免费观看 | 国产丝袜视频 | 国产56页 | 国产精品国产精品国产专区蜜臀ah | 九九热在线视频播放 | 日日碰日日摸 | 国产大奶 | 久久久全国免费视频 | 一二三四日本高清社区5 | 一本加勒比北条麻妃 | 国户精品久久久久久久久久久不卡 | 色哟哟在线播放 | 91精品国产自产 | 伊人网在线观看 | 国产一区二区在线精品 | 假日游船| 久久久亚洲精品视频 | www.国产高清| 91播放在线 | 蜜色av | 成人播放器 | 91超碰国产在线 | 97人人艹| 五月婷中文字幕 | 国产美女在线免费 | 国产91精品久久久 | 欧美第四页| 97视频免费 | 伊人91在线 | 日本少妇网站 | 日本一级一片免费视频 | www.久久久.com | 日本大尺度做爰呻吟舌吻 | 国产精品午夜未成人免费观看 | 欧美夜夜骑 | 欧美日韩字幕 | 特级西西444www高清大胆免费看 | 超碰在线最新 | 热久久久 | av少妇在线 | 9色视频 | 91麻豆成人精品国产免费网站 | 久久超碰在线 | 一级全黄男女免费大片 | 亚洲精品一区二区在线 | 玉足女爽爽91 | 69影院少妇在线观看 | 日韩精品激情 | 亚洲五月网 | 亚欧视频在线观看 | 日韩欧美国产另类 | 成人理论视频 | www四虎| 欧美日韩大片在线观看 | 精品久久久久久久 | 久久精品夜色噜噜亚洲a∨ 在线中文字幕播放 | 亚洲青涩在线 | 求欧美精品网址 | 狠狠干2020 | 青青草91视频 | 91在线观看. | 天天搞夜夜| 日韩av第一页 | 亚洲欧美日韩一区二区 | 有码一区|