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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 综合教程 >内容正文

综合教程

抱着枸杞奋战多夜,我总结了JavaScript与ES的25个重要知识点

發布時間:2023/12/29 综合教程 39 生活家
生活随笔 收集整理的這篇文章主要介紹了 抱着枸杞奋战多夜,我总结了JavaScript与ES的25个重要知识点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

相關學習推薦:javascript

前言

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

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

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);復制代碼

一個類中只能有一個名為“constructor"的方法,出現多次構造函數constructor方法會拋出一個SyntaxError錯誤在一個構造方法中可以使用super來調用一個父類的構造方法如果沒有指定一個構造函數方法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]復制代碼

拓展

判斷函數有幾個參數

在 ES5 中可以在函數體內使用 arguments 來判斷。在 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)淺拷貝的過程)

要點:

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復制代碼
let map = new Map([iterable])
// Map是用來實現字典的功能-Object鍵值對復制代碼

動態屬性鍵

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

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

const module_string = `dadaqianduan`復制代碼

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

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

使用多行字符串

在es6之前的版本:

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

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

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

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

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

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

const da = `First
            Second`復制代碼

使用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有以下幾種狀態:

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

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

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

方法:

Promise.all(iterable)

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

Promise.any(iterable)

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

Promise.reject(reason)

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

Promise.resolve(value)

返回一個狀態由給定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代理默認情況下,代理不執行任何操作

示例:

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)復制代碼

target 用Proxy包裝的目標對象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
 }
}復制代碼

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復制代碼

完結,笑納。

想了解更多編程學習,敬請關注php培訓欄目!

總結

以上是生活随笔為你收集整理的抱着枸杞奋战多夜,我总结了JavaScript与ES的25个重要知识点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

