今天看到一個文章,說node12&chrome中7個新的提案功能。javascript
若是在這裏發表了這個文章有侵權嫌疑,請告知刪除此文java
我看了下,有幾個確定用的到,甚至還有?.
,玩ruby的同窗是否是以爲很熟悉(&.
)。node
如下是看到的文章的原文。git
JavaScript(或ECMA script)是一種不斷髮展的語言,有許多關於如何更好發展的建議和想法。TC39(技術委員會39)是負責定義JS標準和特性的委員會,今年他們一直很活躍。如下是目前處於"第3階段"的一些提案的摘要,這是在"完成"以前的最後一個階段。這意味着這些功能應該很快就會在瀏覽器和其餘引擎中實現。事實上,其中一些如今可用。github
#
Chrome & NodeJS 12 中可用chrome
是的,你沒有看過。最終,JS在類中獲取私有字段。再也不須要this._doPrivateStuff()
,定義閉包來存儲私有值,或者使用WeakMap
來hack私有props。數據庫
語法看起來像下面這樣:promise
// 私有字段必須使用'#'開頭
// 而且不能夠在類這個塊的外面去訪問
class Counter {
#x = 0;
#increment() {
this.#x++;
}
onClick() {
this.#increment();
}
}
const c = new Counter();
c.onClick(); // works fine
c.#increment(); // error
複製代碼
提案:github.com/tc39/propos…瀏覽器
?.
之前必須訪問嵌套在對象內的幾個級別的屬性,並獲得臭名昭著的錯誤Cannot read property 'stop' of undefined
。而後更改代碼以處理鏈中的每一個多是undefined
的對象,例如:緩存
const stop = please && please.make && please.make.it && please.make.it.stop;
// 或可使用像'object-path'這樣的庫
const stop = objectPath.get(please, "make.it.stop");
複製代碼
經過可選的連接,你就能夠像下面這樣來處理:
const stop = please?.make?.it?.stop;
複製代碼
??
變量的可選值可能缺失,若是丟失,則使用默認值,這樣屬於很常見的現象:
const duration = input.duration || 500;
複製代碼
||
的問題是它將覆蓋全部falsy值,如(0
, ''
, false
),在某些狀況下多是有效的輸入。
鍵入null合併運算符,他只會覆蓋undefined
或null
:
const duration = input.duration ?? 500;
複製代碼
1n
Chrome & NodeJS 12 中可用
JS一直不擅長數學的一個緣由是咱們沒法可靠地存儲大於2 ^ 53
的數,這使得處理至關大的數很是困難。幸運的是,BigInt
是一個解決這個特定問題的提案。
閒話少說,show me your code:
// 能夠定義 BigInt 經過追加 'n' 到一個數字字面量
const theBiggestInt = 9007199254740991n;
// 對字面量使用構造函數
const alsoHuge = BigInt(9007199254740991);
// 或者對字符串使用
const hugeButString = BigInt('9007199254740991');
複製代碼
你還能夠在BigInt
上使用與普通數字相同的運算符,例如:+
,-
,/
,*
,%
,…不過有一個問題,在大多數操做中不能將BigInt
與數字混合使用。比較Number
和BigInt
工做方式,但不能添加他們:
1n < 2
// true
1n + 2
// 🤷♀️ Uncaught TypeError: Cannot mix BigInt and other types, use explicit conversions
複製代碼
譯:根據上面的報錯提示,你能夠改成顯示的轉換
Number(1n) + 2 複製代碼
static
字段Chrome & NodeJS 12 中可用
這個很簡單。它容許在類上有一個靜態字段,相似於大多數OOP語言。靜態字段能夠做爲枚舉的替代,它們也能夠用於私有字段。
class Colors {
// public static fields
static red = '#ff0000';
static green = '#00ff00';
// private static fields
static #secretColor = '#f0f0f0';
}
font.color = Colors.red;
font.color = Colors.#secretColor; // Error
複製代碼
await
chrome中可用
容許在你代碼的頂層使用await。這對於調試瀏覽器控制檯中的異步內容(如fetch
)很是有用,而無需將其封裝在async函數中。
若是你須要複習異步並等待,請看我在這篇文章裏對他的解釋。
另外一個致命的用例是,它能夠在以異步方式初始化的ES模塊的頂層使用(好比創建鏈接的數據庫層)。當import這樣的「異步模塊」時,模塊系統將在執行依賴它的模塊以前等待它解析。這將使處理異步初始化比當前返回初始化promise並等待它的工做區容易得多。模塊將不知道它的依賴關係是不是異步的。
// db.mjs
export const connection = await createConnection();
複製代碼
// server.mjs
import { connection } from './db.mjs';
server.start();
複製代碼
在此示例中,在db.mjs
中完成鏈接以前,不會在server.mjs
中執行任何操做。
WeakRef
Chrome & NodeJS 12 中可用
對象的弱引用是再也不可以使對象保持活的引用。每當咱們使用(const
、let
、var
)建立一個變量時,只要該變量的引用仍然可訪問,垃圾收集器(GC)就永遠不會從內存中刪除該變量。這些都是強引用。可是,若是沒有對弱引用引用的對象有強引用,則GC能夠在任什麼時候候刪除它。WeakRef
實例有一個deref
方法,它返回被引用的原始對象,若是原始對象被垃圾回收期收集,則返回undefined
。
這對於緩存廉價對象可能頗有用,由於你不想將全部對象都永遠存儲在內存中。
const cache = new Map();
const setValue = (key, obj) => {
cache.set(key, new WeakRef(obj));
};
const getValue = (key) => {
const ref = cache.get(key);
if (ref) {
return ref.deref();
}
};
// this will look for the value in the cache
// and recalculate if it's missing
const fibonacciCached = (number) => {
const cached = getValue(number);
if (cached) return cached;
const sum = calculateFibonacci(number);
setValue(number, sum);
return sum;
};
複製代碼
對於緩存遠程數據來講,這可能不是一個好主意,由於遠程數據從內存中刪除 不可預測。在這種狀況下,最好使用相似LRU緩存的東西。
譯:LRU緩存,是否有去了解?或者下次一塊兒瞭解下 Implementing LRU cache in JavaScript -- medium
就是這樣。我但願你和我同樣會興奮地使用這些很酷的新功能。有關這些提案以及我未說起的其餘提案的更多詳細信息,請保持關注github上的TC39提案。