programmatūra · 4 min · 11.07.2026

ECMAScript 2026: Temporal API nonāk standartā pēc deviņu gadu izstrādes

30. jūnijā ECMA International apstiprināja ECMAScript 2026 — JavaScript valodas specifikācijas 17. izdevumu. Versijā ir 14 papildinājumi; visi galvenie jau implementēti Chrome 130+, Firefox 130+ un Node.js 24+ pirms apstiprinājuma. TC39 ir Ecma International komiteja, kas apstiprina JavaScript standartus — funkcija kļūst par specifikācijas daļu, sasniedzot Stage 4.

Pēc izstrādes ilguma lielākais ir Temporal — JavaScript datuma un laika apstrādes pārkārtošana, kuras darbs TC39 komitejā sākās 2017. gadā. Bloomberg, Igalia, Google un Microsoft inženieru komanda deviņos gados publicēja vairāk nekā 500 GitHub diskusiju, pārkārtoja API no nulles divreiz un Stage 4 sasniedza šī gada martā.

Temporal: nekonstruktīvs un laika joslas drošs

JavaScript Date objektam ir trīs labi zināmas problēmas: tas pēc noklusējuma izmanto ierīces vietējo laika joslu; mēneša pievienošana dod nepareizu datumu, ja mēnešiem ir atšķirīgs dienu skaits; maiņas laika pārejas klusē rada stundu kļūdas. Temporal ievieš atsevišķas klases katram scenārijam — Temporal.PlainDate bez laika joslas, Temporal.ZonedDateTime ar pilnu laika joslas atskaiti, Temporal.Duration aritmētikai.

Visi Temporal objekti ir nekonstruktīvi — metodes atgriež jaunu objektu, neizmaina esošo. Laika josla jānorāda skaidri katrā ZonedDateTime izveides vietā; klusā “izmantot servera vietējo” vairs nav.

Temporal.ZonedDateTime.from({ year: 2026, month: 7, day: 11, timeZone: 'Europe/Riga' }).add({ months: 1 }).toString() atgriež '2026-08-11T00:00:00+03:00[Europe/Riga]' — korekti neatkarīgi no tā, kādā laika joslā darbojas serveris.

Node.js 24 iekļāva Temporal bez karoga kopš aprīļa. Pārlūkos pieejams sākot ar Chrome 127 un Firefox 139.

Iterator Helpers — lazy apstrāde bez starpposma masīviem

Array.prototype.map() un .filter() izveido jaunu pilna izmēra masīvu pēc katras metodes. Milzīgu datu kopu apstrādes ķēdēs tas nozīmē GB starpposma atmiņas. Iterator Helpers pievieno .map(), .filter(), .take(), .drop(), .flatMap(), .every() un .some() tieši uz iteratoriem ar slinku novērtēšanu — nākamais elements tiek pieprasīts tikai tad, kad iepriekšējais ir apstrādāts.

Kods Iterator.from(largeLog).filter(r => r.level === 'error').map(r => r.id).take(10).toArray() apstājas pēc desmitā kļūdu ieraksta atrašanas — pārējās rindas netiek lasītas. Ķēde strādā ar jebkuru Symbol.iterator objektu, arī ģeneratoriem. Iterator.concat(a, b) ļauj secīgi savienot vairākus iteratorus bez masīvu izveides.

Float16Array un WebGPU slodzes

Float16Array ir jauna TypedArray klase 16-bitu IEEE 754 peldpunkta vērtībām. WebGPU shaders un Web Neural Network API to pieprasa jau gadiem — fp16 aizņem 2 baitus pret fp32 4 baitiem, kas uz GPU atmiņu pārsūta divreiz mazāk datu. Līdz šim JavaScript kods glabāja fp16 kā Uint16Array un pats rakstīja konversiju.

Kopā ar Float16Array pienāk Math.f16round(n), kas noapaļo float64 vērtību uz tuvāko float16 reprezentāciju. Noderīgi kvantu modeļu izvades salīdzinājumos un shader datu validācijā, kur eksaktai fp16 noapaļošanai ir nozīme.

Pārējie septiņi papildinājumi

Promise.try(fn) aptin sinhronu vai asinhronu funkciju vienādā solījumā. Tas novērš vajadzību apvienot try/catch ar .catch() gadījumos, kad nav zināms, vai izsauktā funkcija met tūlīt vai atgriež Promise.

RegExp.escape(str) atgriež drošu, izbēgtu versiju stringam priekš ievietošanas dinamiskā regulārajā izteiksmē. Bez tā — vai pašrakstīta funkcija, vai ārēja pakotne. Nepareiza escaping ir XSS risks strādājot ar lietotāja ievadi regulārās izteiksmes kontekstā.

Error.isError(val) strādā pareizi starp iframe kontekstiem un Worker vidēm, kur instanceof Error neizdodas, jo katras vides Error konstruktors ir cits objekts.

Explicit Resource Management (using x = openFile(), await using conn = db.connect()) ievieš bloka līmeņa resursu tīrīšanu caur Symbol.dispose. Faili, datubāzu savienojumi un citi resursi aizveras automātiski, atstājot bloku — pat izņēmuma gadījumā. Tā ir C# using un Python with ekvivalents.

Math.sumPrecise(iter): [1e20, 0.1, -1e20] ar parastu .reduce((a, b) => a + b) dod 0 — peldpunkta noapaļošana apēd precizitāti. Math.sumPrecise atgriež 0.1.

Map.prototype.getOrInsert(key, val): tipiskais if (!map.has(k)) map.set(k, []); map.get(k).push(x) tagad rakstāmsmap.getOrInsert(k, []).push(x).

Uint8Array saņem .toBase64(), .toHex() un statiskās Uint8Array.fromBase64(), Uint8Array.fromHex() metodes, aizstājot atob/btoa — funkcijas, kas radīja apjukumu ar rindu beigu simboliem un padding — un pašrakstītas hex konversijas.

Avoti

komentārisaruna

Komentāri

Šim rakstam vēl nav komentāru. Esi pirmais, kurš dalās ar savu viedokli.

Pievieno komentāru

Tavs e-pasts netiks publicēts. Obligātie lauki atzīmēti.

vēl no programmatūrasaistītie