99精品国产99久久久久久福利 | 日韩电影精品 | 久久综合久久综合久久综合 | 日韩久久精品一区二区三区 | 久久精品国产免费看久久精品 | 国产无区一区二区三麻豆 | 三级黄色在线 | 国产69精品久久久久99 | 午夜久久久久久久久久影院 | 9999毛片| 免费观看黄| 国产精品一区二区三区观看 | 日韩高清免费无专码区 | 久久不卡国产精品一区二区 | 亚洲视频高清 | 国产小视频在线免费观看 | 国产伦精品一区二区三区在线 | 四虎影视成人永久免费观看亚洲欧美 | 日韩欧美精品一区二区三区经典 | 韩国精品一区二区三区六区色诱 | 九九视频这里只有精品 | 成人久久视频 | 99 国产精品| 亚洲成人av影片 | 成年人在线观看 | 在线看的av网站 | 欧美激情第八页 | 国产青春久久久国产毛片 | 香蕉久久久久 | 久久色中文字幕 | 色噜噜在线观看 | 久草在线精品观看 | 97中文字幕 | 久久97久久97精品免视看 | 日韩xxxxxxxxx| 日韩中文字幕第一页 | 精品视频亚洲 | 在线免费观看视频一区二区三区 | 一区二区三区中文字幕在线 | 国产999精品 | 91黄色在线看| 亚洲高清精品在线 | 日韩av在线小说 | 五月天久久精品 | 国产精品电影一区二区 | 美女久久99 | 成人黄色av免费在线观看 | 久久精品网站视频 | 91久色蝌蚪 | 干av在线 | 日韩小视频网站 | 天天激情综合 | 久久香蕉一区 | 香蕉视频一级 | 国产精品99久久久久的智能播放 | 亚洲成人资源在线观看 | 亚洲日韩精品欧美一区二区 | 国产黄网站在线观看 | 天天草av| 一区二区中文字幕在线播放 | 天堂入口网站 | 在线高清av | 在线高清一区 | 久久综合99 | 国产精品午夜在线观看 | 国产午夜精品免费一区二区三区视频 | 91在线免费视频观看 | 99国产视频在线 | 日韩av二区| 欧美精品做受xxx性少妇 | 亚洲情婷婷 | 成人小视频在线播放 | 波多野结衣视频一区 | www毛片com| 国产精品精品 | 国产91精品高清一区二区三区 | 激情丁香婷婷 | 91高清完整版在线观看 | 99re6热在线精品视频 | 成人黄色视 | 亚洲国产久 | 久久精品国产一区二区电影 | 中文字幕 婷婷 | 国产一区二区三区视频在线 | 亚洲人成在线观看 | 亚洲一区 影院 | 久久人人爽人人爽人人片av软件 | av东方在线 | 波多野结衣在线观看一区二区三区 | 天堂av最新网址 | 久久精品国产免费看久久精品 | www.xxx.性狂虐 | 国产黄色看片 | 亚洲视频一区二区三区在线观看 | 亚洲人成网站精品片在线观看 | 香蕉网在线播放 | 香蕉视频91 | 欧美成年人在线视频 | 青草视频免费观看 | 精品国产99 | 日韩视频在线不卡 | 99热这里只有精品在线观看 | 午夜国产影院 | av在线一二三区 | 久久久久亚洲国产 | 亚洲精品成人av在线 | 国产涩涩网站 | 久久这里有精品 | 精品欧美一区二区在线观看 | 最近能播放的中文字幕 | 18+视频网站链接 | 狠狠干美女| 色综合久久中文字幕综合网 | 九色视频网 | 色婷婷综合久久久 | 色就是色综合 | 亚洲精品视频在线观看视频 | 日韩一区二区三区免费视频 | 亚洲欧洲精品在线 | 看av在线 | 亚洲天堂网在线观看视频 | 久久久色| 超碰av在线免费观看 | 日韩中文在线字幕 | 欧美巨大 | 色婷婷综合久色 | 99在线观看 | 国产黄a三级三级 | 久久久久久久久久久久国产精品 | 伊人婷婷色 | 久久久久久久久久免费 | 日本中文字幕在线播放 | 色婷婷精品 | 午夜在线观看影院 | 国产亚洲免费的视频看 | 天天爱天天 | 久久国产影视 | 久久久久国产一区二区三区四区 | 国产视频在线观看一区 | 欧美 国产 视频 | 久久人人爽人人爽 | 久久香蕉影视 | 国产精品不卡在线播放 | 91亚洲精品乱码久久久久久蜜桃 | 天堂av高清 | 亚洲九九影院 | 六月丁香伊人 | 国产精品91一区 | 激情久久久久久久久久久久久久久久 | 亚洲欧美成人在线 | 久久视频这里只有精品 | 免费视频久久久久 | 国产精品理论片 | 亚洲91精品| 黄色小网站在线 | 手机在线视频福利 | 在线免费观看的av网站 | 成人免费网视频 | 欧美日韩一区二区久久 | 夜夜操夜夜干 | 狠狠的操狠狠的干 | 91成人看片| 三级av免费观看 | 激情综合色播五月 | 在线观看av中文字幕 | 久久99国产精品视频 | 日韩在线三级 | 久久成人在线 | 亚洲精品动漫久久久久 | 日韩欧美精品在线 | 欧美最猛性xxxxx(亚洲精品) | 亚洲欧美乱综合图片区小说区 | 99免费观看视频 | 一级成人网 | 日韩小视频 | 一区二区三区在线观看免费视频 | 69久久夜色精品国产69 | www.久久久久 | 久久久精品免费观看 | 成人黄色电影在线观看 | 欧美日韩高清一区二区 | 色资源网免费观看视频 | 欧美韩日精品 | 国产亚洲精品久久久久久移动网络 | 奇米导航 | 欧美aaa视频| 奇米影视777影音先锋 | 色就色,综合激情 | 99久久99视频只有精品 | 国内精品久久久久久 | 亚洲精品午夜aaa久久久 | 99精品国产一区二区三区麻豆 | 亚洲美女精品区人人人人 | 久久精品人人做人人综合老师 | 色婷婷综合久久久 | 夜夜躁狠狠躁日日躁 | 成人av网站在线播放 | 在线观看国产91 | 日韩中文字幕免费在线观看 | 国产人成精品一区二区三 | 欧美夫妻性生活电影 | 天天操天天添天天吹 | 亚洲综合色丁香婷婷六月图片 | 久久公开免费视频 | 午夜丁香视频在线观看 | 久久久久久久久久久免费av | 精品在线一区二区 | 国产麻豆精品在线观看 | 日韩成人免费在线电影 | 午夜视频在线瓜伦 | 欧美天堂视频在线 | 国产精品美女久久久久久网站 | 久久a免费视频 | 国产精品久久久久久久久久免费看 | 久艹视频在线观看 | 中文字幕有码在线播放 | 久久理伦片 | 人人擦 | 婷婷在线精品视频 | www.狠狠操.com| 97超碰人人澡人人爱学生 | 国产精品成人免费精品自在线观看 | 精品一区二区三区电影 | 在线观看国产一区二区 | 国产黄在线播放 | www亚洲视频 | va视频在线观看 | 国产精品久久久久久久久久三级 | 麻豆91精品| 日日夜夜爱 | 国产91成人在在线播放 | 国产精品门事件 | 国产字幕在线播放 | 一区二区精 | 97理论电影 | 亚洲视频在线免费看 | 四虎8848免费高清在线观看 | 国产精品18久久久久白浆 | 中文字幕二区在线观看 | 国产免费叼嘿网站免费 | 久久精品男人的天堂 | 日韩网站在线观看 | 成人精品一区二区三区中文字幕 | 国产成人精品午夜在线播放 | 激情综合啪啪 | 中文字幕 在线看 | 天堂av在线免费 | 高清av在线免费观看 | 美女视频黄免费的久久 | 久久天堂影院 | 欧美久久九九 | 免费男女羞羞的视频网站中文字幕 | 91av看片| 午夜少妇| 91精品国产91久久久久久三级 | 操综合| 亚洲精品在线视频观看 | 日韩欧美一区二区三区免费观看 | 久久综合操 | 国内视频在线 | 伊人婷婷色 | 日韩中文免费视频 | 国产一级免费在线观看 | 99精品视频在线免费观看 | 国产美女黄网站免费 | 日韩视频中文字幕 | 国产伦理久久精品久久久久_ | 欧美日韩在线视频一区 | 国产一区视频导航 | 欧美日韩在线电影 | 日韩欧美一区二区三区黑寡妇 | 蜜臀av在线一区二区三区 | 蜜臀av性久久久久蜜臀aⅴ四虎 | 最近中文字幕免费 | 天天操天天射天天插 | 亚洲精品婷婷 | 国产九九精品视频 | 久亚洲| 久久久久久久久久久久久国产精品 | 亚洲电影成人 | 美女黄网久久 | 中文字幕色婷婷在线视频 | 伊人电影天堂 | 国产精品综合在线观看 | 亚洲国产精品一区二区久久,亚洲午夜 | 中文字幕av最新更新 | 天天干天天摸 | av免费看电影 | 久久精品一区八戒影视 | 天天爱av导航| 国产精品自产拍在线观看网站 | 中文字幕在线精品 | 国产视频丨精品|在线观看 国产精品久久久久久久久久久久午夜 | 91自拍视频在线 | 日韩欧美国产成人 | 一本到视频在线观看 | 丁香色天天| 国产免费一区二区三区网站免费 | 五月婷婷色| 天天干天天干天天色 | 色婷婷成人 | 日日夜夜狠狠操 | 国产精品久久久久影院 | 97精品国产97久久久久久免费 | 成人av av在线 | 黄在线免费看 | 久久99国产精品二区护士 | 草久中文字幕 | 亚洲成年人免费网站 | 性色va | 黄色在线免费观看网站 | 99精品在线视频播放 | 91精品久久久久久久久久入口 | 亚洲视频在线免费观看 | 欧美在线视频不卡 | 人成在线免费视频 | 国产视频精选 | 亚洲激情 在线 | 偷拍久久久 | 波多野结依在线观看 | 国产91在线播放 | 激情综合五月天 | 日本久久免费视频 | 中文字幕高清在线播放 | 欧美精品久久久久久久久久 | 亚洲精品麻豆 | 久久久久久久影院 | 999久久国产 | 中国一级片在线 | 在线你懂的视频 | 视频一区二区免费 | 日韩欧美高清视频在线观看 | 欧美超碰在线 | 中文区中文字幕免费看 | 99热这里只有精品久久 | 国产专区在线看 | 久久免费看av | 久久精品高清 | 在线免费观看黄色大片 | 九九九在线 | 国产欧美精品在线观看 | 午夜的福利 | www.亚洲精品 | 午夜 在线 | 欧美一区二区三区在线看 | 国产日韩在线播放 | 日日躁你夜夜躁你av蜜 | 色资源网在线观看 | 三级黄色片子 | 日韩在线观看视频免费 | 国产丝袜在线 | 久久综合久久久久88 | 午夜免费久久看 | 亚洲 综合 国产 精品 | 成人免费视频a | 免费大片av | 在线免费91 | 九九视频网站 | 中文区中文字幕免费看 | av解说在线观看 | 日本女人的性生活视频 | 91在线91拍拍在线91 | 国产精品va在线观看入 | 婷婷色资源 | 亚洲 欧洲av | 国产成人av网址 | 久色伊人 | 国产精品第一页在线 | 人人爱爱| 日本久久精品视频 | 国产一在线精品一区在线观看 | 91爱爱网址 | 欧美性做爰猛烈叫床潮 | 国产日韩精品视频 | 国产视频精品久久 | 天天夜夜狠狠操 | 欧美黄色免费 | 一区三区视频 | 国产高清在线 | www.天天综合 | av在线一二三区 | 亚洲九九九在线观看 | 在线91精品| 欧美精品乱码久久久久久 | 麻豆成人精品视频 | av中文字幕亚洲 | 在线免费视频 你懂得 | 国产精品综合久久久久 | 久久免费看片 | 中文字幕一区二区三区在线观看 | 日本黄色免费网站 | 国产91勾搭技师精品 | 欧美色精品天天在线观看视频 | 99国产精品久久久久久久久久 | 美女在线免费视频 | 超碰在线中文字幕 | 91污污视频在线观看 | 午夜精品一区二区国产 | 国产精品v欧美精品v日韩 | 国产精品 中文在线 | 成人国产一区 | 亚洲国产精品一区二区久久,亚洲午夜 | 一区二区不卡 | 成人污视频在线观看 | 91高清在线 | 免费黄色av电影 | 亚洲精品影视在线观看 | 日韩视频一区二区在线观看 | 中文字幕乱码亚洲精品一区 | 日韩精品视频在线观看免费 | av一区二区三区在线 | 国产小视频免费在线网址 | 久久99国产综合精品免费 | 日韩va在线观看 | 久久久久久久久艹 | 玖玖精品在线 | 欧美极品xxxxx | 日日日日| 色婷婷狠狠 | 99精品国产视频 | 娇妻呻吟一区二区三区 | 99久久精品免费看国产免费软件 | 久久天天躁狠狠躁亚洲综合公司 | 人人爽人人爽人人片av免 | 亚欧日韩成人h片 | 亚洲综合色激情五月 | 91日韩精品视频 | 91理论电影 | 欧美一级日韩三级 | 亚洲91网站 | 欧美日韩亚洲第一页 | 激情丁香婷婷 | 日韩网站一区二区 | 免费观看十分钟 | 日本久久免费电影 | 91丨九色丨首页 | 久久视频国产 | 欧美精品一区在线发布 | 日韩中文字幕免费在线播放 | 亚洲黄色片一级 | 狠狠色噜噜狠狠狠狠2022 | 日日操日日 | 五月开心六月伊人色婷婷 | 91在线观 | 日韩在线观看 | 亚洲国产成人高清精品 | 久久成人免费 | 丁香花中文字幕 | 九九九九九精品 | 国产精品一区在线观看你懂的 | 一区二区三区精品在线视频 | 久久精品导航 | 黄污视频网站 | 久久69精品久久久久久久电影好 | 最新超碰在线 | 亚洲精品高清一区二区三区四区 | 欧美一区日韩一区 | 青青看片 | 国产精品一区二区在线看 | 日韩肉感妇bbwbbwbbw | 丁香婷婷色月天 | 天天干天天做天天爱 | 日韩欧美精品免费 | 97在线免费观看 | 免费av大片 | 国产97色在线 | 日韩av片无码一区二区不卡电影 | 综合久久综合久久 | 91热精品 | 黄色免费观看 | 99久久激情 | 国产福利一区二区在线 | 欧美成人xxxxx | 免费日韩高清 | 午夜精品久久久久久中宇69 | 午夜国产一区 | 99精品久久久久久久 | 国产偷v国产偷∨精品视频 在线草 | 免费黄色在线 | 99在线精品视频观看 | 免费观看黄 | 亚洲美女精品视频 | 一区二区三区污 | 天天草天天草 | 又污又黄的网站 | 国产精品一区二区三区在线播放 | 免费高清在线视频一区· | 久精品视频 | 国产一级大片在线观看 | 夜夜澡人模人人添人人看 | 一级片免费观看视频 | 免费av观看网站 | 欧美伦理一区二区三区 | 色综合久久88色综合天天人守婷 | 久久午夜国产精品 | 色婷婷国产在线 | 天天干天天拍 | 91免费观看国产 | 国产日韩欧美在线观看 | 久久精品中文字幕 | 精品天堂av| 婷婷国产一区二区三区 | 97精品国产97久久久久久粉红 | 最近日本韩国中文字幕 | 国语自产偷拍精品视频偷 | 九九久 | 日韩欧美在线高清 | 国产精品国产三级国产不产一地 | 欧美极品一区二区三区 | 欧美激情视频一二区 | 亚洲国产精品影院 | 久草爱视频 | 精品色综合 | 99资源网 | 日韩av美女| 久久综合中文字幕 | 在线免费观看视频你懂的 | 国产在线看一区 | 综合精品在线 | 欧美在线18 | 99国产精品久久久久久久久久 | 国产护士av | 亚洲午夜av电影 | 免费成人av | 欧美精品一区二区在线观看 | 亚洲黄色软件 | 中文国产在线观看 | 免费网址你懂的 | 天天干,夜夜操 | 黄色91在线观看 | 亚洲精品在线观看免费 | 激情网站网址 | 欧美精品久久久久久久久老牛影院 | 国产色在线视频 | 国产第一页精品 | 日韩欧美精品在线视频 | 国产视频首页 | 中文字幕欧美日韩va免费视频 | 日韩国产欧美在线播放 | 极品嫩模被强到高潮呻吟91 | 久久免费在线视频 | 99久久精品国产一区 | www99精品| 国内精自线一二区永久 | 免费久久视频 | 免费又黄又爽视频 | 欧美日韩中文国产 | 亚洲 综合 激情 | 亚洲精品国产成人 | 久久九九影院 | 免费观看性生交大片3 | 夜夜视频| 丰满少妇对白在线偷拍 | 五月婷婷六月综合 | 粉嫩av一区二区三区入口 | 亚洲狠狠婷婷综合久久久 | 成人免费一级片 | 久久最新视频 | 丁香激情综合久久伊人久久 | 亚洲精品自拍视频在线观看 | 国产精品久久久久9999吃药 | 99在线观看视频网站 | 精品久久久久久久久久岛国gif | 91chinese在线| 国产123av| 偷拍精偷拍精品欧洲亚洲网站 | 中文字幕一区二区三区视频 | 人人爱人人做人人爽 | 欧美伦理一区二区三区 | 亚洲精品欧洲精品 | 日本成址在线观看 | 欧美 激情 国产 91 在线 | 国产国语在线 | 久久久一本精品99久久精品 | 免费看毛片网站 | 日韩精品无 | 欧美成人xxxx| 午夜精品电影 | 久草资源在线 | 久草在线免费播放 | 久久久国产精华液 | 91精品国产91久久久久 | 96国产在线 | 欧美亚洲成人xxx | 久久精品电影院 | 日韩精品一区二区免费 | www久久精品 | 国产精品乱码高清在线看 | 免费av黄色 | 一区 二区 精品 | 久久国产精品免费一区二区三区 | 色片网站在线观看 | 亚洲精品va| 久久综合欧美精品亚洲一区 | 久久怡红院| 亚洲国产剧情av | 成人网中文字幕 | 黄色免费网 | 在线观看视频国产 | 国产99久久久久久免费看 | 日本精品一区二区三区在线播放视频 | 国产在线观看免费 | 国产在线一区二区三区播放 | 香蕉影院在线 | 99高清视频有精品视频 | 国产日韩精品在线 | 中文字幕在线一区观看 | 色先锋资源网 | 久久av高清 | 亚洲日日夜夜 | 国产亚洲人 | 成人午夜黄色 | 探花视频在线观看+在线播放 | 精品久久久久久电影 | 亚洲视频网站在线观看 | 精品九九九九 | 国产免费三级在线观看 | 在线免费观看黄色大片 | 久热久草 | 81国产精品久久久久久久久久 | 欧美日韩一区二区三区免费视频 | 亚洲一级片免费观看 | 成人9ⅰ免费影视网站 | 午夜影视剧场 | 人人爱人人爽 | 国产精品 999 | 亚洲午夜精品一区二区三区电影院 | 日韩免费看片 | 国内丰满少妇猛烈精品播放 | 色久天| aaa亚洲精品一二三区 | 青青河边草免费 | av电影中文字幕在线观看 | 久久噜噜少妇网站 | 久久精品香蕉视频 | 亚洲成年人在线播放 | 欧美精品久久久久久久亚洲调教 | 国产青春久久久国产毛片 | 天天综合色网 | 欧洲激情综合 | 久久第四色 | 欧美激情精品久久久久 | 曰韩精品 | 激情开心站 | 99久久日韩精品免费热麻豆美女 | 国产不卡在线播放 | 久久久久久久99 | 国产精品99久久久久久小说 | 天天插日日射 | 久久精品99国产国产 | 欧美亚洲成人xxx | 久久99精品久久久久久久久久久久 | 久久综合婷婷综合 | 亚洲欧美视频在线播放 | 99久视频| 在线黄色国产电影 | 夜夜爱av | 密桃av在线 | 成人久久18免费网站图片 | 最近日本mv字幕免费观看 | 久久久久久网址 | 国产在线色视频 | 久久久国产精品久久久 | 亚一亚二国产专区 | 黄色免费网站大全 | 久久99亚洲精品久久久久 | 国产xxxxx在线观看 | 成人免费在线观看av | 国产精品久久久久久久久久久久午夜 | 国产一级片免费播放 | 日韩一区二区在线免费观看 | 精品久久久久久亚洲综合网 | 去干成人网 | 精品国产_亚洲人成在线 | 国产亚洲欧美在线视频 | 五月天伊人网 | 亚洲成av人影片在线观看 | 四虎影视成人永久免费观看亚洲欧美 | 久久99在线观看 | 国产精品成人免费精品自在线观看 | 国产黄色片网站 | 日本夜夜草视频网站 | 天天色视频 | 美女在线黄| 亚洲日日射 | 午夜影院一级片 | 在线日本看片免费人成视久网 | 91精品久久香蕉国产线看观看 | 欧美日本三级 | 亚洲天天摸日日摸天天欢 | 亚洲一区二区三区四区在线视频 | 超级碰碰碰视频 | 国产精品福利av | 黄污网| av动态图片 | 国产精品少妇 | 婷婷六月综合网 | 日韩久久影院 | 人人爽久久久噜噜噜电影 | 四虎亚洲精品 | 右手影院亚洲欧美 | 丁香婷婷激情 | 日韩在线三级 | 国内精品久久久久久久久久 | 日韩一区二区三区高清免费看看 | 亚洲成人免费 | 久久精品久久久久 | 国产成人精品久久二区二区 | 免费成人看片 | 一区二区三区免费在线 | 精品国产乱子伦一区二区 | 99国产视频 | 最新动作电影 | 午夜视频99| 亚洲精品国产精品国自 | 超碰日韩| 亚洲三级在线免费观看 | 国产精品久久久久久久久久久久久 | 国产亚洲视频在线观看 | 麻豆91小视频| 视频成人永久免费视频 | 久久久久久久久久电影 | 日韩欧美一区二区三区视频 | 成x99人av在线www | 国产97色 | 日韩免费一二三区 | 成人超碰在线 | 国产一区免费视频 | av电影一区二区 | 999久久久国产精品 高清av免费观看 | 97在线观看视频 | 亚洲视频1| 亚洲欧美乱综合图片区小说区 | 亚洲精品国产日韩 | 亚洲综合在线观看视频 | 久久深爱网| 在线电影中文字幕 | 激情小说网站亚洲综合网 | 国产精品毛片久久久久久 | 日韩欧美视频在线播放 | 热久精品 | 国产亚洲字幕 | 1024久久 | av中文字幕av | 亚洲第一区在线播放 | 国产一级黄大片 | 三级a毛片 | 日韩精品一区二区三区在线视频 | 国产又黄又爽又猛视频日本 | 美女在线免费观看视频 | 国产一区二区在线播放视频 | 五月婷婷综| 久久激五月天综合精品 | 成年人免费在线观看网站 | 色天堂在线视频 | 国产精久久久 | 极品美女被弄高潮视频网站 | 天天操天天舔天天爽 | 日韩免费高清 | 亚洲日本中文字幕在线观看 | 亚一亚二国产专区 | 国产精品毛片久久久 | 国产打女人屁股调教97 | 久久久久高清毛片一级 | 亚洲综合情 | 国产精品视频免费在线观看 | 又色又爽又黄高潮的免费视频 | 国产一区二区三区午夜 | 精品国内自产拍在线观看视频 | 999日韩 | 不卡av免费在线观看 | 欧美日韩a视频 | 久久综合色8888 | 奇米影视777影音先锋 | 人人精品久久 | 欧美亚洲国产一卡 | 成人午夜电影在线播放 | 国产精品成人久久久 | 久久久国产一区二区 | 中文字幕资源在线 | 久久电影色| 亚洲午夜剧场 | 精品日韩在线 | 国产精品永久在线 | 日本字幕网 | 91av视频在线免费观看 | 视频一区二区三区视频 | 久草精品视频 | 五月天婷婷视频 | 日韩影片在线观看 | 日韩欧美高清一区二区三区 | 97夜夜澡人人爽人人免费 | 久久精品中文视频 | 狠狠色婷婷丁香六月 | 国产在线色视频 | 国产亚洲精品久久19p | 国产成人精品亚洲a | 五月综合色 | 婷婷激情综合 | 超薄丝袜一二三区 | 四虎影视成人永久免费观看亚洲欧美 | 国产高清在线精品 | 欧洲亚洲精品 | 久久久三级视频 | 激情五月婷婷丁香 | 狠狠干狠狠插 | 久艹视频在线免费观看 | 国产精品久久久久久久久久ktv | av网站免费线看精品 | 久久99精品热在线观看 | 免费97视频| 波多野结衣在线观看视频 | 在线视频18在线视频4k | 精品在线视频一区 | 狠狠狠色丁香婷婷综合久久88 | 91麻豆产精品久久久久久 | 日韩欧美精选 | 超碰在线97观看 | 国产日韩欧美自拍 | 国产小视频在线观看 | 免费av观看| 欧美精品999| 日本激情视频中文字幕 | 国产69精品久久99不卡的观看体验 | 免费人成在线观看网站 | 久久精品一级片 | 天天综合在线观看 | 欧美日韩在线看 | 97视频在线观看视频免费视频 | 国产成人av网站 | 国产精品国产三级国产aⅴ无密码 | 2000xxx影视| 丁香六月av | 亚洲国产成人av网 | 伊人婷婷 | 国产精品黑丝在线观看 | 亚洲欧洲日韩在线观看 | 日日爽天天操 | 99产精品成人啪免费网站 | 久操97 | 久久人人爽人人片 | 国产呻吟在线 | 视频福利在线 | 97成人在线 | www.com黄 | 国产精品亚州 | 亚洲少妇影院 | 久操中文字幕在线观看 | 69久久久久久久 | 国产小视频在线播放 | 久久精品99国产精品 | 亚洲人在线| 色播五月激情五月 | 久久久久激情电影 | 欧美精品一区二区三区一线天视频 | 丁香婷婷综合网 | 在线视频一区观看 | 久久人人精品 | 国产一区欧美在线 | 亚洲免费精品一区二区 | 91精品久久久久久久久 | 一级做a视频 | 精品一区二区日韩 | 伊人久久电影网 | 欧美先锋影音 | 色91av| 免费视频久久久久 | 骄小bbw搡bbbb揉bbbb | 亚洲免费精彩视频 | 婷婷丁香激情五月 | 狠狠久久 | 久久国产精品久久国产精品 | 2019中文字幕第一页 | 一区二区三区在线免费观看视频 | 欧美日韩一区二区免费在线观看 | 六月天综合网 | 天天天天射 | 欧美久久成人 | 精品自拍av | 亚洲天堂网在线观看视频 | 男女免费视频观看 | 亚洲另类人人澡 | 一区二区视频欧美 | www一起操| 欧美激情精品久久久久久免费 | 人人网人人爽 | 日本中文一级片 | 中文字幕乱码电影 | 久久66热这里只有精品 | 欧美视频国产视频 | 成人在线视频免费 | 国产成人综合在线观看 | 一区二区不卡在线观看 | 欧美大片大全 | 国产不卡精品 | zzijzzij亚洲成熟少妇 | 国产福利一区二区三区在线观看 | 在线观看日韩精品视频 | 99麻豆视频 | 日韩精品欧美精品 | 日韩欧美在线综合网 | 国产精品专区一 | 九九热精品视频在线播放 | 欧美日韩一区二区三区不卡 | 欧美成人精品三级在线观看播放 | 久久综合影视 | 美女网站色在线观看 | 国产精品视频线看 | 久碰视频在线观看 | 久久av免费| 国产黄色电影 | 高清不卡一区二区在线 | 亚洲区二区| 91九色国产在线 | 午夜国产福利在线 | 亚洲综合丁香 | 欧美日韩一级视频 | 成人在线免费看视频 | 日韩影片在线观看 | 在线中文字幕av观看 | 久久日本视频 | 最近中文字幕久久 | 一级片黄色片网站 | 国产中文字幕视频在线观看 | 骄小bbw搡bbbb揉bbbb | 中文字幕在线免费 | 麻豆av电影 | wwwwwww黄 | 国产高清综合 | 日韩久久久久久久久久 | 99热官网 | 日日夜夜精品视频 | 日韩a在线观看 | 最近中文字幕免费av | 中文在线字幕免费观 | 中文区中文字幕免费看 | 日韩在线中文字幕视频 | 免费观看国产精品 | 看片黄网站 | 国产午夜精品免费一区二区三区视频 | 久久精品视频网址 | 黄色av影院 | 久久亚洲影视 | 亚洲影院色 | 久久久久久久久久久久影院 | 黄色视屏在线免费观看 | 草久热 | 天天操天天干天天爱 | 国产精品自在线拍国产 | 国产日韩精品一区二区三区 | 久久综合综合久久综合 | 在线天堂亚洲 | 在线v | 日本丶国产丶欧美色综合 | 亚洲激情在线观看 | 欧洲在线免费视频 | 欧美性生活一级片 | 久久毛片网站 | 久草网站在线观看 | 日韩av一区二区三区四区 | 欧美日韩精品区 | 波多野结衣在线观看一区二区三区 | 国产精品成人自拍 | 99热在线国产精品 | 免费视频资源 | 国产第一页精品 | 国产成人福利 | 国产高清视频在线 | 欧美国产三区 | 黄色精品视频 | 狠狠色狠狠综合久久 | 三级黄色网址 | 操操操日日日干干干 | 2023国产精品自产拍在线观看 | www.午夜视频 | 久久黄色免费 | 亚洲影院色 | 国产九九热 | 亚洲欧美久久 | 亚洲一级二级三级 | 国产精品网站一区二区三区 | 成人91在线观看 | 久久免费片 | 最近最新mv字幕免费观看 | 午夜av在线 | 91爱爱免费观看 | 激情图片久久 | 99在线观看免费视频精品观看 | 国产欧美久久久精品影院 | 在线观看中文字幕一区二区 | 日韩一区二区免费在线观看 | 69精品视频在线观看 | 日韩黄色免费看 | 亚洲精品乱码久久久久久按摩 | 婷婷激情五月 | 免费av大片 | 91在线超碰| 久久伦理 |