亚洲中字慕日产2020,大陆极品少妇内射AAAAAA,无码av大香线蕉伊人久久,久久精品国产亚洲av麻豆网站

資訊專欄INFORMATION COLUMN

ES10 特性的完整指南

entner / 2684人閱讀

摘要:它返回一個(gè)迭代器而不是一個(gè)數(shù)組,迭代器本身是有用的。高級(jí)對(duì)象更改跟蹤最后匹配位置的內(nèi)部屬性,這在復(fù)雜的情況下會(huì)造成嚴(yán)重破壞。它是一個(gè)迭代器,可以用循環(huán)遍歷它這就是整個(gè)語法的不同。

想閱讀更多優(yōu)質(zhì)文章請(qǐng)猛戳GitHub博客,一年百來篇優(yōu)質(zhì)文章等著你!

ES10 還只是一個(gè)草案。但是除了 Object.fromEntries 之外,Chrome 的大多數(shù)功能都已經(jīng)實(shí)現(xiàn)了,為什么不早點(diǎn)開始探索呢?當(dāng)所有瀏覽器都開始支持它時(shí),你將走在前面,這只是時(shí)間問題。

在新的語言特性方面,ES10 不如 ES6 重要,但它確實(shí)添加了一些有趣的特性(其中一些功能目前還無法在瀏覽器中工作: 2019/02/21)

在 ES6 中,箭頭函數(shù)無疑是最受歡迎的新特性,在 ES10 中會(huì)是什么呢?

BigInt -任意精度整數(shù)

BigInt 是第七種 原始類型。

BigInt 是一個(gè)任意精度的整數(shù)。這意味著變量現(xiàn)在可以 表示2?3 數(shù)字,而不僅僅是9007199254740992。

const b = 1n;  // 追加 n 以創(chuàng)建 BigInt

在過去,不支持大于 9007199254740992 的整數(shù)值。如果超過,該值將鎖定為 MAX_SAFE_INTEGER + 1:

const limit = Number.MAX_SAFE_INTEGER;
? 9007199254740991
limit + 1;
? 9007199254740992
limit + 2;
? 9007199254740992 <--- MAX_SAFE_INTEGER + 1 exceeded
const larger = 9007199254740991n;
? 9007199254740991n
const integer = BigInt(9007199254740991); // initialize with number
? 9007199254740991n
const same = BigInt("9007199254740991"); // initialize with "string"
? 9007199254740991n

typeof
typeof 10;
? "number"
typeof 10n;
? "bigint"
等于運(yùn)算符可用于兩種類型之間比較:
10n === BigInt(10);
? true
10n == 10;
? true
數(shù)學(xué)運(yùn)算符只能在自己的類型中工作:
200n / 10n
? 20n
200n / 20
? Uncaught TypeError:
   Cannot mix BigInt and other types, use explicit conversions <
-運(yùn)算符可以操作, + 不可用
-100n
? -100n
+100n
? Uncaught TypeError:
  Cannot convert a BigInt value to a number


當(dāng)你讀到這篇文章的時(shí)候,matchAll 可能已經(jīng)在 Chrome C73 中正式實(shí)現(xiàn)了——如果不是,它仍然值得一看。特別是如果你是一個(gè)正則表達(dá)式(regex)愛好者。

string.prototype.matchAll()

如果您運(yùn)行谷歌搜索JavaScript string match all,第一個(gè)結(jié)果將是這樣的:如何編寫正則表達(dá)式“match all”?

最佳結(jié)果將建議 String.match 與正則表達(dá)式和 /g 一起使用或者帶有 /gRegExp.exec 或者帶有 /gRegExp.test 。

首先,讓我們看看舊規(guī)范是如何工作的。

帶字符串參數(shù)的 String.match 僅返回第一個(gè)匹配:

let string = "Hello";
let matches = string.match("l");
console.log(matches[0]); // "l"

結(jié)果是單個(gè) "l"(注意:匹配存儲(chǔ)在 matches[0] 中而不是 matches)

“hello”中搜索 "l" 只返回 "l"。

string.matchregex 參數(shù)一起使用也是如此:

讓我們使用正則表達(dá)式 /l/ 找到字符 串“hello” 中的 “l(fā)” 字符:

let string = "Hello";
let matches = string.match(/l/);
console.log(matches[0]); // "l"
添加 /g 混合
let string = "Hello";
let ret = string.match(/l/g); // (2) [“l(fā)”, “l(fā)”];

很好,我們使用 < ES10 方式得到了多個(gè)匹配,它一直起作用。

那么為什么要使用全新的 matchAll 方法呢? 在我們更詳細(xì)地回答這個(gè)問題之前,讓我們先來看看 捕獲組。如果不出意外,你可能會(huì)學(xué)到一些關(guān)于正則表達(dá)式的新知識(shí)。

正則表達(dá)式捕獲組

在 regex 中捕獲組只是從 () 括號(hào)中提取一個(gè)模式,可以使用 /regex/.exec(string)string.match 捕捉組。

常規(guī)捕獲組是通過將模式包裝在 (pattern) 中創(chuàng)建的,但是要在結(jié)果對(duì)象上創(chuàng)建 groups 屬性,它是: (?pattern)。

要?jiǎng)?chuàng)建一個(gè)新的組名,只需在括號(hào)內(nèi)附加 ?,結(jié)果中,分組 (pattern) 匹配將成為 group.name,并附加到 match 對(duì)象,以下是一個(gè)實(shí)例:

字符串標(biāo)本匹配:

這里創(chuàng)建了 match.groups.color 和 match.groups.bird

const string = "black*raven lime*parrot white*seagull";
const regex = /(?.*?)*(?[a-z0-9]+)/g;
while (match = regex.exec(string))
{
    let value = match[0];
    let index = match.index;
    let input = match.input;
    console.log(`${value} at ${index} with "${input}"`);
console.log(match.groups.color);
    console.log(match.groups.bird);
}

需要多次調(diào)用 regex.exec 方法來遍歷整個(gè)搜索結(jié)果集。 在每次迭代期間調(diào)用.exec 時(shí),將顯示下一個(gè)結(jié)果(它不會(huì)立即返回所有匹配項(xiàng)。),因此使用 while 循環(huán)。

輸出如下:

black*raven at 0 with "black*raven lime*parrot white*seagull"
black
raven
lime*parrot at 11 with "black*raven lime*parrot white*seagull"
lime
parrot
white*seagull at 23 with "black*raven lime*parrot white*seagull"
white
seagull

但奇怪的是:

如果你從這個(gè)正則表達(dá)式中刪除 /g,你將永遠(yuǎn)在第一個(gè)結(jié)果上創(chuàng)建一個(gè)無限循環(huán)。這在過去是一個(gè)巨大的痛苦。想象一下,從某個(gè)數(shù)據(jù)庫(kù)接收正則表達(dá)式時(shí),你不確定它的末尾是否有 /g,你得先檢查一下。
使用 .matchAll() 的好理由

在與捕獲組一起使用時(shí),它可以更加優(yōu)雅,捕獲組只是使用 () 提取模式的正則表達(dá)式的一部分。

返回一個(gè)迭代器而不是一個(gè)數(shù)組,迭代器本身是有用的。

迭代器可以使用擴(kuò)展運(yùn)算符 (…) 轉(zhuǎn)換為數(shù)組。

它避免了帶有 /g 標(biāo)志的正則表達(dá)式,當(dāng)從數(shù)據(jù)庫(kù)或外部源檢索未知正則表達(dá)式并與陳舊的RegEx 對(duì)象一起使用時(shí),它非常有用。

使用 RegEx 對(duì)象創(chuàng)建的正則表達(dá)式不能使用點(diǎn) (.) 操作符鏈接。

高級(jí): RegEx 對(duì)象更改跟蹤最后匹配位置的內(nèi)部 .lastindex 屬性,這在復(fù)雜的情況下會(huì)造成嚴(yán)重破壞。

.matchAll() 是如何工作的?

讓我們嘗試匹配單詞 hello 中字母 el 的所有實(shí)例, 因?yàn)榉祷亓说?,所以可以使?for…of 循環(huán)遍歷它:

// Match all occurrences of the letters: "e" or "l" 
let iterator = "hello".matchAll(/[el]/);
for (const match of iterator)
    console.log(match);

這一次你可以跳過 /g, .matchall 方法不需要它,結(jié)果如下:

[ "e", index: 1, input: "hello" ] // Iteration 1
[ "l", index: 2, input: "hello" ] // Iteration 2
[ "l", index: 3, input: "hello" ] // Iteration 3

使用 .matchAll() 捕獲組示例:

.matchAll 具有上面列出的所有好處。它是一個(gè)迭代器,可以用 for…of 循環(huán)遍歷它,這就是整個(gè)語法的不同。

const string = "black*raven lime*parrot white*seagull";
const regex = /(?.*?)*(?[a-z0-9]+)/;
for (const match of string.matchAll(regex)) {
    let value = match[0];
    let index = match.index;
    let input = match.input;
    console.log(`${value} at ${index} with "${input}"`);
console.log(match.groups.color);
    console.log(match.groups.bird);
}

請(qǐng)注意已經(jīng)沒有 /g 標(biāo)志,因?yàn)?.matchAll() 已經(jīng)包含了它,打印如下:

black*raven at 0 with "black*raven lime*parrot white*seagull"
black
raven
lime*parrot at 11 with "black*raven lime*parrot white*seagull"
lime
parrot
white*seagull at 23 with "black*raven lime*parrot white*seagull"
white
seagull

也許在美學(xué)上它與原始正則表達(dá)式非常相似,執(zhí)行while循環(huán)實(shí)現(xiàn)。但是如前所述,由于上面提到的許多原因,這是更好的方法,移除 /g 不會(huì)導(dǎo)致無限循環(huán)。

動(dòng)態(tài)導(dǎo)入

現(xiàn)在可以將導(dǎo)入分配給變量:

element.addEventListener("click", async() => {
  const module = await import(`./api-scripts/button-click.js`);
  module.clickEvent();
})

Array.flat()

扁平化多維數(shù)組:

let multi = [1,2,3,[4,5,6,[7,8,9,[10,11,12]]]];
multi.flat();               // [1,2,3,4,5,6,Array(4)]
multi.flat().flat();        // [1,2,3,4,5,6,7,8,9,Array(3)]
multi.flat().flat().flat(); // [1,2,3,4,5,6,7,8,9,10,11,12]
multi.flat(Infinity);       // [1,2,3,4,5,6,7,8,9,10,11,12]
Array.flatMap()
let array = [1, 2, 3, 4, 5];
array.map(x => [x, x * 2]);


let array = [1, 2, 3, 4, 5];
array.map(x => [x, x * 2]);

結(jié)果:

[Array(2), Array(2), Array(2), Array(2), Array(2)]
0: (2) [1, 2]
1: (2) [2, 4]
2: (2) [3, 6]
3: (2) [4, 8]
4: (2) [5, 10]

使用 flatMap 方法:

array.flatMap(v => [v, v * 2]);
[1, 2, 2, 4, 3, 6, 4, 8, 5, 10]

Object.fromEntries()

將鍵值對(duì)列表轉(zhuǎn)換為對(duì)象:

let obj = { apple : 10, orange : 20, banana : 30 };
let entries = Object.entries(obj);
entries;
(3) [Array(2), Array(2), Array(2)]
 0: (2) ["apple", 10]
 1: (2) ["orange", 20]
 2: (2) ["banana", 30]
let fromEntries = Object.fromEntries(entries);
{ apple: 10, orange: 20, banana: 30 }

String.trimStart() 與 String.trimEnd()
let greeting = "     Space around     ";
greeting.trimEnd();   // "     Space around";
greeting.trimStart(); // "Space around     ";

格式良好的 JSON.stringify()

此更新修復(fù)了字符 U+D800U+DFFF 的處理,有時(shí)可以進(jìn)入 JSON 字符串。 這可能是一個(gè)問題,因?yàn)?JSON.stringify 可能會(huì)將這些數(shù)字格式化為沒有等效 UTF-8 字符的值, 但 JSON 格式需要 UTF-8 編碼。

