主頁 > 前端設計 > 都 2021 年了還不會連 ES6/ES2015 更新了什么都不知道吧

都 2021 年了還不會連 ES6/ES2015 更新了什么都不知道吧

2021-06-09 22:21:55 前端設計

都 2021 年了還不會連 ES6/ES2015 更新了什么都不知道吧

    • es6 / es2015
      • let & const
      • 塊級作用域
      • 解構
        • 陣列解構
        • 物件解構
      • 模板字串
      • Math + Number + String + Object 擴展方法
      • 默認引數
      • 剩余 與 展開 運算子
      • 箭頭函式
      • 物件字面量
      • 代理 Proxy
      • 反射 Reflect
      • 期約 Promises
        • 類的繼承
          • 內置物件可被繼承
        • 類的靜態方法
      • Map + Set + WeakMap + WeakSet
      • 迭代器 & 生成器 & for of
        • 迭代器
        • 生成器
        • for of
      • Symbols
      • Modules
      • Unicode
      • 二進制 與 八進制字面量

JavaScript 的歷史也算是非常久遠了,最早能追溯回 90 年代,網景公司和微軟為了能夠搶占市場大打出手,分別推出了只有自家產品才能夠使用的 JavaScript 版本,這就讓開發們非常頭疼了——寫一份代碼已經很難了,為了適配多端兼容還得再整一個一樣,又不完全一樣的版本出來,

為了解決這個問題,最終由 ECMA International(前身為歐洲計算機制造商協會)統一規范,并且將該規范命名為 ECMAScript,作為 JavaScript 的統一標準,

自此,神仙打架的日子結束了,開發們的日子也稍微好過一些了,

事件繼續推進到了 2008 年后,移動端的興起對 JavaScript 的影響是巨大的,也因此,社區中的大神對于那些功能應該被放入當時的 ES5 而產生了極大的分歧,最終導致了 ES6 的標準的限定也陷入了滯后,

從現在的角度看來,ES6 的變化真的可以說是翻天覆地的變化,也許,這樣的變化對于當時的開發來說還是太早了,

時間又向后推進幾年,到了 2015 年,ECMAScript6 終于作為正式版本發布,官方名稱為 ECMAScript 2015,旨在更頻繁的進行少量的迭代,并且,從 ECMAScript6(ES6/ES2015)之后,所有的版本迭代將會以 ECMAScript + 年份 作為正式的官方名稱,

歷史講完了,下面就肩帶概述一下從 ES2015-ES2021 分別都有什么新特性,

es6 / es2015

最主要的版本迭代,推出了很多對于 JavaScript 來說革命性的新特性,

let & const

在 ES6 之前,JavaScript 想要申明變數只能使用關鍵字 var,JavaScript 特有的作用域提升讓 var 具有一些特殊的行為,如:

for (var i = 0; i < 5; i++) {}

console.log(i); // 5

使用 let 和 const 可以很好地規避這個問題,上面同樣的代碼,以 let 為例:

for (let i = 0; i < 5; i++) {}

console.log(i); // Uncaught ReferenceError: i is not defined

const 與 let 最大的區別有兩點:

  • let 的值是可變的,而 const 是不可變的,如:
let b = 10; // 10
b = 20; // 20

const c = 10; // 10
c = 20; // Uncaught TypeError: Assignment to constant variable.
  • let 初始化可以不用給值,const 不給值會報錯
let b; // undefined
const c; // Uncaught SyntaxError: Missing initializer in const declaration

所以,目前的推薦用法是:

  1. 規避使用 var 去宣告變數

更多關于作用域提升的內容,可以看之前記得筆記:var, let, const 的區別與相同

塊級作用域

即 花括號{},這也是 ES6 新增特性之一,在花括號之中的內容獨立作為一個作用域,外部無法訪問,

在塊級作用域搭配 let 和 const 可以有效地避免變數名污染的問題,如:

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

因為外部作用域無法訪問到內部的變數,而內部的 i 會就近尋找作用域上的變數,為了方便理解,還是建議將內外回圈體重的變數取不同的名字,

解構

快速提取變數的方法,可以用于陣列和物件,

陣列解構

陣列解構與根據 index 取值有些像:

const testArr = [1, 2, 3];
const [val1, val2, val3] = testArr;
console.log(val1, val2, val3); // 1, 2, 3

