- ในการประชุม TC39 ครั้งที่ 108 ล่าสุด มี ข้อเสนอ 9 รายการ ที่จะขับเคลื่อนอนาคตของ JavaScript ซึ่งมีความคืบหน้าในแต่ละขั้นของการกำหนดมาตรฐาน
- ใน Stage 4 (อนุมัติขั้นสุดท้าย) มีฟีเจอร์อย่าง
using, Array.fromAsync, Error.isError ที่ช่วยเพิ่มทั้งประสิทธิภาพการพัฒนาและความปลอดภัย
- ใน Stage 3~1 กำลังมีการหารือข้อเสนอฟีเจอร์ที่มีประโยชน์หลากหลาย เช่น immutable ArrayBuffer, seeded random, clamp, การปรับปรุง NumberFormat และฟังก์ชัน Random
- Deno มีบทบาทเชิงรุกในการนำมาตรฐานล่าสุดมาใช้และทดลอง และบางฟีเจอร์ก็ใช้งานได้แล้วใน Deno และเบราว์เซอร์รุ่นใหม่
- การหารือด้านมาตรฐานจะยังดำเนินต่อไป และคาดว่า ecosystem ของ JavaScript จะพัฒนาไปในทิศทางที่ปลอดภัยและกระชับมากยิ่งขึ้น
แนวโน้มการกำหนดมาตรฐานล่าสุดของ TC39 และฟีเจอร์สำคัญใหม่ของ JavaScript
Stage 4: ฟีเจอร์ที่เตรียมถูกรับรองอย่างเป็นทางการ
การจัดการทรัพยากรแบบชัดเจน (using)
- คำสั่ง
using ช่วยรับประกันว่าระบบจะจัดการล้างทรัพยากรโดยอัตโนมัติเมื่ออ็อบเจ็กต์ทรัพยากร เช่น ไฟล์หรือ network socket หมดอายุการใช้งาน
- โครงสร้างนี้ได้แรงบันดาลใจจาก C# และ Python โดยให้อ็อบเจ็กต์ implement เมธอด
[Symbol.dispose]() หรือ [Symbol.asyncDispose]() เพื่อให้ถูกเรียกเมื่อจบบล็อก
- แม้เกิดข้อยกเว้นก็ยังมีการล้างอัตโนมัติ ช่วยลดความเสี่ยงของ resource leak เช่น file handle
- รองรับแล้วใน Chrome 134, Firefox 134, Deno v2.3 เป็นต้น และใน Deno สามารถนำไปใช้กับไฟล์หรือ socket ในงานจริงได้ทันที
Array.fromAsync
- เป็นเมธอดมาตรฐานที่ใช้ แปลง asynchronous iterable ให้เป็น array และคืนค่าเป็น Promise
- สามารถรวบรวมค่าจาก async generator แบบลำดับต่อเนื่อง และได้ผลลัพธ์สุดท้ายเป็น array ผ่าน Promise
- รูปแบบการใช้งานคล้ายกับ
Array.from แบบ synchronous เดิม และรองรับ mapping function กับ thisArg
- รองรับแล้วในเบราว์เซอร์หลักทั้งหมด, Node v22 และ Deno v1.38 ขึ้นไป
Error.isError
- เป็นฟังก์ชัน built-in ที่ช่วยตรวจสอบได้ง่ายว่าค่าหนึ่งเป็น อ็อบเจ็กต์ Error จริง หรือไม่
- ทำงานได้อย่างเชื่อถือได้แม้ในกรณีซับซ้อน เช่น cross-realm หรือ error subclass
- ช่วยเพิ่มความน่าเชื่อถือในการพัฒนา polyfill และไลบรารี
Stage 3: ArrayBuffer แบบ immutable
Immutable ArrayBuffer
- มีแผนจะเพิ่มเมธอด
transferToImmutable(), sliceToImmutable() เพื่อรองรับการทำ ArrayBuffer ให้เป็น immutable
- buffer แบบ immutable เมื่อสร้างแล้วจะไม่สามารถแก้ไขหรือแยกออกได้ ช่วยให้แชร์ข้าม thread และ worker ได้อย่างปลอดภัยและเพิ่มประสิทธิภาพ
- ใน Deno และสภาพแวดล้อมอื่น ๆ สามารถนำไปใช้ประมวลผลข้อมูลไบนารีได้อย่างมีประสิทธิภาพโดยไม่ต้องคัดลอกโดยไม่จำเป็น
Stage 2: ฟีเจอร์ข้อเสนอใหม่
Random.Seeded
- เป็น PRNG แบบอิง seed (
Random.Seeded(seed)) ที่สามารถสร้างลำดับเลขสุ่มเดิมซ้ำได้ระหว่างการรันแต่ละครั้ง
- มีประโยชน์ในงานที่ต้องการ reproducibility เช่น เกมและการจำลองสถานการณ์
- ต่างจาก
Math.random() เดิม โดยรองรับความสามารถขั้นสูง เช่น การกำหนด seed และการคัดลอกสถานะ
Number.prototype.clamp
- เป็น เมธอดจำกัดช่วงตัวเลข ที่ปรับค่าให้อยู่ภายในช่วงต่ำสุดถึงสูงสุดที่กำหนดโดยอัตโนมัติ
- ใช้แทนรูปแบบ
Math.min(Math.max(x, min), max) เดิมได้อย่างสั้นและชัดเจนกว่า
Stage 1: ข้อเสนอที่อยู่ในช่วงหารือเริ่มต้น
Keep Trailing Zeros
- เป็นออปชันใหม่ของ
Intl.NumberFormat ที่ช่วยควบคุมการ คงไว้หรือลบ 0 ท้ายทศนิยม ได้อย่างละเอียด
- ช่วยเพิ่มความยืดหยุ่นในการแสดงผล UI เช่น จำนวนเงินหรือเลขทศนิยมคงที่
Comparisons
- มีเป้าหมายในการทำมาตรฐานสำหรับ การแสดงค่าที่เป็นมิตรต่อมนุษย์ และ การแสดง diff คล้ายกับ
util.inspect ของ Node.js
- ช่วยสร้างความสม่ำเสมอใน test framework, console output และงานลักษณะใกล้เคียงกัน
Random Functions
- เสนอการเพิ่ม namespace
Random ใหม่ เพื่อรวมฟังก์ชันเกี่ยวกับการสุ่ม เช่น random, sampling, shuffle ให้ใช้งานได้อย่างปลอดภัยและกระชับ
- ช่วยป้องกันข้อผิดพลาดแบบ off-by-one และรองรับรูปแบบการเก็บรวบรวมหรือ sampling ที่หลากหลายอย่างเป็นธรรมชาติ
อนาคตของ Deno และ ecosystem ของ JavaScript
- Deno เข้าร่วมการหารือด้านมาตรฐานอย่างแข็งขัน และนำฟีเจอร์ใหม่ล่าสุดมาปรับใช้ในงานจริงอย่างรวดเร็ว
- ตัวอย่างเช่น async context propagation, OpenTelemetry แบบ built-in และรูปแบบการจัดการทรัพยากรใหม่
- คาดว่าจะมีการหารือด้านมาตรฐานต่อเนื่องในการประชุม TC39 ครั้งถัดไปหลังเดือนกันยายน
- นักพัฒนา JavaScript จะได้ใช้งานสภาพแวดล้อมภาษาที่ทรงพลัง ปลอดภัย และสะดวกยิ่งขึ้นในอนาคต
3 ความคิดเห็น
await operations proposal
อันนี้เมื่อไหร่...
การจับคู่แพตเทิร์นน่าจะถูกเพิ่มเข้ามาเมื่อไหร่กันนะ
มี
signalsอยู่ใน stage 1 แต่ดูเหมือนว่ายังอีกไกลกว่าจะเปิดตัวอย่างเป็นทางการ