אובייקטי עוטף ב-JavaScript
מאמר זה מסביר על אובייקטי עוטף ב-JavaScript.
YouTube Video
אובייקטים עוטפים
ל-JavaScript יש סוגים פרימיטיביים ואובייקטים לטיפול בהם (אובייקטים עוטפים).
סוגי פרימיטיבים
סוגים פרימיטיביים מייצגים ערך יחיד והם פשוטים וקלים. אלה הם בלתי ניתנים לשינוי (לא ניתנים לשינוי) ואין להם שיטות או תכונות אובייקט ישירות, אך ניתן להמירם באופן זמני לאובייקטי מעטפת לצורך ביצוע פעולות.
string ו-number הם דוגמאות לסוגים פרימיטיביים. מצד שני, אובייקטים עוטפים מתחילים באות גדולה, כמו String ו-Number.
אובייקטי עוטף
כדי לתפעל סוגים פרימיטיביים, JavaScript יוצרת באופן זמני אובייקטי עיטוף (Object wrappers). אובייקטי עיטוף מכילים שיטות ומאפיינים עבור הסוגים הפרימיטיביים.
Number
1let numObject = new Number(42); // Wrapper object
2
3console.log(typeof numObject); // object
4console.log(numObject.valueOf()); // 42
5
6let numValue = Number(42); // Return primitive value
7
8console.log(typeof numValue); // number
9console.log(numValue); // 42
Numberהוא סוג אובייקט שעוטף אתnumberהפרימיטיבי. על ידי יצירה מפורשת של אובייקטNumber, ניתן לטפל במספרים כמו ב-number, אך בדרך כלל מומלץ להשתמש בסוג הפרימיטיביnumber.
typeof numObjectהוא"object", אךtypeof 42הוא"number".
- יש לשים לב כי שימוש באופרטור
newליצירת אובייקט עיטוף חדש מניב תוצאה שונה מקריאה ל-Numberכפונקציה. כאשר נקרא כפונקציה, מוחזר טיפוסnumberפרימיטיבי.
String
1let strObject = new String("Hello"); // Wrapper object
2
3console.log(typeof strObject); // object
4console.log(strObject.valueOf()); // Hello
- זהו סוג אובייקט שעוטף את
stringהפרימיטיבי. בשימוש באובייקטString, ניתן לגשת למאפיינים ושיטות של מחרוזות, אך בדרך כלל משתמשים במחרוזת פרימיטיביתstring.
typeof strObjectהוא"object", אךtypeof "Hello"הוא"string".
- בדומה ל-
Number, קריאה ל-Stringכפונקציה מחזירהstringפרימיטיבי.
Boolean
1let boolObject = new Boolean(true); // Wrapper object
2
3console.log(typeof boolObject); // object
4console.log(boolObject.valueOf()); // true
- זהו סוג אובייקט שעוטף את
booleanהפרימיטיבי. ניתן גם ליצור אובייקטBooleanבאופן מפורש, אך בדרך כלל משתמשים בסוג הפרימיטיביboolean.
typeof boolObjectהוא"object", אךtypeof trueהוא"boolean".
- בדומה ל-
Number, קריאה ל-Booleanכפונקציה מחזירהbooleanפרימיטיבי.
BigInt
1let bigIntObject = Object(9007199254740991n); // Wrapper object
2
3console.log(typeof bigIntObject); // object
4console.log(bigIntObject.valueOf()); // 9007199254740991n
5
6let bigIntValue = BigInt(9007199254740991); // Return primitive BigInt
7
8console.log(typeof bigIntValue); // bigint
9console.log(bigIntValue); // 9007199254740991n
10
11// Error
12let bigIntObject2 = new BigInt(9007199254740991n);Objectを使ってBigIntのラッパーオブジェクトを生成できますが、通常はプリミティブ型のbigintを直接使うのが一般的です。
typeof bigIntObjectは"object"であるのに対し、typeof 9007199254740991nは"bigint"です。
BigIntを関数として呼び出すとプリミティブなbigintを返しますが、new演算子をつけてBigIntのラッパーオブジェクトを生成することはできません。
Symbol
1let symObject = Object(Symbol("id")); // Wrapper object for Symbol
2
3console.log(typeof symObject); // object
4console.log(symObject.valueOf()); //
- אתה יכול להשתמש ב-
Objectכדי ליצור אובייקט עוטף עבורSymbol, אך בדרך כלל משתמשים ישירות בסוג הפרימיטיביSymbol.
הבדלים בין סוגים פרימיטיביים לאובייקטי עיטוף
- סוגים פרימיטיביים הם קלי משקל ויעילים בזיכרון, אך אין להם מאפיינים או שיטות ישירות. עם זאת, ב-JavaScript, גם בסוגים פרימיטיביים נוצרים אוטומטית אובייקטי עיטוף זמניים לפי הצורך כדי לספק שיטות ומאפיינים.
1let text = "Hello";
2
3// A temporary String object is created,
4// allowing access to the length property
5console.log(text.length);- אובייקטי עיטוף הם אובייקטים שנוצרים במפורש ויכולים להשפיע על זיכרון וביצועים, ולכן באופן כללי מומלץ להשתמש בסוגים פרימיטיביים.
סיכום
- סוגים פרימיטיביים: סוגים קלים כמו
number,string,boolean,null,undefinedו־symbolשאין להם מתודות ישירות. - אובייקטי מעטפת: אובייקטים כמו
Number,Stringו־Booleanשמומרים זמנית מסוגים פרימיטיביים.
תוכלו לעקוב אחר המאמר שלמעלה באמצעות Visual Studio Code בערוץ היוטיוב שלנו. נא לבדוק גם את ערוץ היוטיוב.