// 等同于
const val1 = testArr[0],
  val2 = testArr[1],
  val3 = testArr[2];
console.log(val1, val2, val3); // 1, 2, 3

在學習演算法的程序中就會聽經常的用到陣列解構:

// 用陣列解構
function swap(arr, i, j) {
  [arr[i], arr[j]] = [arr[j], arr[i]];
}

// 不用陣列解構
function swap2(arr, i, j) {
  const temp = arr[i];
  arr[i] = arr[j];
  arr[j] = temp;
}

在作業中,在拆解固定值也挺方便的,例如說經常會出現有些字串使用 - 進行分割:

const [base, str2] = someStr.split('-');

// 不用陣列解構
const splittedStr = someStr.split('-');
const base = splittedStr[0],
  str2 = splittedStr[1];

物件解構

根據屬性名進行解構,解構中的變數名一定是匹配類中的屬性名的,使用方法如下:

const getUserAddress = (metaData) => {
  return {
    zipcode: 123456,
    addr1: 'some addr',
    addr2: 'some addr2',
    state: 'some state',
    // 其他屬性...
  };
};

const { zipcode, addr1, addr2, state } = getUserAddress('dummy data');

// 或提取常用的函式出來,假設做數學運算,經常會用到一些數學常量和函式,就可以先提取出來
const { PI, abs, sin } = Math;
const { log } = console;
log(sin(PI));

對于解決變數名重復,ES6 也已經有了自己的解決方法,依舊以上面的函式為例:

const state = 'placeholder';

const getUserAddress = (metaData) => {
  return {
    zipcode: 123456,
    addr1: 'some addr',
    addr2: 'some addr2',
    state: 'some state',
    // 其他屬性...
  };
};

const {
  zipcode,
  addr1,
  addr2,
  state: currentState,
} = getUserAddress('dummy data');

模板字串

非常好用的特性之一,它最大的特點就在于能夠拼接變數以及保證原有的格式,如果說有的時候需要寫一點 HTML 的東西,就非常的有用了:

// 拼接字串
const fullName = `${firstName} ${lastName}`;

// 保證原有格式增強可讀性
const tempHtml = `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    
</body>
</html>
`;

console.log(tempHtml);
/*
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>

</body>
</html>
*/

效果圖如下:

二者混用其實是最能夠體現它效果強大的地方:

// 準備要發送出去的html
const tempHtml = `
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    ${bodyEl}
</body>
</html>
`;

Math + Number + String + Object 擴展方法

  • Math

    增加了一些常見的變數,如 Number.EPSILON,最后用的就是增加了兩個非常有用的靜態方法:

    和一些數學中常用的計算方法,如 acosh,sin 等,除非特定專案,否則用的比較少,

  • Number

    新增了對 NaN 和無窮大的處理的靜態函式,

    Number.isInteger(Infinity); // false
    Number.isNaN('NaN'); // false
    
  • String

    • includes,是否包含指定字串

    • startsWith,是否以該字串開頭

    • endsWith,是否以該字串結尾

    • repeat,重復字串

    使用方法:

    const msg = 'Error: some error message';
    msg.includes('Error'); // true
    msg.startsWith('Error'); // true
    msg.endsWith('Error'); // false
    
    '6'.repeat(3); // '666s'
    
  • Object

    Object.assign(target, ...sources),將所有可列舉屬性的值從衣蛾或多個源物件分配到目標物件,

    是一個淺復制的好方法,

默認引數

現在 JavaScript 可以為形參提供默認值,這樣的好處就在于可以省略掉一些空值的判斷,如:

function func(id, name, age, interests = []) {
  // 進行操作
}

// 以前可能會寫
function func(id, name, age, interests) {
  if (interest && interest.length > 0) {
    // 進行操作
  }
}

現在就算再呼叫函式時沒有提供引數,也可以直接進行回圈操作了,

注:需要提供默認值的引數一定是放在最后的引數,所以才能做到在沒有傳值的時候設定默認值,

剩余 與 展開 運算子