解析方法使用格式良好的JSON字符串,如:

"{ “prop1” : 1, "prop2" : 2 }"; // A well-formed JSON format string

注意,要?jiǎng)?chuàng)建正確 JSON 格式的字符串,絕對(duì)需要在屬性名周圍加上雙引號(hào)。缺少或任何其他類型的引號(hào)都不會(huì)生成格式良好的JSON。

"{ “prop1” : 1, "meth" : () => {}}"; // Not JSON format string

JSON 字符串格式與 Object Literal 不同,后者看起來幾乎一樣,但可以使用任何類型的引號(hào)括住屬性名,也可以包含方法(JSON格式不允許使用方法):

let object_literal = { property: 1, meth: () => {} };

不管怎樣,一切似乎都很好。第一個(gè)示例看起來是兼容的。但它們也是簡(jiǎn)單的例子,大多數(shù)情況下都能順利地工作!

U+2028 和 U+2029 字符

問題是, ES10 之前的 EcmaScript 實(shí)際上并不完全支持 JSON 格式。前 ES10 時(shí)代不接受未轉(zhuǎn)義行分隔符 U+2028 和段落分隔符 U+2029 字符:

對(duì)于 U+D800 - U+DFFF 之間的所有字符也是如此

如果這些字符潛入 JSON 格式的字符串(假設(shè)來自數(shù)據(jù)庫(kù)記錄),你可能會(huì)花費(fèi)數(shù)小時(shí)試圖弄清楚為什么程序的其余部分會(huì)產(chǎn)生解析錯(cuò)誤。

因此,如果你傳遞 eval 這樣的字符串 “console.log(" hello ")”,它將執(zhí)行 JavaScript語句 (通過嘗試將字符串轉(zhuǎn)換為實(shí)際代碼),也類似于 JSON.parse 將處理你的 JSON 字符串的方式。

穩(wěn)定的 Array.prototype.sort()

V8 之前的實(shí)現(xiàn)對(duì)包含10個(gè)以上項(xiàng)的數(shù)組使用了一種不穩(wěn)定的快速排序算法。

一個(gè)穩(wěn)定的排序算法是當(dāng)兩個(gè)鍵值相等的對(duì)象在排序后的輸出中出現(xiàn)的順序與在未排序的輸入中出現(xiàn)的順序相同時(shí)。

但情況不再是這樣了,ES10 提供了一個(gè)穩(wěn)定的數(shù)組排序:

var fruit = [
    { name: "Apple",      count: 13, },
    { name: "Pear",       count: 12, },
    { name: "Banana",     count: 12, },
    { name: "Strawberry", count: 11, },
    { name: "Cherry",     count: 11, },
    { name: "Blackberry", count: 10, },
    { name: "Pineapple",  count: 10, }
];
// 創(chuàng)建排序函數(shù):
let my_sort = (a, b) => a.count - b.count;
// 執(zhí)行穩(wěn)定的ES10排序:
let sorted = fruit.sort(my_sort);
console.log(sorted);

控制臺(tái)輸出(項(xiàng)目以相反的順序出現(xiàn)):

新的F unction.toString()

函數(shù)是對(duì)象,并且每個(gè)對(duì)象都有一個(gè) .toString() 方法,因?yàn)樗畛醮嬖谟?strong>Object.prototype.toString() 上。 所有對(duì)象(包括函數(shù))都是通過基于原型的類繼承從它繼承的。

這意味著我們以前已經(jīng)有 funcion.toString() 方法了。

但是 ES10 進(jìn)一步嘗試標(biāo)準(zhǔn)化所有對(duì)象和內(nèi)置函數(shù)的字符串表示。 以下是各種新案例:

典型的例子:
function () { console.log("Hello there."); }.toString();

控制臺(tái)輸出(函數(shù)體的字符串格式:)

? function () { console.log("Hello there."); }

下面是剩下的例子:

直接在方法名 .toString()
Number.parseInt.toString();
? function parseInt() { [native code] }
綁定上下文:
function () { }.bind(0).toString();
? function () { [native code] }

