Expressions and operators in JavaScript
غیر از کاراکتر های عدد و رشته یک سری کاراکتر دیگر داریم که در دسته بندی Expressions – operators قرار می گیرند. کاربرد آن ها مقایسه ، عملیات های ریاضی ، مقدار دهی و عملیات های منطقی و … است :
- Assignment operators
- Comparison operators
- Arithmetic operators
- Bitwise operators
- Logical operators
- String operators
- Conditional (ternary) operator
- Unary operators
- Relational operators
در عملیات هایی که در آن از operator استفاده می شود یک عبارت یا یک statement است . متغیر ها و یا مقدار هایی که در این statement قرار می گیرد به آن عملوند operand و اون کاراکتر یا عبارت که این عملوند ها را درگیر می کند عملگر یا operator می گویند.
به صورت کلی در این بخش قرار است که در رابطه با عملگر های معمول (operator) و عبارات (expression) خاص می پردازیم . مشخصه مشترک این دو مورد قرار گرفتن در میان دو مقدار – value – است . ممکن است این عملگر با یک مقدار در ارتباط باشد که به آن Unary است.
a == b //a,b is operands , = is operator
Assignment Operators
از این دسته عملگرها برای مقدار دهی میان متغیر و مقدار استفاده می کنیم (variable && value). به صورت کلی عملگر هایی که در آن = باشند در دسته عملگر های assignment قرار می گیرند.
Operator | Description |
= | مقدار دهی میان variable , value |
Number Operator
سایر عملگر های مقداردهی در ضمره عملیات های ریاضی می باشد که در این مقاله گفته شده است .این دسته عملگر های شامل assignment , arithmetic می باشد.
Strings Operator
این دسته از عملگر ها در ضمره عملگر های ساختمان داده رشته قرار می گیرد و در این مقاله قرار گرفته است. عملگر های assignment , concatenate این موارد می باشد.
Comparison Operators
این دسته از عملگر ها برای مقایسه میان دو عملوند استفاده می شوند. معمولا در این نوع عملگر ما نوع دو عملوند باید یکسان باشد. منطقی است که دو عدد از نظر مقدار با هم مقایسه می شوند و دو رشته از نظر ویژگی های آن ها نظیر طول رشته .
Operator | Description |
== | equal value |
=== | equal value , equal type
5 == "5" //true 5 === "5" //false |
!= | not equal value |
!== | not equal value , not equal value |
> | قیاس کوچکتری |
< | قیاس بزرگتری |
>= | قیاس کوچکتر یا مساوی |
=< | قیاس بزرگتر یا مساوی . به این شکل است که حتما به همین ترتیب یعنی اول علامت < بعد = قرار بدهید. این یک تمرین خوب است . در برخی زبان ها مثل php این حالت اگر به شکل => باشد خطا خواهیم داشت به دلیل تداخل با علامت assign در آرایه های انجمنی |
Conditional (Ternary) Operator
condition ? value : value | این یک شرط تک خطی است که در اکثر زبان های C بیس داریم . بخش اول مقدار if است و بخش دوم otherwise است.
(age < 18) ? "Too young":"Old enough"; |
Logical operators
عملیات های منطقی معمولا به صورت ترکیبی با عملگر های دیگر استفاده می شود.
Operator | Description |
&& | AND |
|| | OR |
! | NOT |
!! | از این عملگر برای تبدیل به Boolean استفاده می کنیم.
let name = 'edi' let condition = !! 'edi' //true let condition2 = ! name //false |
تبدیل به Boolean با عملگر های !! , !
به صورت کل خروجی در عملگر های منطقی (!! و !) به شکل Boolean است .گاهی در کد ها برای برگرداندن یک مقدار به صورت Boolean در صورتی که مقدار حاصل این منطق اجرایی باشد استفاده می کنیم.
- !! : برای تبدیل کردن به Boolean دقیقا مطابق با خروجی منطق اجرایی
- ! : به صورت Boolean است عکس منطق اجرایی در متد.
مقدار دهی با عملگر های && , ||
در منطق عملگر && قرار است تا آخرین عملوند را اجرا کند تا به آخرین true و اولین false برسد. به این شکل که اگر اولین false را پیدا کرد دیگر ادامه نمی دهد و اگر در ادامه statement شما خطایی داشته باشید در صورتی که به نتیجه مطلوب یعنی false رسیده باشد دیگر خطا نداریم:
let a = true && false && l; //false . but l variable not define
در مثال بالا ما یک خطا در هنگام اجرا داریم که متغیر l را تعریف نکرده ایم و اگر به صورت عادی این اجرا گردد خطای Uncaught ReferenceError: l is not defined
را خواهیم داشت . اما چون به اولین false رسید دیگر ادامه نمی دهد.
let e = true && 3 //3 let l = 2 && 5 && 4 //4 let q = 5 && false && 4 //false
عملگر || یا همان مقدار OR به این شکل است که به دنبال اولین true و به دنبال آخرین false می گردد. به این شکل که اگر در یک statement بلند به اولین true رسید دیگر ادامه نمی دهد و اگر پیدا نشده تا اخر عبارت جلو رفته و در نهایت آخرین false را بر می گردد.
let a = 2 || 3 || 4 || 5 //2 let b = false || false || 4 //4 let c = false || 3 || 4 || l //3 but l variable is undefine
همان طور که در خط سه مثال بالا متغیر l تعریف نشده است و چون مفسر به اولین مقدار همیشه درست رسیده دیگر ادامه را اجرا نمی کند.
یکی دیگر از کاربردهای عملگر || همین است که می توان چک کرد که اگز مقدار یک متغیر برابر با هر یک از موارد false , undefined , null باشد مقدار دوم و اگر برابر با مقدار واقعی باشد همان مقدار باشد (این حالت را به صورت ternary operator هم می توان تشخیص داد) . حالت های مختلف را در مثال زیر می توانید تست کنید:
let a = NaN //let a = false //let a = undefined //let a = null //let a = 44 let result = a || 23 console.log(result)
Nullish Coalecsing
یک عبارت که Boolean بر می گرداند. به این ترتیب که قرار است که اگر در شرط قرار بدهیم تنها در حالت undefined , null صحت عملکرد را برمی گرداند:
if(undefined ?? true){ console.log('undefined') } /* undefined */ if(NaN ?? true){ console.log('not a number') } if(null ?? true){ console.log('null') } /* null */ if(false ?? true){ console.log('false') }
Optional Chaining
در جاوا اسکریپت اگر از یک مقدار undefined یک Property یا یک Array item با کلید اشتباه بگیرید خطای Type Error خواهید داشت که مانع ادامه اجرای یک برنامه خواهد بود.این دسته از خطا برای Object ها و Array اتفاق می افتد. روال به این صورت است که تا عمق یک اگر مقدار undefined باشد خطایی نداریم. به طور مثال اگر کلید یک شئ تعریف شده را اشتباه درخواست بدهیم. اما اگر از سطح دوم به بعد یعنی کلید بعدی را از یک مقدار undefined درخواست بدهیم خطا خواهیم داشت:
person = { grades: { math: { mid: 19, final: 20 }, sport: { mid: 20, final: 20 } } } person.grades.history.mid /*Uncaught TypeError: person.grades.history is undefined*/ let rooms = [ [ 10,29 ], [ 11,23 ] ] let s = rooms[3][2] /*Uncaught TypeError: rooms[3] is undefined*/
برای مدیریت این خطا می توانید از عملگر های && , ?. استفاده کنید.
console.log(person?.grades?.history?.mid) console.log(person && person.grades && person.grades.history && person.grades.history.mid) console.log(rooms[3] && room[3][2]) console.log(rooms[3]?.[2])
Bitwise Operators
همان طور که از نام این دسته عملگر مشخص است به صورت عملوند های آن ها به صورت 32 بیتی باشند . این دسته عملگر ها عملوند ها را به مبنای ۳۲ بیت می برد و بعد از آن عملیات را در همان مبنای ۳۲ بیت انجام می دهد و نهایت خروجی که به شما می دهد در مبنای 10 یعنی همان decimal است.
Unary operators
عملگر ها یا در اینجا می توان گفت عملیات های یگانه دسته ای از عملگر ها هستند که یک عملگر دریافت می کنند. در دسته قبل یک یا چند عملوند قبول می کردند. این عملگر ها از طرفی به تابع ها نزدیک هستند اما به دلیل syntax استفاده از آن ها و این که یک عملوند بیشتر یا کمتر نمی گیرند در دسته عملگر ها قرار می گیرند.
مهم ترین عملگر های Unary :
- typeof
- delete
- in
- instanceof
- void
Operator | Description |
typeof | برای برگداندن نوع ساختمان داده متغیر یا مقدار داده شده
typeof "John" // Returns string typeof 3.14 // Returns number typeof NaN // Returns number typeof false // Returns boolean typeof [1, 2, 3, 4] // Returns object typeof {name:'John', age:34} // Returns object typeof new Date() // Returns object typeof function () {} // Returns function typeof myCar // Returns undefined (if myCar is not declared) typeof null // Returns object |
delete | برای حذف یک ویژگی property از یک شئ object است
const person = { firstName:"John", lastName:"Doe", age:50, eyeColor:"blue" }; delete person.age; // or delete person["age"]; این عملگر روی تابع یا متغیر تاثیری ندارد . برای اشیا پیش فرض جاوا اسکریپت کاربرد ندارد و در صورت استفاده برنامه شما crash می کند. delete Math.PI Math.PI 3.141592653589793 |
in | این عملگر بررسی می کند که آیا مقدار داده شده در object مورد نظر وجود دارد یا خیر . این جستجو در کلید ها و مقدار ها اتفاق می افتد.
// Arrays const cars = ["Saab", "Volvo", "BMW"]; "Saab" in cars // Returns false (specify the index number instead of value) 0 in cars // Returns true 4 in cars // Returns false (does not exist) "length" in cars // Returns true (length is an Array property) // Objects const person = {firstName:"John", lastName:"Doe", age:50}; "firstName" in person // Returns true "age" in person // Returns true // Predefined objects "PI" in Math // Returns true "NaN" in Number // Returns true "length" in String // Returns true |
instanceof | حالت شرطی برای typeof است
const cars = ["Saab", "Volvo", "BMW"]; (cars instanceof Array) // Returns true (cars instanceof Object) // Returns true (cars instanceof String) // Returns false (cars instanceof Number) // Returns false |
void | این عملگر undefined برمی گرداند ضمن اجرای منظق پاس داده شده به آن . این عملگر بیشتر برای ارزیابی است . این عملگر به واسطه ورودی های طولانی که به آن پاس داده می شود می تواند داخل یک پرانتز قرار بگیرد . گذاشتن () پرانتز اختیاری است اما یک best practice است. همیشه بگذارید و سوال نپرسید.
سبک استفاده از آن به شکل var a =5 void a+=5 void (a += 5) // a=5 and return NaN یکی دیگر از کاربردهای این عملگر این است که در داخلی href قرار می گیرد و لینک را به یک event تبدیل می کند که درخواست به لینک ارسال نمی کند. <a href="javascript:void(0);"> Useless link </a> در مثال دیگر رنگ زمینه صفحه را قرمز می کنیم بی این که کلیک روی لینک برای ما درخواستی ارسال کند. <a href="javascript:void(document.body.style.backgroundColor='red');"> Click me to change the background color of body to red </a> |
اشتباهات رایج در پیدا کردن نوع یک مقدار:
- NaN is number برای متد جایگزین
isNaN
- array is object برای متد جایگزین
Array.isArray
- date is object برای جایگزین
- null is object برای عملگر جایگزین
!
استفاده کنید - undefined variable is undefined
Typeof
برای تعیین نوع ساختمان داده یک متغیر می توان از این تابع پر کاربرد استفاده کرد:
Type | Result |
---|---|
Undefined | "undefined" |
Null | "object" |
Boolean | "boolean" |
Number | "number" |
BigInt | "bigint" |
String | "string" |
Symbol | "symbol" |
Function | "function" |
Any other object | "object" |
در ساختار بالا نکته قابل توجه این است که مقادیر ساختمان داده ها یا Object هستند یا Primitive Data Structure . پس می توان گفت که ساختمان داده ها را در جاوا اسکریپت به همین موارد تقسیم بندی می کنیم. مثلا Array نیز در جاوا اسکریپت یک Object است اگر از typeof operator استفاده کنید.
دیدگاهتان را بنویسید