[עמוד ראשי]   [נושא קודם]
טיפוסים וערכים


טיפוסי המידע הנתמכים בשפת תכנות הם אולי ההיבט החזותי המהותי / בסיסי ביותר של השפה.
JS מאפשרת לנו לעבוד עם שלושה טיפוסים פרימיטיביים: מספרים, מחרוזות טקסט וערכים בוליאנים.
השפה תומכת אף בשני טיפוסי מידע מורכבים, אובייקטים ומערכים אשר מייצגים אוסף של הטיפוסים הפרימיטיביים.
שלא כמו שפות אחרות, JS אף תומכת בפונקציות כמו בטיפוסי מידע, וזה מאפשר לתוכניות JS לתפעל את עצמן, פשוטו כמשמעו.
1. מספרים
מספרים הם טיפוסי המידע הבסיסיים ביותר שיש, הם דורשים מעט מאוד הסבר.
JS שונה משפות תכנות כמו C ו-JAVA בכך שאינה מבחינה בין ערכי int ו- float (מספרים שלמים ומספרים עשרוניים), כל המספרים מיוצגים כמספרים בעלי ערך נקודה צפה.
JS משתמשת בסטנדרט 8 – byte IEEE בפורמט הנומרי של float,
והכוונה לכך שניתן לייצג מספר בטווח שבין 308^10* 1.7976931348623157±
כאשר מספר מופיע בתוכנית באופן ישיר, אנו קוראים לו ליטרל (מילולי) נומרי.
JS תומכת במספרים נומריים בפורמטים שונים, כמו מספרים שלמים (integers) על בסיס 10, מספרים אוקטליים על בסיס 8 והקסהדצימליים על בסיס 16, מספרים בעלי נקודה צפה וכו'.

