מספרים

ערך של מספר מורכב מסדרה של תווים מספריים, לדוגמה:

5

סוג נתוני המספרים כולל גם כמה מאפיינים גלובליים מיוחדים שמייצגים מושגים מספריים, כמו Infinity ו-NaN – ערך שמשמעותו 'לא מספר', שהוא תוצאה אפשרית של ניסיון לבצע חישובים מתמטיים על ערכים שאינם מספרים.

האובייקט number

כשערך מועבר לפונקציה Number(), הערך מומר לשווה ערך למספר. לדוגמה, מחרוזת מספרית יוצרת פרימיטיבי של מספר מקביל:

Number( "10" );
> 10

העברת הערך של false או null אל Number() מחזירה 0, ו-true מחזירה 1.

Number( null );
> 0

Number( false );
> 0

Number( true );
> 1`

אם אי אפשר להמיר ערך, כמו במקרה של undefined או מחרוזת שמכילה תווים לא מספריים, הפונקציה Number מחזירה NaN:

Number( undefined );
> NaN

Number( "The number 3." );
> NaN

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

let numObject = new Number( 15 );

numObject;
> Number { 15 }

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

let tenObject = new Number( 10 );

tenObject + 5;
> 15

tenObject === 10;
> false

צפים ומספרים שלמים

ל-JavaScript יש רק סוג מספר אחד: מספרי נקודות צפים עם דיוק כפול של IEEE 754-1985 של 64 ביט בין -2^1024 ל-2^1024. לפני ש-JavaScript מאחסן מספר כלשהו בזיכרון, הוא ממיר אותו למספר נקודה צפה (floating) בינארית, שנקרא גם float.

האחסון בנפח 64 ביט (ביט אחד חיובי או שלילי עם "סימן" אחד, 11 ביט למעריך ו-52 ביט לשבר) עלול לגרום לשגיאות דיוק בכל מספר של ספרות שלא מתאים לטווח המותר. ההגבלה הזו נובעת מסוג נתוני המספרים ב-JavaScript.

0.1 + 0.7
> 0.7999999999999999

במקום זאת, אפשר לשמור ערך של מספר כמספר שלם – מספר נקודה צפה (floating-point) ללא שבר בין -(2^53 − 1) ל-2^53 − 1. מכיוון שמספרים צפים ומספרים שלמים מאוחסנים באותו אופן, אין הבדל מעשי באופן שבו המספרים האלה פועלים. עם זאת, מומלץ להשתמש במספרים שלמים כשאפשר, כדי למנוע שגיאות דיוק.

אופרטורים של מספרים

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

מפעיל שם תיאור Usage תוצאה
+ תוספת 2+2 4
- הפחתה 4-2 2
* הכפלה 2*5 10
/ חטיבה 10/5 2
++ תוספת הוספה של אחד למספר 2++ 3
-- הפחת מחסירה אחד ממספר 3-- 2
** Exponent מחזירה את התוצאה של העלאת האופרנד הראשון של
בחזקה של האופרנד השני.
2**4 16
% יתרה מחזירה את השארית שנותרה כאשר האופרנד הראשון
מחולק באופרנד השני.
12%5 2

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

מפעיל שם Usage
+= הקצאת הוספה myValue += 2
-= הקצאת חיסור myValue -= 2
*= הקצאת כפל myValue *= 2
/= הקצאת חטיבה myValue /= 2
**= הקצאת מעריך myValue **= 2
%= הקצאת שאריות myValue %= 2

ערכים סימבוליים

המספר הרגיל חל גם על כמה מקרים מיוחדים: הערך "not a number" (NaN) וערך שמייצג אינסוף שיכול להיות חיובי (Infinity) או שלילי (-Infinity).

יכול להיות שתדירות השימוש ב-Infinity תהיה נמוכה בגלל חלוקה באפס. מצב שבו רוב שפות התכנות גורמות לשגיאה במקום זאת:

10 / 0
> Infinity

חשוב לזכור ש-JavaScript הוא תלוי אותיות רישיות. Infinity הוא סוג נתוני מספר שמייצג את מושג האינסוף, אבל ל-infinity אין משמעות מיוחדת:

Infinity
> Infinity

infinity
> Uncaught ReferenceError: infinity is not defined

NaN (כלומר Not a Number) מופיע בתדירות גבוהה יותר, במקרים שבהם אי אפשר לבטא את התוצאה של פעולה אריתמטית כמספר. לדוגמה, מכיוון ש-JavaScript מנסה להסיק את סוג הנתונים מערך והקשר, אפשר להשתמש בליטרל מחרוזת שמכיל רק מספר בפעולה מתמטית:

"2" * 2;
> 4

אבל, אם לא ניתן לנתח את המחרוזת הזו כערך של מספר, הפעולה המתמטית תסתיים ללא מספר:

"two" * 2;
> NaN

NaN מוחזר בכל מקרה שבו ערך לא חוקי מיוצג כמספר בפעולה מתמטית. דוגמאות:

  • המרות מספר שנכשלו (למשל, parseInt( undefined ) )
  • פעולות חשבון כאשר התוצאה אינה מספר ממשי (לדוגמה, 0 / 0, Math.sqrt( -10 ))
  • פעולת אריתמטית עם תוצאה לא-מוגדרת (0 * Infinity)
  • פעולה אריתמטית שכוללת NaN מפורש (NaN + 2) או תוצאה של NaN (2 * "string" / 2)

בדיקת ההבנה

מהי התוצאה של העברת false אל Number()?

0
לא נכון
NaN
1

מהי התוצאה של הפעולה המתמטית הבאה?

"Six" * 3

NaN
2
18
נכון
0