... 運算子,可以用來傳遞剩余的引數,也可以用來展開陣列或是物件,

  • 當用來傳遞剩余引數時

    可以用來展開所有的引數,并且以陣列的形式在函式內被呼叫,

    這要哪個的優點在于可以避免使用 arguments 來獲取所有的引數,同時,因為 ... 會獲取剩余所有的引數,因此只能放置在引數的最后,并且只能用 1 次,

    function func(...args) {
      console.log(args); // [1,2,3,4,]
    }
    
    func(1, 2, 3, 4);
    
  • 當用來展開時

    可以用來展開資料,同樣也可以用來做淺拷貝:

    const test = [1, 2, 3, 4, 5];
    const copy = [...test];
    console.log(copy); // [1, 2, 3, 4, 5]
    
    const test2 = { name: 'test', age: 18 };
    const copy2 = { ...test2 };
    console.log(copy2); // { name: 'test', age: 18 }
    
    // 當需要輸出一些值,就不需要用 test[0] test[1] 這樣扣值
    console.log(...test); // 1 2 3 4 5
    

箭頭函式

現在比較推薦的寫法,可以簡化定義函式的代碼,語法為:

const/let/var 函式名 = (引數) => {}

// 使用傳統函式
function foo(val) {
  return val + 1;
}

// 使用箭頭函式
// 當只有一行時,可以忽略花括號直接在 => 后寫要回傳的值
const foo = (val) => val + 1;

// 回傳多行時,可以用圓括號包起來
const foo = (val) => (
  <div>
    <div>paragraph1</div>
    <div>paragraph2</div>
  </div>
);

// 當操作有多行時,需要擁花括號包起來,并在 return 后申明回傳值
const foo = (val) => {
  console.log(val);
  return val + 1;
};

與普通的函式相比,并且沒有自己的 thisargumentssupernew.target

箭頭函式可以用來取代以前使用匿名函式的地方,

物件字面量

有了以下幾個有用的語法糖

  • 當變數名一致時,可以省略變數名

    const data = { name: 'name', age: 18 };
    
    const testData = {
      'Content-Type': 'text/plain',
      data,
    };
    
    console.log(testData); // { 'Content-Type': 'text/plain', data: { name: 'name', age: 18 } }
    
  • 計算屬性名,也就是用 [] 動態傳遞屬性名

    這個操作在回圈呼叫時,或者需要動態傳遞引數時非常有用

    const data = { name: 'name', age: 18 };
    for (const key in data) {
      console.log(data[key]);
    }
    // name
    // 18
    

代理 Proxy

ES6 新推出的代理功能,Proxy 是對于目標物件的抽象,在實際操作目標物件時,可以通過 Proxy 實作對基本操作的攔截和自定義,

語法為:

const p = new Proxy(target, handler)

我覺得 MDN 中,通過 Proxy 系結驗證的案例挺好的:

let validator = {
  set: function (obj, prop, value) {
    if (prop === 'age') {
      if (!Number.isInteger(value)) {
        throw new TypeError('The age is not an integer');
      }
      if (value > 200) {
        throw new RangeError('The age seems invalid');
      }
    }

    // The default behavior to store the value
    obj[prop] = value;

    // 表示成功
    return true;
  },
};

let person = new Proxy({}, validator);

person.age = 100;

console.log(person.age);
// 100

person.age = 'young';
// 拋出例外: Uncaught TypeError: The age is not an integer

person.age = 300;
// 拋出例外: Uncaught RangeError: The age seems invalid

通過將驗證抽離出來,能夠對驗證方法進行有效復用,在做資料驗證時,也能夠省去很多功夫,

反射 Reflect

Reflect 是一個內置的靜態物件,它提供攔截 JavaScript 操作的方法,它的方法與 proxy handlers 的方法相同,

mdn 上的用法也很全:

const duck = {
  name: 'Maurice',
  color: 'white',
  greeting: function () {
    console.log(`Quaaaack! My name is ${this.name}`);
  },
};

Reflect.has(duck, 'color');
// true
Reflect.has(duck, 'haircut');
// false

可能是說 Reflect 主要的作用還是為了能夠提供一個標準的操作方法,如:

// 判斷是否有某個屬性
if (property in obj) {
}
// 洗掉某個屬性
delete obj.proprety;
// 獲取所有的屬性名
Object.keys(obj);

// 使用 Reflect 進行同樣的操作
Reflect.has(obj, property);
Reflect.deleteProperty(obj, property);
Reflect.ownKesy(obj);