內(nèi)置可調(diào)用函數(shù)對(duì)象:
Symbol.toString();
? function Symbol() { [native code] }
動(dòng)態(tài)生成的函數(shù):
function* () { }.toString();
? function* () { }

prototype.toString
Function.prototype.toString.call({});
? Function.prototype.toString requires that "this" be a Function"

可選的 Catch Binding

在過去,try/catch 語句中的 catch 語句需要一個(gè)變量。 try/catch 語句幫助捕獲終端級(jí)別的錯(cuò)誤:

try {
    // Call a non-existing function undefined_Function
    undefined_Function("I"m trying");
}
catch(error) {
    // Display the error if statements inside try above fail
    console.log( error ); // undefined_Function is undefined
}

在某些情況下,所需的錯(cuò)誤變量是未使用的:

try {
    JSON.parse(text); // <--- this will fail with "text not defined"
    return true; <--- exit without error even if there is one
}
catch (redundant_sometmes) <--- this makes error variable redundant
{
    return false;
}

編寫此代碼的人通過嘗試強(qiáng)制 true 退出 try 子句。但是,這并不是實(shí)際發(fā)生的情況

(() => {
    try {
        JSON.parse(text)
        return true
    } catch(err) {
        return false
    }
})()
=> false

在 ES10 中,捕獲錯(cuò)誤的變量是可選的

現(xiàn)在可以跳過錯(cuò)誤變量:

try {
    JSON.parse(text);
    return true;
}
catch
{
    return false;
}

目前還無法測(cè)試上一個(gè)示例中的 try 語句的結(jié)果,但一旦它出來,我將更新這部分。

標(biāo)準(zhǔn)化 globalThis 對(duì)象

這在ES10之前, globalThis 還沒有標(biāo)準(zhǔn)化。

在產(chǎn)品代碼中,你可以自己編寫這個(gè)怪物,在多個(gè)平臺(tái)上“標(biāo)準(zhǔn)化”它:

var getGlobal = function () {
    if (typeof self !== "undefined") { return self; }
    if (typeof window !== "undefined") { return window; }
    if (typeof global !== "undefined") { return global; }
    throw new Error("unable to locate global object");
};

但即使這樣也不總是奏效。因此,ES10 添加了 globalThis 對(duì)象,從現(xiàn)在開始,該對(duì)象用于在任何平臺(tái)上訪問全局作用域:

// 訪問全局?jǐn)?shù)組構(gòu)造函數(shù)
globalThis.Array(0, 1, 2);
? [0, 1, 2]

// 類似于 ES5 之前的 window.v = { flag: true }
globalThis.v = { flag: true };

console.log(globalThis.v);
? { flag: true }
Symbol.description

description 是一個(gè)只讀屬性,它返回 Symbol 對(duì)象的可選描述。

let mySymbol = "My Symbol";
let symObj = Symbol(mySymbol);
symObj; // Symbol(My Symbol)
symObj.description; // "My Symbol"
Hashbang 語法

也就是 unix 用戶熟悉的 shebang。它指定一個(gè)解釋器(什么將執(zhí)行JavaScript文件?)。

ES10標(biāo)準(zhǔn)化,我不會(huì)對(duì)此進(jìn)行詳細(xì)介紹,因?yàn)閺募夹g(shù)上講,這并不是一個(gè)真正的語言特性,但它基本上統(tǒng)一了 JavaScript 在服務(wù)器端的執(zhí)行方式。

$ ./index.js

代替

$ node index.js
ES10類:private、static 和 公共成員

新的語法字符 #octothorpe(hash tag)現(xiàn)在用于直接在類主體的范圍內(nèi)定義變量,函數(shù),getter 和 setter ......以及構(gòu)造函數(shù)和類方法。

下面是一個(gè)毫無意義的例子,它只關(guān)注新語法:

class Raven extends Bird {
#state = { eggs: 10};
// getter
    get #eggs() { 
        return state.eggs;
    }
// setter
    set #eggs(value) {
        this.#state.eggs = value;
    }
#lay() {
        this.#eggs++;
    }
constructor() {
        super();
        this.#lay.bind(this);
    }
#render() {
        /* paint UI */
    }
}

