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 מסתורי בקוד כלשהו – עכשיו תדעו מהיכן זה מגיע. הקוד הזה זמין בפיירפוקס ובכרום. משתמשים באדג'? ובכן… אתם עדיין בימי הביניים 🙂

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

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

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

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

DALL·E 2024-09-06 12.34.24 - A visually engaging post about Python and cryptographic problems. The image should feature a dark-themed background with a glowing, futuristic Python
פתרונות ומאמרים על פיתוח אינטרנט

בעיות במימוש של פונקציות קריפטוגרפיות בפייתון

היום (16 לספטמבר) ממש, אני מעביר הרצאה ב-PyconIL 2024 על בעיות קריפטוגרפיות באפליקציות פייתון. לצערי אי אפשר להכניס את כל הבעיות הקריפטוגרפיות להרצאה אחת או

בינה מלאכותית

להריץ ממשק של open-webui על הרספברי פיי

להפעיל ממשק של צ׳אט ג׳יפיטי שאפשר לגשת אליו מכל מחשב ברשת הביתית על רספברי פיי עם מודל בשם tinydolphin שרץ על רספברי פיי.

רספברי פיי

מה זה AIoT? ואיך אפשר להתחיל?

פוסט עם המון קישורים, מידע, סרטונים ופרק בפודקאסט שיפתח לכם שער לעולם ה-AIoT המרתק.

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