ES2020 – מספרים גדולים בג'אווהסקריפט

סוג מידע פרימיטיבי חדש שמאפשר לכתוב מספרים גדולים במיוחד בג'אווהסקריפט

אחד הבשורות הגדולות שתקן ES2020 מביא עמו הוא BigInt אמיתי בג'אווהסקריפט שמאפשר, סוף סוף, עבודה תקינה עם מספרים גדולים.

בג'אווהסקריפט עד כה, סוג המספר היחידי שהיה לנו הוא Number והמספר המקסימלי האפשרי היה 9007199254740992. אי אפשר לעלות מעל זה. לא מאמינים? הריצו את הקוד הבא ותראו:

let myNumber = 9007199254740992;
myNumber++;
console.log('myNumber', myNumber); //9007199254740992

גישה לקבוע המספרי הזה היינו מקבלים עם Number.MAX_SAFE_INTEGER. למשל:

const max = Number.MAX_SAFE_INTEGER;
console.log(max); //9007199254740991

אחד פחות מ-9007199254740992 – כי עם 9007199254740991 עדיין אפשר לעשות את כל הפעולות הנומריות כולל להעלות.

זה לא עורר בעיות בימי הג'אווהסקריפט המוקדמים הראשונים, אבל ככל שהחלנו להטמיע את ג'אווהסקריפט במקומות שונים והיא החלה למלא משימות מורכבות, זה החל להיות סופר בעייתי. היה אפשר לעבוד עם מספרים גדולים בג'אווהסקריפט אבל היינו צריכים להשתמש בכל מיני ספריות והאקים שונים ומשונים. תקן ES2020 החדש מאפשר לנו לעבוד עם סוג מידע חדש בשם BigInt ומספרים גדולים יותר. העבודה עם BigInt קלה למדי:

let myNumber = BigInt(9007199254740992);
myNumber++;
console.log('myNumber', myNumber.toString()); //9007199254740993

או לחלופין, הצמדת האות "n" למספר הופכת אותו אוטומטית ל-BigInt.

let myNumber = 9007199254740992n;
myNumber++;
console.log('myNumber', myNumber.toString()); //9007199254740993
console.log(typeof myNumber); //bigint

חשוב להדגיש שמדובר בסוג מידע פרימיטיבי שונה לחלוטין, אם תנסו להשוות 42 ל-42n, יצא לכם false (ושוב תודה למגיבים שתקנו אותי). בדיוק כפי שיקרה אם תנסו להשוות מחרוזת טקסט למספר. רוצים לבצע השוואה? חייבים להמיר את הסוג. או את המספר ל-BigInt, או את ה-BigInt למספר:

console.log(42 == 42n); //true
console.log(42 === 42n); //false
console.log(42 === Number(42n)); //true
console.log(BigInt(42) === 42n); //true

אפשר לעשות פעולות אריתמטיות ב-BigInt וכל מה שרוצים. אם רוצים להוסיף מחרוזת טקסט או מספר – קודם להמיר כמובן. מבחינת שברים – אין לנו שברים ב-BigInt ואם יש – הם מעוגלים כלפי מטה (ותודה למגיבים שתקנו אותי).

const rounded = 5n / 2n;
console.log('rounded', rounded.toString()); //2

בת'כלס – שימושי מאוד כאשר מבצעים חישובי זמן מסובכים שמצריכים שימוש במספרים גדולים או כל חישוב אחר. אם אתם פתאום רואים n מסתורי בקוד כלשהו – עכשיו תדעו מהיכן זה מגיע. הקוד הזה זמין בפיירפוקס ובכרום. משתמשים באדג'? ובכן… אתם עדיין בימי הביניים 🙂

פוסטים נוספים שכדאי לקרוא

פייתון

קבצי קונפיגורציה בפואטרי

הגדרות שמשנות את ההתנהגות של פואטרי באמצעות קבצי הגדרות גלובליים, לוקליים ואפילו משתני סביבה.

מיקרו בקרים

הפעלת מסך oled קטנטן עם esp32

יצירת מערכת מולטימדיה שלמה בגודל של בול דואר עם מיקרובקר ובעלות של דולרים בודדים. וגם על הדרך נלמד על ת׳רדים

פתרונות ומאמרים על פיתוח אינטרנט

יישום של nonce על מנת להגן מפני התקפות injection

בפוסט הקודם הסברתי על hash עם CSP על משאבי inline – שזה נחמד ומעולה אבל פחות ישים בעולם האמיתי שבו בדרך כלל התוכן ה-inline (בין

ESP32 מאפס לילדים

מדריך ל-ESP32 לילדים ולהורים מאפס

אחד הדברים הכי כיפיים בעולם הוא תכנות ותכנות בעולם האמיתי – המפעיל אורות, ציוד אלקטרוני ומכשירים הוא מלהיב ממש. המדריך מיועד להורים שרוצים ללמד את הילדים שלהם לתכנת.

גלילה לראש העמוד