相比較而言,Reflect 能夠提供一個更加統一的介面呼叫標準,對于新手而言,查檔案也會方便一些,

期約 Promises

提供了一種更好地解決異步編程的方案,通過鏈式呼叫扁平化函式呼叫,解決回呼地獄的問題,

傳統的寫法可能會這么寫:

function fetchData(callback) {
  fetchData2((err, data) => {
    if (err) return handleRejected2;
    fetchData3((err, data) => {
      if (err) return handleRejected3;
      fetchData4((err, data) => {
        // ...
      });
    });
  });
}

但是使用了 Promiise 之后,就可以使用 then 去鏈式呼叫:

const promise = new Promise(resolve, reject);
promise
  .then(fetchData, handleRejected1)
  .then(fetchData2, handleRejected2)
  .then(fetchData3, handleRejected3)
  .then(fetchData4, handleRejected4);

從結構上來說也會更加的清晰一些,

以前是采用 function 的原型鏈繼承法去實作的繼承,如:

function Person(name) {
  this.name = name;
}
// 添加新的原型鏈繼承方法
Person.prototype.work = function () {
  console.log('996是福報……?');
};

而使用 class 的結構會更加的清晰:

class Person {
  constructor(name) {
    this.name = name;
  }
  work() {
    console.log('996是福報……?');
  }
}

其實之前有其他的語言基礎的話,使用 class 理解起來應該非常的輕松——和其他的語言非常的相似,

類的繼承

而類的繼承的方法,也與其他的語言看起來非常相似,下面是來自 MDN 的例子:

class Polygon {
  constructor(height, width) {
    this.name = 'Polygon';
    this.height = height;
    this.width = width;
  }
  sayName() {
    ChromeSamples.log('Hi, I am a ', this.name + '.');
  }

  sayHistory() {
    ChromeSamples.log(
      '"Polygon" is derived from the Greek polus (many) ' + 'and gonia (angle).'
    );
  }
}

class Square extends Polygon {
  constructor(length) {
    super(length, length);
    this.name = 'Square';
  }

  getArea() {
    return this.height * this.width;
  }
}
內置物件可被繼承

內置物件,如 Array, Date 等可被用來繼承:

// User code of Array subclass
class MyArray extends Array {
  constructor(...args) {
    super(...args);
  }
}

var arr = new MyArray();
arr[1] = 12;
arr.length == 2;

類的靜態方法

注意,靜態方法是直接掛載在類上,而不是類的實體上,

目前感覺主要的呼叫方法就是回傳一個新的物件:

class Square extends Polygon {
  constructor(length) {
    super(length, length);
    this.name = 'Square';
  }

  static create(name) {
    return new Square(name);
  }
}

const square = Square.create('square');

Map + Set + WeakMap + WeakSet

JavaScript 中的 Map, Set, WeakMap, WeakSet 之前的筆記寫的還挺詳細的,

這里放幾個關鍵點:

  • Map 存盤的是鍵值對

  • 對于多數 Web 開發來說,使用 Object 還是 Map 只是個人偏好問題,影響不大,不過對于在乎性能和記憶體的用戶來說,二者還是有區別的

    ObjectMap
    記憶體占用瀏覽器實作不同瀏覽器實作不同 \newline 但是給定固定記憶體大小,Map 能比 Object 多存盤 50%的鍵值對
    插入性能大致相當大致相當 \newline 一般來說性能會稍微好一些
    插入順序不會維護會維護
    查找速度大型資料源中,Object 和 Map 的性能差異極小 \newline 但是資料量比較小的情況下,使用 Object 更快 \newline 所以涉及大量查找的情況使用 Object 會比較好大型資料源中,Object 和 Map 的性能差異極小
    洗掉性能使用 delete 洗掉物件的屬性一直為人所詬病 \newline 在 JavaScript 高級程式設計第四章學習筆記 中也提到過: \newline 另外,使用 delete 操作也會動態更新屬性,從而使得兩個類無法共享同樣的隱藏類 \newline 很多時候都會使用將屬性值設定為 null 或 undefined 作為折中相比較而言,Map 的 delete 方法都比插入和查找更快 \newline 如果代碼涉及到大量洗掉的操作,那么毋庸置疑的應該使用 Map
  • WeakMap 可以擬態私有變數

  • WeakMap 很適合關聯 DOM 節點元資料

  • Set 的很多 API 與行為與 Map 是共有的,因此操作上會有一些相似性

  • WeakSet 基本 API 與 Set 相似,基本特性與 WeakMap 相似