תוכניות JS עובדות עם מספרים בעזרת אופרטורים אריתמטיים שהשפה מספקת אשר כוללים, לדוגמא: + חיבור, - חיסור, * כפל ו- / חילוק.
פירוט נוסף ימצא בפרק 4.
בנוסף לאופרטורים אריתמטיים בסיסיים אלו, JS תומכת באופרטורים מתמטיים מורכבים יותר, דרך מספר רב של פונקציות מתמטיות שמהוות את "לב" השפה.
לנוחיות, פונקציות אלו מאוחסנות כתכונות באובייקט מתמטי אחד הנקרא Math, ונשתמש בו על מנת להשתמש בפונקציות אלו.
לדוגמא פונקציה לחישוב סינוס :
sin_of_x = Math.sin(x);
ולחשב את השורש של ביטוי נומרי :
hypot = Math.sqrt(x*x + y*y);
עבודה עם מספרים
פירוט על האובייקט Math ותכונותיו קיים בפרק על אובייקטים.
ישנה מתודה נוספת שניתנת לשימוש עם מספרים.
המתודה ( )toString הופכת מספרים למחרוזות.
על מנת להפוך מספר להקסהדצימלי נרשום כך:
var x = 33;
var y = w.toString(16);
על מנת להפעיל את המתודה על מספר, חובה להשתמש בסוגריים, על מנת למנוע מהנקודה להיות מפורשת כנקודה דצימלית:
var y = (257).toString(16); 
ערכים נומריים מיוחדים
JS משתמשת במספר ערכים נומריים מיוחדים.
לדוגמא, כאשר ערך של מספר בעל נקודה צפה, הופך לגדול יותר מהייצוג הגדול ביותר האפשרי, התוצאה היא מספר אין סופי, אשר JS מציגה כ- Infinity.
בדומה לגבי מספרים שליליים Infinity -.
ערך נומרי מיוחד נוסף הוא כאשר מתבצעת פעולה מתמטית, כמו חלוקה של 0 ב- 0, אשר מפיקה תוצאה לא מוגדרת או שגיאה.
במקרה כזה, התוצאה הינה ערך של not-a-number, מוצג כ- NaN.
NaN זה הינו בעל "התנהגות" מיוחדת, הוא אינו שווה / זהה לאף מספר כולל עצמו, ומסיבה זו, פונקציה מיוחדת ( )isNaN נדרשת להיקרא עבור ערך זה.
מגרסת JS 1.1, ישנם קבועים מוגדרים (כתכונות של אובייקט ה- Number) עבור כל אחד מערכים נומריים אלו :
משמעות קבוע
הייצוג של המספר הגדול ביותר Number.MAX_VALUE
הייצוג של המספר השלילי ביותר Number.MIN_VALUE
ערך מיוחד של "לא מספר" Number.Nan
ערך מיוחד על מנת לייצג אינסוף Number.POSITIVE_INFINITY
ערך מיוחד על מנת לייצג אינסוף שלילי Number.NEGATIVE_INFINITY
2. מחרוזות
מחרוזת הינה צירוף / רצף של תווים, מספרים, תווי פיסוק וכו'…
זהו הטיפוס שבעזרתו מיוצג טקסט ב- JS.
ב- JS אין טיפוס char כמו בשפות אחרות, על מנת לייצג תו אחד, משתמשים במחרוזת באורך 1.
מחרוזות נכתבות בין זוג גרשים / גרשיים.
מחרוזות מילוליות
מחרוזת היא צירוף של 0 או יותר תווים מצורפים לתוך זוג גרשים / גרשיים (" או ') דוגמאות:
'testing'
"3.14"
name="myForm"
"Would you like to go to lunch ?"
מכיוון שמשתמשים ב- JS על מנת להציג פלט בדפי רשת, נשתמש רבות במחרוזות מילוליות.
דבר אחד שכדאי להימנע ממנו הוא שימוש רב בגרשיים כפולים.
קוד JS לפעמים משובץ במחרוזות HTML ובנוסף, קוד JS לעיתים קרובות משובץ בתוך מחרוזות HTML, עבור אירועים מיוחדים, לכן, זהו רעיון טוב להשתמש בגרשים בודדים במחרוזות JS.
לדוגמא, המחרוזת “Thank you" היא מחרוזת בתוך גרשים בודדים בתוך ביטוי JS בגרשיים כפולים, שהוא בתוך אירוע HTML :
<a href ="" onClick ="alert('Thank you')"> Click Me  </a>
הימנעות מרצף / סדרה של מחרוזות
כאשר משתמשים בגרשיים בודדים על מנת להבדיל בין מחרוזות, חייבים להיות זהירים עם קיצורי השפה האנגלית ויחסים לדוגמא “can't”. משום שהגרש הוא זהה בשני המקרים, חייבים להשתמש בתו ( \ ) – backslash כדי להימנע מבעיות.
( '\ ) – מייצג את הגרש הבודד.
ל- ( \ ) ישנה מטרה מיוחדת במחרוזות JS.
כאשר הוא מצורף לתו שאחריו, ומייצג תו שאינו חלק מן המחרוזת כמו בשפות האחרות, הוא בעל משמעות מיוחדת. לדוגמא :
התו המיוצג ביטוי
Backspace \b
Form feed \f
Nealine \n
Carriage return \r
Tab \t
Apostrophe or single \'
Double quate \"
Backslash \\
עבודה עם מחרוזות
אחד ממאפייני JS הוא היכולת לשרשר מחרוזות.
אם משתמשים באופרטור + עם מספרים, מתבצע חיבור, אך כאשר נשתמש בו לגבי מחרוזות, ישנו צירוף של המחרוזת השניה לראשונה בסיומה, לדוגמא:
msg = "Hello " + "world"; 
greeting = "Welcome to my home page , " + " "+ name;
על מנת לקבוע את אורך המחרוזת (את מספר התווים שהיא מכילה), משתמשים בתכונת ה- length, דוגמא: s.length
ישנן מספר מתודות שניתן להפעילן על מחרוזות:
קבלת התו האחרון במחרוזת
last_char = s.charAt(s.length – 1);
קבלת תת מחרוזת (נניח המקומות 2,3,4 במחרוזת מסויימת)
sub = s.substring(1,4);           
מציאת האינדקס במחרוזת בו האות הראשונה היא a
i = s.indexOf("a");
מחרוזות הן כמו מערכים, בעלי אינדקסים, כאשר האינדקס הראשון במחרוזת הוא 0. מחרוזות הן אינן אובייקטים, הן טיפוסים נפרדים ב- JS. הן משתמשות בתחביר של אובייקט על מנת לגשת לתכונותיהן ולמתודות אך אינן אובייקטים.
3. ערכים בוליאניים
ערכו של טיפוס מידע בוליאני הוא בעל שתי אפשרויות אמת / שקר (true / false).
ערכים בוליאנים הם בדרך כלל תוצאה של השוואה שמתבצעת בתוכניות לדוגמא a = = 4. קוד זה בודק אם הערך של המשתנה a שווה למספר 4. אם אכן כך, תוצאת ההשוואה הינה אמת (true) ואם לאו, התוצאה היא שקר (false).
בדרך כלל נשתמש בערכים אלו בביטויי if / else, נבצע פעולה מסויימת במידה והערך הוא אמת או פעולה אחרת כאשר הערך הוא שקר, לדוגמא:
if (a == 4)
 b = b+1;
else
 a = a+1;
קוד זה בודק אם ערכו של a = 4, אם כן, נוסיף 1 ל- b, אחרת, נוסיף 1 ל- a.
ערך “true” יכול להחשב גם כ- “on” או "1" או “yes” בזמן ש- “false” יחשב כ- “off” או "0" או “no” בהתאמה.
4. פונקציות
פונקציה היא חלק מקוד JS אשר מוגדרת פעם אחת בתוכנית וניתנת לביצוע או להפעלה פעמים רבות במהלך התוכנית. פונקצית JS יכולה להעביר ארגומנטים / פרמטרים, המתארים / מפרטים את ערכם, פונקציה אף יכולה להחזיר ערכים. הגדרת פונקציה, לדוגמא:
function square (x)
{
  return x*x;
}
השורות הבאות הן הפעלות / קריאות לפונקציות:
move();
y = sin(x);
y = square(x);
compute_distance(x1,y1,z1,x2,y2,z2);
בשפות רבות, כולל java פונקציות הן מאפיינים תחביריים של השפה, הן יכולות להיות מוגדרות וניתן להפעילן, אך אינן משמשות כטיפוסי מידע.
סממן בלתי רגיל ב- JS הוא שפונקציות הינן ערכי מידע מדרגה ראשונה. עובדה זו נותנת גמישות רבה לשפה. פונקציות יכולות להיות מאוחסנות במשתנים, מערכים, אובייקטים ויכולות להיות מועברות כארגומנטים לפונקציות אחרות. לעיתים קרובות נשתמש בכך (פירוט בפרק 6).
בהיותן טיפוסי מידע, פונקציות יכולות להיות מוקצות עבור אובייקטים בתור תכונות.
בצד "הלקוח", ישנן מתודות מיוחדות של אובייקטים מסויימים, אשר נקראות בצורה אוטומטית על ידי דפדפן הרשת, כאשר המשתמש מתקשר עם הדפדפן (הקלקה על העכבר למשל).
מתודות מיוחדות אלה נקראות event-handlers (פירוט בפרק אובייקטים).
מגירסה 1.1 ומעלה, פונקציה ניתנת להגדרה גם על ידי ארגומנטים ואת גוף הפונקציה בתוך הבנאי של Function, לדוגמא:
var square = new Function("x", "return x*x;");
כאשר פונקציה מוגדרת בצורה זו היא לפעמים נקראת פונקציה אנונימית משום שאין לה שם.
המשתנה square מחזיק במצביע לאובייקט הפונקציה אך הוא אינו שם הפונקציה.
כאשר הבנאי של Function הוא יעיל בדרך כלל, הוא בעל חסרון אחד, כל גוף הפונקציה צריך להימצא בתוך מחרוזת אשר הופך בדרך זו הגדרת פונקציה בעלת גוף ארוך למגושמת.
ניתן גם להגדיר פונקציה כך (במקום הדוגמא שראינו בתחילת הנושא) :
var square = function(x) { return x*x; }
פונקציות המוגדרות בדרך זו נקראות “lambda”, מתוך הערכה לשפת התכנות LISP אשר היתה אחת מהשפות הראשונות שאפשרה שימוש בפונקציות ללא שם. בהמשך נראה כי בסקריפטים מתקדמים, פונקציות אלו הן די נוחות ויעילות לשימוש .
5. אובייקטים
אובייקט הוא אוסף של פיסות מידע. ערכי מידע אלו מהווים תכונות של האובייקט (לפעמים נקראים “fields” – שדות, אך שימוש זה יכול להיות מבלבל).
על מנת להתייחס לתכונה של אובייקט, נתייחס לאובייקט עצמו, אחריו התו נקודה ואחר כך שם התכונה.
לדוגמא, אובייקט בשם image בעל תכונה בשם width :
image.width;                                             
תכונות של אובייקטים דומות למשתנים, יכולות להכיל כל סוג של מידע, כולל מערכים, פונקציות ואובייקטים אחרים. דוגמא:
document.myForm.button;            
נתייחס לתכונת הכפתור (button) של אובייקט אשר עצמו מאוחסן בתכונת ה- form, my form של אובייקט בשם document. כאשר ערך של פונקציה מאוחסן כתכונה של אובייקט, פונקציה זו בדרך כלל נקראת מתודה ושם התכונה הופכת להיות שם המתודה. על מנת לקרא למתודה של אובייקט נשתמש בתחביר כדוגמת זה:
document.write("Hi");
אובייקטים ב- JS הינם בעלי יכולות לשרת כמערכים אסוציאטיביים, הם יכולים להכיל ערכי מידע שרירותיים בעלי מחרוזות שרירותיות. כאשר נשתמש באובייקט בצורה זו, בדרך כלל תחביר שונה נדרש על מנת לגשת לתכונות האובייקט. מחרוזת,המכילה את שם התכונה המבוקשת מצורפת לתוך סוגריים מרובעים, לדוגמא :
image["width"];
image["height"];
מערכים אסוציאטיביים הם טיפוסי מידע רבי עוצמה, הם יעילים למספר טכניקות תכנות.
6. מערכים
מערך הינו אוסף של ערכי מידע כשם שאובייקט הינו כזה.
בזמן שכל ערך מידעי של אובייקט הוא בעל שם, כל ערך מידעי במערך הוא בעל מספר או אינדקס.
ב- JS אנו מקבלים ערך ממערך על ידי כתיבת אינדקס בתוך סוגריים מרובעים לאחר שם המערך, לדוגמא אם מערך שמו arr ו- i הוא מספר שלם לא שלילי אז [arr[i הוא אלמנט של המערך.
אינדקסים של מערך מתחילים מ - 0 כך [arr[2 מתייחס לאיבר השלישי במערך.
מערכים יכולים להכיל כל טיפוס של מידע, כולל מצביעים למערכים אחרים או לאובייקטים או פונקציות, לדוגמא:
document.images[1].width;
קוד זה מתייחס לתכונת הרוחב (width) של אובייקט המאוחסן במקום השני במערך, שהינו תכונת ה- image של אובייקט ה- document.


נשים לב, כי המערכים המתוארים כאן שונים מהמערכים האסוציאטיביים שתיארנו בסעיף הקודם. האינדקסים של מערכים אלו הם בעלי ערכים שלמים לא שליליים. האינדקסים של מערכים אסוציאטיביים הם בעלי ערכי מחרוזות.
JS אינה תומכת במערכים רב מימדיים מלבד מערכים של מערכים. איברי המערך אינם חייבים להיות בעלי אותו הטיפוס, כמו בשפות אחרות כמו java.
7. Null
זהו ערך מיוחד המעיד על כך ש"אין ערך". כאשר משתנה הוא בעל ערך שהוא null, אנו יודעים שאינו מכיל אובייקט, מערך, מספר, מחרוזת, או משתנה בוליאני בעל תוקף. Null אינו אפס, לפעמים הוא מומר לאפס, אך אינם שווים.
8. Undefined – לא מוגדר
כאשר נשתמש במשתנה שאינו קיים נקבל ערך “undefined”, משתנה שהצהרנו עליו, אך מעולם לא אותחל בערך, או תכונה של אובייקט שאינה קיימת. אין מילת מפתח undefined, ולכן זה הופך זאת קשה לגלות / להבחין בערך זה. הוא אינו כמו null, אך ברב המקרים, נוכל להתייחס אליו כאילו היה null, משום שהם שווים , דוגמא:
my.prop == null; 
השוואה זו היא נכונה אפילו אם תכונת my.prop אינה קיימת או קיימת ומכילה את הערך null.
מגרסה 1.1 ומעלה, ניתן להבחין ביניהם באמצעות האופרטור typeof, אופרטור זה מחזיר מחרוזת אשר מציינת את הטיפוס עבור כל ערך.