JavaScriptのレコードとタプル:不変のデータ構造の未来
JavaScriptは、レコードとタプルという2つの新しい不変のデータ型を案内しようとしています。現在、TC39標準承認プロセスのフェーズ2にあり、まだ改善されており、ブラウザやランタイム環境では利用できませんが、実装バージョンは来年中に利用可能になると予想されます。それらは、アレイやオブジェクトを使用するときに開発者が直面する厳しい問題のいくつかを解決するように設計されています。
経験豊富なJavaScript開発者は、変数を宣言するためにconst
を使用することがベストプラクティスであることを知っています。変数を不変にします。値を変更できないため、より少ない問題に対処する必要があります。
残念ながら、const
はベース値を不変にすることのみができます(文字列、数字、ビッグインチ、ブール人、シンボル、未定義)。アレイやオブジェクトを再割り当てすることはできませんが、それらに含まれる値とプロパティはに変更できます。たとえば、
// 数组常量 const myArray = [1, 2, 3]; // 更改数组值 myArray[0] = 99; myArray.push(42); console.log(myArray); // [ 99, 2, 3, 42 ] myArray = 'change'; // 错误!
// 对象常量 const myObj = { a: 1, b: 2, c: 3 }; // 更改对象属性 myObj.a = 99; myObj.d = 42; console.log(myObj); // { a: 99, b: 2, c: 3, d: 42 } myObj = 'change'; // 错误!
メソッドは役立ちますが、オブジェクトの直接子の特性に浅い凍結のみを適用します。
Object.freeze()
したがって、関数がアレイまたはオブジェクトに保存された値を意図的または意図せずに変更しないようにすることは困難です。開発者は、物事をそのままにしておくか、バージョンのバージョンの変数を渡す - これには独自の課題もあります)。
const myObj = { a: 1, b: 2, c: { v: 3 } }; Object.freeze(myObj); myObj.a = 99; // 静默忽略 myObj.c.v = 99; // 可以正常工作 console.log(myObj); // { a: 1, b: 2, c: { v: 99 } }
開発者が一見合理的なオブジェクトまたは配列の比較を作成しようとすると、さらに混乱が発生する可能性があります:
値で比較することができます。オブジェクトと配列は渡され、参照
によって比較されます。 2つの変数がメモリ内の同じアイテムを指している場合にのみ、それらは等しくなります。const str = 'my string'; console.log(str === 'mystring'); // false const num = 123; console.log(num === 123); // true const arr = [1, 2, 3]; console.log(arr === [1, 2, 3]); // false const obj = { a: 1 }; console.log(obj === { a: 1 }); // false
タプルは、不変の深さのアレイのようなデータ構造です。それらは実際には、通常の配列の構文の前に#
モディファイアと識別される複合原始タイプです:
// 数组常量 const myArray = [1, 2, 3]; // 更改数组值 myArray[0] = 99; myArray.push(42); console.log(myArray); // [ 99, 2, 3, 42 ] myArray = 'change'; // 错误!
または、新しいTuple.from()
メソッドは、配列からタプルを作成できます:
// 对象常量 const myObj = { a: 1, b: 2, c: 3 }; // 更改对象属性 myObj.a = 99; myObj.d = 42; console.log(myObj); // { a: 99, b: 2, c: 3, d: 42 } myObj = 'change'; // 错误!
標準配列とは異なり、タプルは次の要件を満たす必要があります。
undefined
#[1,,,4]
基本的なタイプ、その他のタプル、またはレコードのみを設定できます。配列、オブジェクト、または関数を使用することは許可されていません。
const myObj = { a: 1, b: 2, c: { v: 3 } }; Object.freeze(myObj); myObj.a = 99; // 静默忽略 myObj.c.v = 99; // 可以正常工作 console.log(myObj); // { a: 1, b: 2, c: { v: 99 } }
演算子を使用できることに注意してください。たとえば、
const str = 'my string'; console.log(str === 'mystring'); // false const num = 123; console.log(num === 123); // true const arr = [1, 2, 3]; console.log(arr === [1, 2, 3]); // false const obj = { a: 1 }; console.log(obj === { a: 1 }); // false
レコード:不変のオブジェクトのようなデータ構造==
const a = [1, 2]; const b = a; b.push(3); console.log(a === b); // true // 原始数组已更改 console.log(a); // [1, 2, 3]
コンストラクターは、オブジェクトからレコードを作成できます。
#
// 新的元组 const t1 = #[1, 2, 3]; const t2 = #[1, 2, #[3, 4]];
Record()
// 从数组创建新的元组 const t3 = Tuple.from([1, 2, 3]);
文字列属性名を使用する必要があります。たとえば、Record.fromEntries()
は無効です。
const t4 = #[new Date()]; // 错误(设置一个对象) const t5 = #[1, 2, [3, 4]]; // 错误(设置一个数组)
#{ Symbol(): 1 }
レコードは他のレコードとのみ比較できます。そのため、const t6 = #[1, 2]; console.log(t6 === #[1, 2]); // true
不変のアップデート
const t7 = #[99]; console.log(t7 == #[99]); // true console.log(t7 == 99); // true console.log(t7 == '99'); // true // 元组不能与数组比较 console.log(t7 == [99]); // false
タプルとレコードは複雑なコンピューターサイエンスの用語のように聞こえますが、最終的にはJavaScriptの強力な不変のデータストレージと比較を可能にします。 ==
JavaScript FAQ ===
のレコードとタプル
Object.keys()
JavaScriptのレコードとは何ですか? JavaScriptのレコードは、ECMAScript 2022(ES12)で導入されたオブジェクトのような構造です。名前付きプロパティを使用してデータを表すように設計されており、デフォルトでは不可能であるため、作成後に値が変更されないデータ構造として使用するのに適しています。 Object.values()
// 新的记录 const r1 = #{ a: 1, b: 2 }; const r2 = #{ a: 1, b: #{ c: 2 }, // 子记录 d: #[3, 4] // 子元组 };
JavaScriptのタプルは何ですか? JavaScriptのタプルは、各要素が異なるタイプになる可能性のある要素の順序付けられたコレクションです。タプルは不変で長さが固定されており、特定の順序で固定数の値を表現および処理する方法を提供します。
レコードとタプルは、コードの読みやすさと保守性をどのように高めますか?レコードとタプルは、データを表すためのより宣言的で構造化された方法を提供することにより、コードの読みやすさを向上させることができます。不変性の側面は、偶発的な変更を防ぐのにも役立ち、それによりコードの保守性が向上します。
レコードやタプルを使用する際にパフォーマンス上の考慮事項はありますか?レコードとタプルは不変のデータ構造として機能し、場合によってはパフォーマンスを改善できます。ただし、パフォーマンスの影響はJavaScriptランタイムの実装の詳細によって異なる場合があるため、ブラウザのサポートと特定のユースケースを考慮する必要があります。
ネイティブサポートのない環境でレコードやタプルにポリフィルを提供する方法は?私の前回の更新時点で、レコードとタプルは、ポリフィルまたは翻訳者を使用してネイティブサポートなしで環境でシミュレートできます。ただし、エコシステムが進化し続けるにつれて、JavaScriptの標準とツールの更新を最新の状態に保つことをお勧めします。
以上がレコードとタプル:JavaScript'の新しい不変のデータ型の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。