迭代器 & 生成器 & for of

又是一篇寫過筆記的內容:JavaScript 高級程式設計第 7 章 迭代器和生成器 學習筆記

迭代器

迭代器主要是抽象了內部的迭代方法,傳統用法中,如果要迭代某個物件,例如說陣列,那么就一定需要對它的結構有所了解,

但是在實際開發中,下游的開發人員并不可能了解所有封裝后物件的結構,因此,對封裝后物件中的內容進行迭代就成了一個比較苦惱的事情,

這里舉一個簡單的例子:

// 商品串列
class ProductList {
  constructor() {
    // 初始化所有的產品
    this._productList = [];
  }

  addItem(name, price) {
    // 這里偷懶就新建一個類,而是直接用物件存盤了
    const product = {
      id: this._productList.length + 1,
      name,
      price,
      date: new Date(),
    };
    this._productList.push(product);
  }

  // 實作獲得所有商品的迭代
  [Symbol.iterator]() {
    // 注意 this 的指向問題,return中的next是一個閉包,指向會變
    let count = 0;
    const length = this._productList.length,
      productList = this._productList;
    return {
      next() {
        if (count < length) {
          return { done: false, value: productList[count++] };
        } else {
          return { done: true, value: undefined };
        }
      },
    };
  }
}

const productList = new ProductList();
productList.addItem('apple', 10);
productList.addItem('pear', 5);

for (product of productList) {
  console.log(product);
  // { id: 1, name: 'apple', price: 10, date: 2021-06-07T14:15:42.994Z }
  // { id: 2, name: 'pear', price: 5, date: 2021-06-07T14:15:42.994Z }
}

在這個案例之中就能夠看出來,當我們需要迭代整個商品串列去獲得單獨的一個商品時,并不需要關注商品串列的結構是什么,只需要呼叫 for of 即可,

如果明天需求變了,產品的儲存方式從陣列變成了 Map,或是其他的自定義結構了,那么只要實作了迭代器的介面,就一直可以使用 for of 去獲得商品,

也因此,只要修改 迭代器 中的代碼就可以了,而不需要牽一發動全身,上下尋找參考到處修改,

生成器

生成器 是實作了 迭代器介面的 自定義迭代器,

比起迭代器來說它更加的靈活,具有通過 yield,在函式塊內實作暫停和恢復執行代碼的能力,

語法為:

function* func(){}

通常來說生成器的用法更多,因為它的實作方法簡單,并且實作了迭代器介面,但是生成器是一個函式,因此,當處理的情況比較復雜(很少見)時,就不得不用迭代器去實作了,

for of

for of 是 ES6 新增的迭代方法,它可以用在任何實作了迭代器介面的集合上,

比起 forEach 而言,for of 具有可以使用 break 去中斷操作的屬性,而非強制性的使用 return 去回傳整個函式,

Symbols

Symbol 是 ES6 新增的一個基本型別,可以接受字串作為自身的描述,

它具有不可復制性,因此可以被用來實作其他類的擴展功能——使用 Symbol 作為物件屬性,就不用擔心會重寫已有的函式了,

另外,因為 Symbol 具有不可復制性,所以就算在作用域之外重新定義一個具有相同字串描述的 Symbol 也不代表它們的參考地址相同,因此,也可以用來模擬私有變數,

Modules

ES6 自帶的模塊屬性,算是對 import/export 實作的一個標準吧,不需要再借用社區的規范了,自帶嚴格模式,

使用方式如下:

// lib/math.js
export function sum(x, y) {
  return x + y;
}
export var pi = 3.141593;

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

Unicode

JavaScript 完全支持 unicode:

// same as ES5.1
'𠮷'.length == 2;

// new RegExp behaviour, opt-in ‘u’
'𠮷'.match(/./u)[0].length == 2;

// new form
'\u{20BB7}' == '𠮷';
'𠮷' == '\uD842\uDFB7';

// new String ops
'𠮷'.codePointAt(0) == 0x20bb7;

// for-of iterates code points
for (var c of '𠮷') {
  console.log(c);
}

