חידון: האם אפשר לספור על JavaScript?
מכיר את parseInt לעומת parseFloat?
0.1 + 0.2 === 0.3בגלל שגיאות דיוק של נקודה צפה, 0.1 + 0.2 לא שווה בדיוק ל-0.3. בשל האופן שבו מספרי נקודה צפה מאוחסנים בזיכרון, התוצאה היא 0.30000000000000004. תקן IEEE 754 לטיפול בחשבון נקודה צפה הוא האשם – הוא לא יכול לייצג חלק מהמספרים בדיוק מוחלט. זו בעיה נפוצה בכל שפות התכנות. בסופו של דבר תתקלו בשבר עשרוני אינסופי, והמחשב פשוט חייב להפסיק לרדוף אחרי ספרות אינסופיות.
שפות כמו Python ו-Java כוללות Decimal או BigDecimal לטיפול בזה, אבל זה לא מובנה ב-JavaScript. אפשר להשתמש בספריות כמו big.js או decimal.js כדי לטפל במקרים כאלה.
(הערה: שפות מסוימות מתוכננות לטפל בשברים, מספרים מדומים וכו’ ברמה לוגית גבוהה יותר, תוך שמירה על ביטויים מילוליים. אבל הן עדיין צריכות להתמודד עם אותן בעיות דיוק של נקודה צפה ברמת החומרה.)
Number.MAX_VALUE * 2מכיוון ש-Number.MAX_VALUE הוא המספר הרגיל הגדול ביותר שניתן לייצוג ב-JavaScript, חריגה מהגבול שלו תגרום לגלישה מהירה - בעצם אתה עלול לראות תוצאות חסרות משמעות. הכפלתו ב-2 מביאה ל-Infinity.
אתה יודע, JavaScript ככה לפעמים.
parseInt("42") === parseFloat("42")ב-JavaScript, גם parseInt וגם parseFloat מפרשים את המחרוזת "42" כמספר 42. לכן, ההשוואה parseInt("42") === parseFloat("42") מעריכה ל-true. בעוד ש-parseInt מפסיק לנתח בתו הראשון שאינו ספרה, parseFloat ממשיך לנתח עד שהוא נתקל בתו שאינו חלק ממספר נקודה צפה. עם זאת, מכיוון שאין נקודות עשרוניות או תווים לא-מספריים אחרים ב-"42", שתי הפונקציות מחזירות את אותו הערך.
[24, 'One', 42].map(parseInt)הארגומנט השני של parseInt (ה-radix) מתיישר עם ארגומנט ה-index של מתודות המערך. זה מוביל לתוצאות בלתי צפויות, מכיוון ש-parseInt("One", 1) מחזיר NaN עקב קלט לא תקין.
האלמנט הראשון, 24, מפורש כ-24 בבסיס 0 (זיהוי אוטומטי), כך שהוא נשאר 24. האלמנט השני, 'One', מפורש כ-NaN בבסיס 1. האלמנט השלישי, 42, מפורש בבסיס 2. בבסיס 2, '42' הוא NaN, ולכן התוצאה היא [24, NaN, NaN].
זוהי מלכודת נפוצה עם parseInt ו-map. אם ברצונך לפרש מערך של מחרוזות למספרים, השיטה הבטוחה היחידה “המובנית” היא .map(Number) או הוספת callback/closure .map(x => parseInt(x, 10)).
טבלת השוואה
| פונקציה | parseInt | parseFloat | Number | BigInt |
|---|---|---|---|---|
| מתעלם מרווחים | ✅ | ✅ | ✅ | ✅ |
.map(FN) | ❌ | ☑️ | ✅ | ✅ |
| תומך בארגומנט בסיס | ✅ | ❌ | ❌ | ❌ |
| ליטרלים בינאריים/אוקטליים/הקסדצימליים | ✅ | ❌ | ✅ | ✅ |
תווים לא חוקיים 42 oh no | 42 | 42 | NaN | SyntaxError |
איך הצלחת? 🧐
מחפש מנוחה אחרי כל כך הרבה בינארי?
פחח, זכור: הפסקה אחרי כישורים!
לחץ על החדר כושר שלי כדי לרסק עוד אתגרים! 💪