במאמר זה נעבור על ביטויים, תנאים ומפעילים ב-JS.
נראה מה צורת הכתיבה הנכונה שלהם ומה הם עושים, אחד היתרונות הגדולים שלהם, הוא קיצור שורות הקוד וכך הקוד ברור יותר, נקי יותר ומובן יותר.
number & true/false
ב-JS המילה true שוות ערך ל-1 והמילה false שוות ערך ל-0, לכן אנחנו יכולים לעשות את זה
const a = 1 + true // 2 const b = 1 + false // 1 const c = true + true // 2 const d = false + false // 0
add/sub & equal (+=) או (-=)
בעבר, כדאי לחבר או לחסר לאותו משתנה ערך היינו צריכים לכתוב את המשתנה שווה ועצמו בתוספת הפעולה והמספר, היום זה כבר יותר קצר ואפשר פשוט לרשום את זה כך
let a = 1; // 1 a+=6; // 7 a-=4; // 3 // זה כמו לכתוב ---> let a = 1; a = a + 6; a= a - 4;
ניתן גם לחבר טקסט אבל לא לחסר
let a = 'abc'; a+='def'; // abcdef
ternary (?:)
הרעיון של טרנרי הוא פשוט להחליף את if/else ומבחינה רעיונית כותבים אותו דומה
const a = 0 < 1 ? true : false; // true
const val1 = 10;
const val2 = 20;
const a = val1 != val2 ? 'NO' : 'YES'; // 'YES'
// אפשר גם לשרשר
const a = 5 != 5 ? 'OK' : 5 < 5 ? 'NO' : 5 > 5 ? 'NO!!!' : 'EQUAL'; // 'EQUAL'
// נסדר את השורה למעלה כדאי שיהיה יותר ברור
const a = 5 != 5 ? 'OK' :
5 < 5 ? 'NO' :
5 > 5 ? 'NO!!!' :
'EQUAL'; // 'EQUAL'
// זה בדיוק כמו שנכתוב
let a;
if(5 != 5){
a = 'OK'
} else if(5 < 5){
a = 'NO';
} else if(5 > 5){
a = 'NO!!!';
} else{
a = 'EQUAL';
}אפשר בקלות לראות כמה התצורה הראשונה יותר ברורה מ-if/else.
delete on an object
לאוביקט יש מאפיינים שבנויים ממפתחות וערכים, במידה ואנחנו רוצים למחוק לגמרי מאפיין עם הערך שלו, זה אומר שכאשר נדפיס את האובייקט, המאפיין לא יהיה קיים. ניתן לעשות את זה כך
const a = {
color:'red',
name:'jon'
}
delete a.name;
console.log(a); // {color:'red'}
delete a['color'];
console.log(a); // {}לעלות מספר בחזקה (**)
השיטה הקודמת הייתה Math.pow , בשיטה החדשה פשוט כותבים את זה **, כך קל יותר לעשות תרגיל חשבוני ושהוא ישאר מובן.
const a = 2**3; // 8 const b = 2**-3; // 0.125 const c = (2**3)**3; // 512 // זה הרבה יותר ברור מאשר const d = Math.pow( Math.pow( 2 , 3 ) , 3 ); // 512 // כמובן שגם כאן אפשר לעשות let e = 4; e **= 3; // 64
פעולות קצרות על משתנים
נעבור על מספר פעולות קצרות ומהירות על משתנים ונראה מה התוצאה שלהם
let a = 5;
const b = a++; // b=5 , a=6
const c = ++a; // c=7 , a=7
const d=5;
const e=5;
console.log(d==e) // true
console.log(d!=e) // false
const f=8;
console.log(e<f) // true
console.log(e>f) // false
console.log("aa"<"ab") // true
console.log(d<=e) // true
console.log(d>=e) // true
console.log(d<=e && e<f) // true
console.log(d<=e && e>f) // false
console.log(d<=e || e>f) // true
console.log(!(d<=e && e>f)) // true
ביצוע בדיקה של סוג משתנה (instanceof)
בעזרת פעולה זו , אנו יכולים לבדוק אם המשתנה שלנו הוא מסוג מסויים ועל פי התוצאה לבצע לוגיקה ספציפית
const a = {name:'abc',title:'def'}
a instanceof Object // true
const b = ['aaa','bbb']
b instanceof Array // true
const n = new Number(123)
n instanceof Number // true
const nb = 123
n instanceof Number // false
const s = new String('abc')
s instanceof String // true
const sb = 'abc'
sb instanceof String // falseשימו לב שהשמה של מלל או מספר ישירות למשתנה לא גורם למשתנה לקבל את הסוג המתאים, זה בגלל שהוא primitive.
nullish (??)
בדיקה של צד שמאל, אם הוא null או undefined אז מופעל צד ימין.
const a = null
const b = a ?? 'OK' // b='OK'
const a = 'abc'
const b = a ?? 'OK' // b='abc'
const c = {color:'red'}
c.color ??='blue' // c='red'
c.title ??='car' // there is no title to c object, but now there is :) c.title = 'car'זו דרך טובה לבדוק אם ערך מסויים קיים ואם לא אז לשים לו ברירת מחדל.
optional chaining (?.)
שימושי בעיקר אם אנחנו לא בטוחים שהמאפיין הזה קיים. כאשר משתמשים בו, תבוצע בדיקה מאחורי הקלעים אם המאפיין קיים ובמידה שהוא לא קיים התהליך יעצור ויוחזר undefined במקום שגיאה במצב רגיל.
const obj = {
title:'my obj',
colorOptions:{
optionA:'red',
optionB:'blur'
}
}
console.log(obj.title) // 'my obj'
console.log(obj.title.name) // ERROR
console.log(obj.title?.name) // undefined
console.log(obj.colorOptions?.optionA) // 'red'
console.log(obj.colorOptions?.optionA?.color) // undefinedשארית (%)
במידה שאנחנו רוצים לחלק מספר במספר ולקבל את השארית, זו הדרך לעשות את זה. מאוד יעיל אם אנחנו רוצים לבדוק שהמספר שלנו זוגי, אי זוגי או מתחלק למספר אחר בצורה מלאה. שימו לב שאם מחלקים מספר שלילי, אז התוצאה של השארית תהיה שלילית.
console.log(4 % 2) // 0 console.log(-4 % 2) // -0 console.log(4 % 3) // 1 console.log(-4 % 3) // -1 console.log(20 % 5) // 0
spread (…)
ספרד הוא פעולה ממש חזקה ואני ממליץ להתעמק ולכיר את הפעולה הזאת יותר טוב ממה שאני אראה כאן.
const a = [1,2,3];
const b = [3,4,5];
const c = [a,...b];
console.log(c) // [[1,2,3],3,4,5]
const c = [...a,...b];
console.log(c) // [1,2,3,3,4,5]
const c = {...a};
console.log(c) // {0: 1, 1: 2, 2: 3}
const c = ['aaa',...a,'bbb']
console.log(c) // ['aaa', 1, 2, 3, 'bbb']
const d = [2023,0,14] // for [YEAR,MONTH,DAY]
const c = new Date(d) // ERROR
console.log(c) // Invalid Date
const c = new Date(...d)
console.log(c) // Sat Jan 14 2023 00:00:00 GMT+0200 (Israel Standard Time)
const c = [...a] // now c is new copy of a but only first layerשימו לב, בשורה 21 ראינו העתקה של מערך למערך חדש, מערכים הם בדרך כלל הצבעה לתא בזיכרון ולכן אם עושים const c = a שניהם מצביעים לאותו מקום וזה אומר שאם נשנה אחד מהם נשנה גם את השני.
עם ספרד, זה לא המצב. אבל הוא מעתיק רק את השיכבה הראשונה במערך, אם למערך יש עוד מערכים בפנים, הם לא יעותקו אלא יתבצע הצבעה לאותו התא. משמע, שיכבה ראשונה מועתקת ושיכבה שניה והלאה היא הצבעה לאותו תא בזיכרון.
בדיקת סוג המשתנה (typeof)
במידה שאנחנו רוצים לבדוק את סוג המשתנה שלנו ועל פי התוצאה לבצע פעולה זו דרך די טובה אבל לא ממש מושלמת ואנחנו נראה בהמשך למה.
האופציות לתשובה הן:
- undefined
- object
- boolean
- number
- bigint
- string
- symbol
- function
בעיה ראשונה שאפשר לראות, הוא לא יודע להחזיר array (מחזיר object), בעיה שניה היא null – מחזיר object.
זאת אומר שצריך לזכור שצריך טיפול מיוחד אם אנחנו רוצים לבדוק האם מדובר במערך או ב-null.
typeof 1 === "number";
typeof "1" === "string";
typeof "" === "string";
typeof "aaa" === "string";
typeof true === "boolean";
typeof false === "boolean";
typeof Symbol("foo") === "symbol";
typeof undefined === "undefined";
typeof myVar === "undefined";
typeof { title: 'my obj' } === "object";
typeof [1, 2, 3] === "object";
typeof new Date() === "object";
typeof null === "object";
typeof function () {} === "function";הגענו לסיום, עברנו על כל הדברים החשובים שעוזרים ומקלים עלינו את הפיתוח וההבנה של הקוד. ראינו איך להשתמש ולהפעיל, ראינו כמה זה מצמצם את הקוד שלנו וראינו גם שלא הכל מושלם ובמקרים מסויימים זה לא יעבוד כמו שחשבנו.
בהצלחה 👑