二進制 與 八進制字面量

即宣告二進制使用 b,八進制使用 o:

0b111110111 === 503; // true
0o767 === 503; // true

轉載請註明出處,本文鏈接:https://www.uj5u.com/qianduan/286329.html

標籤:其他

上一篇:Vue 介面 promise + fetch + axios + async 和 await

下一篇:花幾分鐘分析了CSDN各領域榜單,我得到了這樣的結果

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • vue移動端上拉加載

    可能做得過于簡單或者比較low,請各位大佬留情,一起探討技術 ......

    uj5u.com 2020-09-10 04:38:07 more
  • 優美網站首頁,頂部多層導航

    一個個人用的瀏覽器首頁,可以把一下常用的網站放在這里,平常打開會比較方便。 第一步,HTML代碼 <script src=https://www.cnblogs.com/szharf/p/"js/jquery-3.4.1.min.js"></script> <div id="navigate"> <ul> <li class="labels labels_1"> ......

    uj5u.com 2020-09-10 04:38:47 more
  • 頁面為要加<!DOCTYPE html>

    最近因為寫一個js函式,需要用到$(window).height(); 由于手寫demo的時候,過于自信,其實對前端方面的認識也不夠體系,用文本檔案直接敲出來的html代碼,第一行沒有加上<!DOCTYPE html> 導致了$(window).height();的結果直接是整個document的高 ......

    uj5u.com 2020-09-10 04:38:52 more
  • WordPress網站程式手動升級要做好資料備份

    WordPress博客網站程式在進行升級前,必須要做好網站資料的備份,這個問題良家佐言是遇見過的;在剛開始接觸WordPress博客程式的時候,因為升級問題和博客網站的修改的一些嘗試,良家佐言是吃盡了苦頭。因為購買的是西部數碼的空間和域名,每當佐言把自己的WordPress博客網站搞到一塌糊涂的時候 ......

    uj5u.com 2020-09-10 04:39:30 more
  • WordPress程式不能升級為5.4.2版本的原因

    WordPress是一款個人博客系統,受到英文博客愛好者和中文博客愛好者的追捧,并逐步演化成一款內容管理系統軟體;它是使用PHP語言和MySQL資料庫開發的,用戶可以在支持PHP和MySQL資料庫的服務器上使用自己的博客。每一次WordPress程式的更新,就會牽動無數WordPress愛好者的心, ......

    uj5u.com 2020-09-10 04:39:49 more
  • 使用CSS3的偽元素進行首字母下沉和首行改變樣式

    網頁中常見的一種效果,首字改變樣式或者首行改變樣式,效果如下圖。 代碼: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, ......

    uj5u.com 2020-09-10 04:40:09 more
  • 關于a標簽的講解

    什么是a標簽? <a> 標簽定義超鏈接,用于從一個頁面鏈接到另一個頁面。 <a> 元素最重要的屬性是 href 屬性,它指定鏈接的目標。 a標簽的語法格式:<a href=https://www.cnblogs.com/summerxbc/p/"指定要跳轉的目標界面的鏈接">需要展示給用戶看見的內容</a> a標簽 在所有瀏覽器中,鏈接的默認外觀如下: 未被訪問的鏈接帶 ......

    uj5u.com 2020-09-10 04:40:11 more
  • 前端輪播圖

    在需要輪播的頁面是引入swiper.min.js和swiper.min.css swiper.min.js地址: 鏈接:https://pan.baidu.com/s/15Uh516YHa4CV3X-RyjEIWw 提取碼:4aks swiper.min.css地址 鏈接:https://pan.b ......

    uj5u.com 2020-09-10 04:40:13 more
  • 如何設定html中的背景圖片(全屏顯示,且不拉伸)

    1 <style>2 body{background-image:url(https://uploadbeta.com/api/pictures/random/?key=BingEverydayWallpaperPicture); 3 background-size:cover;background ......

    uj5u.com 2020-09-10 04:40:16 more
  • Java學習——HTML詳解(上)

    HTML詳解 初識HTML Hyper Text Markup Language(超文本標記語言) 1 <!--DOCTYPE:告訴瀏覽器我們要使用什么規范--> 2 <!DOCTYPE html> 3 <html lang="en"> 4 <head> 5 <!--meta 描述性的標簽,描述一些 ......

    uj5u.com 2020-09-10 04:40:33 more
最新发布
  • 我的第一個NPM包:panghu-planebattle-esm(胖虎飛機大戰)使用說明

    好家伙,我的包終于開發完啦 歡迎使用胖虎的飛機大戰包!! 為你的主頁添加色彩 這是一個有趣的網頁小游戲包,使用canvas和js開發 使用ES6模塊化開發 效果圖如下: (覺得圖片太sb的可以自己改) 代碼已開源!! Git: https://gitee.com/tang-and-han-dynas ......

    uj5u.com 2023-04-20 07:59:23 more
  • 生產事故-走近科學之消失的JWT

    入職多年,面對生產環境,盡管都是小心翼翼,慎之又慎,還是難免捅出簍子。輕則滿頭大汗,面紅耳赤。重則系統停擺,損失資金。每一個生產事故的背后,都是寶貴的經驗和教訓,都是專案成員的血淚史。為了更好地防范和遏制今后的各類事故,特開此專題,長期更新和記錄大大小小的各類事故。有些是親身經歷,有些是經人耳傳口授 ......

    uj5u.com 2023-04-18 07:55:04 more
  • 記錄--Canvas實作打飛字游戲

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 打開游戲界面,看到一個畫面簡潔、卻又富有挑戰性的游戲。螢屏上,有一個白色的矩形框,里面不斷下落著各種單詞,而我需要迅速地輸入這些單詞。如果我輸入的單詞與螢屏上的單詞匹配,那么我就可以獲得得分;如果我輸入的單詞錯誤或者時間過長,那么我就會輸 ......

    uj5u.com 2023-04-04 08:35:30 more
  • 了解 HTTP 看這一篇就夠

    在學習網路之前,了解它的歷史能夠幫助我們明白為何它會發展為如今這個樣子,引發探究網路的興趣。下面的這張圖片就展示了“互聯網”誕生至今的發展歷程。 ......

    uj5u.com 2023-03-16 11:00:15 more
  • 藍牙-低功耗中心設備

    //11.開啟藍牙配接器 openBluetoothAdapter //21.開始搜索藍牙設備 startBluetoothDevicesDiscovery //31.開啟監聽搜索藍牙設備 onBluetoothDeviceFound //30.停止監聽搜索藍牙設備 offBluetoothDevi ......

    uj5u.com 2023-03-15 09:06:45 more
  • canvas畫板(滑鼠和觸摸)

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title>canves</title> <style> #canvas { cursor:url(../images/pen.png),crosshair; } #canvasdiv{ bo ......

    uj5u.com 2023-02-15 08:56:31 more
  • 手機端H5 實作自定義拍照界面

    手機端 H5 實作自定義拍照界面也可以使用 MediaDevices API 和 <video> 標簽來實作,和在桌面端做法基本一致。 首先,使用 MediaDevices.getUserMedia() 方法獲取攝像頭媒體流,并將其傳遞給 <video> 標簽進行渲染。 接著,使用 HTML 的 < ......

    uj5u.com 2023-01-12 07:58:22 more
  • 記錄--短視頻滑動播放在 H5 下的實作

    這里給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 短視頻已經無數不在了,但是主體還是使用 app 來承載的。本文講述 H5 如何實作 app 的視頻滑動體驗。 無聲勝有聲,一圖頂百辯,且看下圖: 網址鏈接(需在微信或者手Q中瀏覽) 從上圖可以看到,我們主要實作的功能也是本文要講解的有: ......

    uj5u.com 2023-01-04 07:29:05 more
  • 一文讀懂 HTTP/1 HTTP/2 HTTP/3

    從 1989 年萬維網(www)誕生,HTTP(HyperText Transfer Protocol)經歷了眾多版本迭代,WebSocket 也在期間萌芽。1991 年 HTTP0.9 被發明。1996 年出現了 HTTP1.0。2015 年 HTTP2 正式發布。2020 年 HTTP3 或能正... ......

    uj5u.com 2022-12-24 06:56:02 more
  • 【HTML基礎篇002】HTML之form表單超詳解

    ??一、form表單是什么

    ??二、form表單的屬性

    ??三、input中的各種Type屬性值

    ??四、標簽 ......

    uj5u.com 2022-12-18 07:17:06 more