تغییرات مهم V8 از Node.js 26 تا 27
خلاصهٔ کاملتر
Joyee Cheung تو وبلاگ Node.js توضیح داده که آپدیت V8 از نسخهٔ 14.6 به 15.6 تو آلفای Node.js 27 چه چیزهایی رو عوض میکنه. به گفتهٔ نویسنده، با برنامهٔ انتشار جدید Node.js، تغییرات شکستنی V8 فقط تو فاز Alpha و Current میان. هر تغییری که ABI افزونههای native (یعنی رابط باینری ماژولهای C++) رو بشکنه، با بالا رفتن NODE_MODULE_VERSION همراهه. وقتی نسخهٔ 27 به LTS برسه، V8 دیگه ثابت میمونه.
چند قابلیت جدید بدون فلگ فعال شدن. Math.sumPrecise() اعداد رو جمع میکنه بدون اینکه خطای اعشاری روی هم جمع بشه؛ مثلاً جمع 0.1 و 0.2 و 0.3 با حلقه میشه 0.6000000000000001، ولی با این متد دقیقاً 0.6 درمیاد. getter جدید Intl.Locale.prototype.variants هم اضافه شده و iteratorها متدهای join، includes، Iterator.zip و Iterator.zipKeyed گرفتن. چند قابلیت آزمایشی هم پشت فلگ هستن، مثل import defer و Immutable ArrayBuffer.
بخش مهمتر، تغییر رفتارهاست. V8 حالا برای بعضی متدهای Math از libm مربوط به LLVM استفاده میکنه، پس نتیجه ممکنه تو رقم آخر فرق کنه. یعنی تستی که خروجی اعشاری رو با یه عدد ثابت از نسخهٔ قبلی مقایسه میکنه، ممکنه fail بشه. Math.random() هم دیگه کش نداره و مستقیم از xorshift128+ استفاده میکنه، برای همین دنبالهٔ اعداد برای یه --random-seed ثابت عوض شده.
Date.prototype.getTimezoneOffset() دیگه به دقیقهٔ کامل گرد نمیشه. برای تاریخهای خیلی قدیمی که منطقهٔ زمانیشون اختلاف غیرصحیح داشته، مقدار اعشاری برمیگردونه؛ مثلاً برای سال 1675 تو لسآنجلس به جای 472، عدد 472.966… میده. Array.prototype.sort() هم برای آرایههای بزرگ از PowerSort به جای TimSort استفاده میکنه. هنوز stable هست و با comparator درست نتیجه همونه، ولی تعداد صدا زدن comparator فرق میکنه.
چند تغییر ریزتر هم هست. getter مربوط به error.stack دیگه stack رو از زنجیرهٔ prototype پیدا نمیکنه؛ پس آبجکتی که فقط prototypeش یه Error باشه، stack نداره. Promise.try اگه callback یه Promise از همون realm برگردونه، همون رو مستقیم برمیگردونه. صدا زدن Atomics.wait() روی workerای که خودش قفل شده هم به جای کرش کردن پروسه، TypeError میده.
نکات کلیدی:
- V8 تو Node.js 27 از 14.6 به 15.6 رسیده
- Math.sumPrecise و متدهای Iterator.zip و Iterator.prototype.join بدون فلگ فعالن
- متدهای Math با libm مربوط به LLVM ممکنه تو بیت آخر فرق کنن
- دنبالهٔ Math.random() برای یه --random-seed ثابت عوض شده
- Array.prototype.sort() برای آرایههای بزرگ از PowerSort استفاده میکنه
- getTimezoneOffset() برای تاریخهای تاریخی ممکنه عدد اعشاری برگردونه