老實(shí)說,我認(rèn)為這會(huì)讓語言更難讀。

代碼部署后可能存在的BUG沒法實(shí)時(shí)知道,事后為了解決這些BUG,花了大量的時(shí)間進(jìn)行l(wèi)og 調(diào)試,這邊順便給大家推薦一個(gè)好用的BUG監(jiān)控工具 Fundebug。

原文:

https://medium.freecodecamp.o...

你的點(diǎn)贊是我持續(xù)分享好東西的動(dòng)力,歡迎點(diǎn)贊!

交流

干貨系列文章匯總?cè)缦?,覺得不錯(cuò)點(diǎn)個(gè)Star,歡迎 加群 互相學(xué)習(xí)。

https://github.com/qq44924588...

我是小智,公眾號(hào)「大遷世界」作者,對(duì)前端技術(shù)保持學(xué)習(xí)愛好者。我會(huì)經(jīng)常分享自己所學(xué)所看的干貨,在進(jìn)階的路上,共勉!

關(guān)注公眾號(hào),后臺(tái)回復(fù)福利,即可看到福利,你懂的。

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://www.ezyhdfw.cn/yun/102137.html

相關(guān)文章

  • 前端學(xué)習(xí)資源

    摘要:提供了完整的環(huán)境,并且支持自定義域名指向,動(dòng)態(tài)計(jì)算資源調(diào)整,可以完成各種應(yīng)用的開發(fā)編譯與部署。 react 新特性 react16 Context 算法相關(guān) 圖解排序算法(二)之希爾排序 微信小程序 微信小程序組件化的解決方案移動(dòng)端尺寸基本知識(shí) 瀏覽器 前端必讀:瀏覽器內(nèi)部工作原理瀏覽器緩存原理解讀瀏覽器加載css和js及dom解析之間的關(guān)系瀏覽器緩存 CSS學(xué)習(xí) 移動(dòng)web開發(fā)布局入...

    zhisheng 評(píng)論0 收藏0
  • 王下邀月熊_Chevalier前端每周清單系列文章索引

    摘要:感謝王下邀月熊分享的前端每周清單,為方便大家閱讀,特整理一份索引。王下邀月熊大大也于年月日整理了自己的前端每周清單系列,并以年月為單位進(jìn)行分類,具體內(nèi)容看這里前端每周清單年度總結(jié)與盤點(diǎn)。 感謝 王下邀月熊_Chevalier 分享的前端每周清單,為方便大家閱讀,特整理一份索引。 王下邀月熊大大也于 2018 年 3 月 31 日整理了自己的前端每周清單系列,并以年/月為單位進(jìn)行分類,具...

    2501207950 評(píng)論0 收藏0
  • [譯]JavaScript ES6箭頭函數(shù)指南

    摘要:以下例子的目的是使用來展示一個(gè)每秒都會(huì)更新的時(shí)鐘當(dāng)嘗試在的回調(diào)中使用來引用元素時(shí),很不幸,我們得到的只是一個(gè)屬于回調(diào)函數(shù)自身上下文的。 前言 胖箭頭函數(shù)(Fat arrow functions),又稱箭頭函數(shù),是一個(gè)來自ECMAScript 2015(又稱ES6)的全新特性。有傳聞?wù)f,箭頭函數(shù)的語法=>,是受到了CoffeeScript 的影響,并且它與CoffeeScript中的=>...

    makeFoxPlay 評(píng)論0 收藏0
  • 前端每周清單年度總結(jié)與盤點(diǎn)

    摘要:前端每周清單年度總結(jié)與盤點(diǎn)在過去的八個(gè)月中,我?guī)缀踔蛔隽藘杉?,工作與整理前端每周清單。本文末尾我會(huì)附上清單線索來源與目前共期清單的地址,感謝每一位閱讀鼓勵(lì)過的朋友,希望你們能夠繼續(xù)支持未來的每周清單。 showImg(https://segmentfault.com/img/remote/1460000010890043); 前端每周清單年度總結(jié)與盤點(diǎn) 在過去的八個(gè)月中,我?guī)缀踔蛔隽?..

    jackwang 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<