JavaScript akan membawa dua jenis data baru yang tidak berubah: rekod dan tuple. Mereka kini berada di Fasa 2 proses kelulusan standard TC39 dan masih diperbaiki dan tidak terdapat dalam mana -mana penyemak imbas atau persekitaran runtime, tetapi versi pelaksanaan dijangka tersedia dalam tahun depan. Mereka direka untuk menyelesaikan beberapa masalah yang sukar dihadapi oleh pemaju apabila menggunakan tatasusunan dan objek.
mata utama
untuk mengisytiharkan pembolehubah adalah amalan terbaik. Ia menjadikan pembolehubah tidak berubah. Nilai tidak boleh diubah, jadi anda perlu menangani masalah yang lebih sedikit. const
hanya boleh membuat nilai asas tidak berubah (rentetan, nombor, bigin, boolean, simbol, dan tidak ditentukan). Anda tidak boleh menetapkan semula susunan atau objek, tetapi nilai dan sifat yang mereka ada adalah const
boleh diubah suai. Contohnya:
// 数组常量 const myArray = [1, 2, 3]; // 更改数组值 myArray[0] = 99; myArray.push(42); console.log(myArray); // [ 99, 2, 3, 42 ] myArray = 'change'; // 错误!
boleh membantu, tetapi ia hanya memohon pembekuan cetek ke sifat anak langsung objek:
// 对象常量 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'; // 错误!
Oleh itu, sukar untuk memastikan fungsi tidak sengaja atau tidak sengaja mengubah nilai -nilai yang disimpan dalam tatasusunan atau objek. Pemaju sama ada meninggalkan perkara sahaja atau lulus versi pembolehubah yang diklonkan - (ini juga mempunyai cabaran tersendiri). 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 } }
lebih banyak kekeliruan mungkin berlaku apabila pemaju cuba membuat objek atau perbandingan array yang munasabah:
. Hanya apabila dua pembolehubah menunjuk kepada item yang sama dalam ingatan mereka sama:
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
Perbandingan mendalam dua objek atau tatasusunan memerlukan fungsi perbandingan rekursif untuk menilai setiap nilai pada gilirannya. Walaupun begitu, anda mungkin mempunyai masalah dengan jenis seperti tarikh atau fungsi yang mungkin disimpan dengan cara yang berbeza. tuple adalah struktur data seperti array dengan kedalaman yang tidak berubah. Mereka sebenarnya adalah jenis primitif kompaun, yang dikenal pasti dengan pengubah atau, kaedah Tidak seperti array standard, tuple mesti memenuhi keperluan berikut:
untuk perbandingan. Contohnya:
Rekod hanya boleh dibandingkan dengan rekod lain, jadi tidak ada perbezaan antara menggunakan pengendali dan Apakah rekod dalam JavaScript? Rekod dalam JavaScript adalah struktur seperti objek yang diperkenalkan dalam ECMAScript 2022 (ES12). Ia direka untuk mewakili data dengan sifat bernama dan tidak berubah secara lalai, jadi ia sesuai digunakan sebagai struktur data di mana nilai tidak berubah selepas penciptaan. Apakah tuple dalam JavaScript? Tuples dalam JavaScript adalah koleksi elemen yang diperintahkan, di mana setiap elemen boleh menjadi jenis yang berbeza. Tuples tidak berubah dan diperbaiki panjang, menyediakan cara untuk mewakili dan memproses bilangan nilai tetap dalam urutan tertentu. Bagaimana rekod dan tuple meningkatkan kebolehbacaan dan pemeliharaan kod anda? Rekod dan tupel dapat meningkatkan kebolehbacaan kod dengan menyediakan cara yang lebih deklaratif dan berstruktur untuk mewakili data. Aspek kebolehubahan juga membantu mencegah pengubahsuaian yang tidak disengajakan, dengan itu meningkatkan pemeliharaan kod. Adakah terdapat pertimbangan prestasi apabila menggunakan rekod dan tuples? Rekod dan tupel bertindak sebagai struktur data yang tidak berubah, yang dapat meningkatkan prestasi dalam beberapa kes. Walau bagaimanapun, sokongan penyemak imbas dan kes penggunaan khusus mesti dipertimbangkan, kerana kesan prestasi mungkin berbeza -beza bergantung kepada butiran pelaksanaan runtime JavaScript. Bagaimana untuk menyediakan polyfill untuk rekod dan tupel dalam persekitaran tanpa sokongan asli? Sebagai kemas kini terakhir saya, rekod dan tuple boleh disimulasikan dalam persekitaran tanpa sokongan asli menggunakan polyfill atau penterjemah. Walau bagaimanapun, adalah disyorkan untuk mengikuti perkembangan terkini dengan standard dan alat JavaScript apabila ekosistem terus berkembang. Atas ialah kandungan terperinci Rekod dan Tuples: JavaScript ' s jenis data baru yang tidak berubah. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP! tuple: Struktur data seperti array yang tidak berubah
#
sebelum sintaks array normal: // 数组常量
const myArray = [1, 2, 3];
// 更改数组值
myArray[0] = 99;
myArray.push(42);
console.log(myArray); // [ 99, 2, 3, 42 ]
myArray = 'change'; // 错误!
Tuple.from()
baru boleh membuat tuple dari array: // 对象常量
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
. Sebagai contoh, #[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]
Rekod adalah struktur data yang serupa dengan objek dengan kedalaman yang tidak berubah. Sekali lagi, mereka adalah jenis primitif kompaun, yang dikenal pasti menggunakan pengubah
sebelum sintaks objek normal: #
// 新的元组
const t1 = #[1, 2, 3];
const t2 = #[1, 2, #[3, 4]];
Record()
Kaedah // 从数组创建新的元组
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
==
boleh diekstrak untuk perbandingan tertentu. Contohnya: ===
Object.keys()
Kemas kini yang tidak berubah Object.values()
// 新的记录
const r1 = #{ a: 1, b: 2 };
const r2 = #{
a: 1,
b: #{ c: 2 }, // 子记录
d: #[3, 4] // 子元组
};
Rekod dan tuples di JavaScript FAQ
Bagaimana perbezaan antara rekod dan objek JavaScript biasa? Tidak seperti objek biasa, rekod dalam JavaScript tidak berubah secara lalai, dan sekali ditetapkan, sifat mereka tidak dapat diubah suai. Rekod juga lebih diramalkan dan mempunyai struktur yang lebih ketat, jadi ia sesuai untuk digunakan sebagai bekas data.