今年、ECMAScript 2019 (略して ES2019) がリリースされます。新機能には、Object.fromEntries()、trimStart()、trimEnd()、 flat()、 flatMap()、シンボル オブジェクトの description 属性、オプションのキャッチ バインディングなどが含まれます。
1、Object.fromEntries()
JavaScript では、データをある形式から別の形式に変換します。非常に一般的です。オブジェクトを配列に変換しやすくするために、ES2017 では Object.entrie() メソッドが導入されました。このメソッドはオブジェクトをパラメータとして受け取り、オブジェクト独自の列挙可能な文字列とキーを持つプロパティのペアの配列を [key, value] の形式で返します。例:
const obj = {one: 1, two: 2, three: 3}; console.log(Object.entries(obj)); // => [["one", 1], ["two", 2], ["three", 3]]
しかし、逆のことをして、キーと値のペアのリストをオブジェクトに変換したい場合はどうすればよいでしょうか? Python などの一部のプログラミング言語では、この目的のために dict() 関数が提供されています。 Underscore.js と Lodash には _.fromPairs 関数もあります。
ES2019 では、JavaScript に同様の機能をもたらす Object.fromEntries() メソッドが導入されました。この静的メソッドを使用すると、キーと値のペアのリストをオブジェクトに簡単に変換できます:
const myArray = [['one', 1], ['two', 2], ['three', 3]]; const obj = Object.fromEntries(myArray); console.log(obj); // => {one: 1, two: 2, three: 3}
As youご覧のとおり、Object.fromEntries() は Object.entries() の逆のことを行います。以前は Object.fromEntries() と同じ機能を実装することができましたが、その実装方法はやや複雑でした。
const myArray = [['one', 1], ['two', 2], ['three', 3]]; const Array.from(myArray).reduce((acc, [key, val]) => Object.assign(acc, {[key]: val}), {}) console.log(obj); // => {one: 1, two: 2, three: 3}
Object.fromEntries() に渡される引数は、以下を実装する任意のオブジェクトであることに注意してください。反復可能なプロトコル。2 要素の配列のようなオブジェクトを返す限り。
たとえば、次のコードでは、Object.fromEntries() は Map オブジェクトをパラメータとして受け取り、キーと対応する値が Map 内のペアによって与えられる新しいオブジェクトを作成します。
const map = new Map(); map.set('one', 1); map.set('two', 2); const obj = Object.fromEntries(map); console.log(obj); // => {one: 1, two: 2}
const obj = {a: 4, b: 9, c: 16}; // 将对象转换为数组 const arr = Object.entries(obj); // 计算数字的平方根 const map = arr.map(([key, val]) => [key, Math.sqrt(val)]); // 将数组转换回对象 const obj2 = Object.fromEntries(map); console.log(obj2); // => {a: 2, b: 3, c: 4}
const paramsString = 'param1=foo¶m2=baz'; const searchParams = new URLSearchParams(paramsString); Object.fromEntries(searchParams); // => {param1: "foo", param2: "baz"}
2. trimStart() および trimEnd()
trimStart() メソッドおよび TrimEnd() メソッドは、trimLeft() および TrimRight() と同じように実装されます。これらのメソッドは現在フェーズ 4 にあり、padStart() および PadEnd() との一貫性を保つために仕様に追加される予定です。いくつかの例を見てください:const str = " string "; // es2019 console.log(str.trimStart()); // => "string " console.log(str.trimEnd()); // => " string" // 相同结果 console.log(str.trimLeft()); // => "string " console.log(str.trimRight()); // => " string"
3. flat() と flatMap()
flat() メソッドは、多次元配列を 1 次元配列にフラット化できますconst arr = ['a', 'b', ['c', 'd']]; const flattened = arr.flat(); console.log(flattened); // => ["a", "b", "c", "d"]
const arr = ['a', 'b', ['c', 'd']]; const flattend = [].concat.apply([], arr); // or // const flattened = [].concat(...arr); console.log(flattened); // => ["a", "b", "c", "d"]
const arr = ['a', , , 'b', ['c', 'd']]; const flattened = arr.flat(); console.log(flattened); // => ["a", "b", "c", "d"]
const arr = [10, [20, [30]]]; console.log(arr.flat()); // => [10, 20, [30]] console.log(arr.flat(1)); // => [10, 20, [30]] console.log(arr.flat(2)); // => [10, 20, 30]
const arr = [4.25, 19.99, 25.5]; console.log(arr.map(value => [Math.round(value)])); // => [[4], [20], [26]] console.log(arr.flatMap(value => [Math.round(value)])); // => [4, 20, 26]
const arr = [[7.1], [8.1], [9.1], [10.1], [11.1]]; // do not include items bigger than 9 arr.flatMap(value => { if (value >= 10) { return []; } else { return Math.round(value); } }); // returns: // => [7, 8, 9]
4. Symbol オブジェクトの description 属性
シンボルを作成するときに、デバッグ目的で説明 (説明) を追加できます。コード内の説明に直接アクセスできると便利な場合があります。 ES2019 は、読み取り専用の属性説明を Symbol オブジェクトに追加し、シンボルの説明を含む文字列を返します。let sym = Symbol('foo'); console.log(sym.description); // => foo sym = Symbol(); console.log(sym.description); // => undefined // create a global symbol sym = Symbol.for('bar'); console.log(sym.description); // => bar
5. オプションの catch
try catch ステートメントの catch は役に立たない場合があります。次のコードについて考えてください:try { // 使用浏览器可能尚未实现的功能 } catch (unused) { // 这里回调函数中已经帮我们处理好的错误 }
try { // ... } catch { // .... }
const re = /(Dr\. )\w+/g; const str = 'Dr. Smith and Dr. Anderson'; const matches = str.matchAll(re); for (const match of matches) { console.log(match); } // logs: // => ["Dr. Smith", "Dr. ", index: 0, input: "Dr. Smith and Dr. Anderson", groups: undefined] // => ["Dr. Anderson", "Dr. ", index: 14, input: "Dr. Smith and Dr. Anderson", groups: undefined]
const re = /(Dr\.) \w+/g; const str = 'Dr. Smith and Dr. Anderson'; let matches; while ((matches = re.exec(str)) !== null) { console.log(matches); } // logs: // => ["Dr. Smith", "Dr.", index: 0, input: "Dr. Smith and Dr. Anderson", groups: undefined] // => ["Dr. Anderson", "Dr.", index: 14, input: "Dr. Smith and Dr. Anderson", groups: undefined]
重要的是要注意尽管match() 方法可以与全局标志g一起使用来访问所有匹配,但它不提供匹配的捕获组或索引位置。 比较以下代码:
const re = /page (\d+)/g; const str = 'page 2 and page 10'; console.log(str.match(re)); // => ["page 2", "page 10"] console.log(...str.matchAll(re)); // => ["page 2", "2", index: 0, input: "page 2 and page 10", groups: undefined] // => ["page 10", "10", index: 11, input: "page 2 and page 10", groups: undefined]
总结
在这篇文章中,我们仔细研究了 ES2019 中引入的几个关键特性,包括Object.fromEntries(),trimStart(), trimEnd(), flat(), flatMap(),symbol 对象的description 属性以及可选的catch 。
更多相关知识请关注JavaScript视频教程栏目
以上がES10 の 5 つの新機能の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。