بهترین روشهای من – JavaScript
۱. غیرفعال کردن کش
Firefox:
باز کردن Developer Tools -> باز کردن تنظیمات (F1) -> "Disable HTTP Cache (when toolbox is open)"
Chrome:
باز کردن Developer Tools -> باز کردن تنظیمات (F1) -> "Disable cache (while DevTools is open)"
۲. کنسول JS را باز نگه دارید
در Dev Tools زبانهی Console را باز کنید و باز نگه دارید، تا مرحلهی ۱ مؤثر بماند و ضمناً خطاهای شبکه و JS را هم ببینید.
این افزونه را هم توصیه میکنم که خطاهای JS را حتی بهتر نشان میدهد، برای وقتی که خودتان یادتان میرود حواستان به آنها باشد:
۳. JavaScript: مطالعهی واجب «You Don't Know JS»
- You Don't Know JS (1st Edition)
- توضیح میدهد چرا باید از
thisپرهیز کرد - توضیح میدهد چرا در JS گاهی اتفاقات بهظاهر عجیبی میافتد (کلیدواژهها: Lexical Scope، Closures)
۴. نقطهویرگول
- همیشه بگذارید
- اجباری نیست، اما مثلاً میتواند به دور زدن این دام کمک کند: Stack Overflow
- JavaScript بهطور خودکار نقطهویرگول میگذارد:
// you want to return 5 and have ugly formatting:
return
5
// JavaScript Interpretation:
return;
5;
۵. عملگرهای منطقی && و ||
- در Java،
a && bوa || bطبق جبر بولی ارزیابی میشوند.aوbباید Boolean باشند. - در JavaScript:
- در
a && b، اگرaبرابر true باشد،bبرگردانده میشود - در
a || b، اگرaبرابر false باشد،bبرگردانده میشود
- در
عبارتها (Expressions) را هم میتوان اینطور به هم بست، و این کوتاهترین دستور if ممکن را فراهم میکند – Syntax Sugar:
isAdmin && showDeleteButton();- (اگر دقیق بگوییم، این دیگر یک Statement نیست)
از این روش برای مقادیر پیشفرض هم زیاد استفاده میشود:
let sendNewsletter = form.getNewsletterOptIn() || false;
۶. آیا JavaScript با ارجاع (pass-by-reference) پاس میدهد یا با مقدار (pass-by-value)؟
در JavaScript ماجرا جالب است. مثال:
function changeStuff(a, b, c) {
a = a * 10;
b.item = "changed";
c = {item: "changed"};
}
var num = 10;
var obj1 = {item: "unchanged"};
var obj2 = {item: "unchanged"};
changeStuff(num, obj1, obj2);
console.log(num);
console.log(obj1.item);
console.log(obj2.item);
خروجی زیر را تولید میکند:
10
changed
unchanged
اگر obj1 اصلاً ارجاع نبود، تغییر obj1.item هیچ اثری روی obj1 بیرون از تابع نمیداشت.
اگر آرگومان یک ارجاع واقعی بود، همهچیز تغییر میکرد: num برابر ۱۰۰ میشد و obj2.item مقدار «changed» را میداشت. اما در عوض num همان ۱۰ میماند و
obj2.item همان «unchanged» باقی میماند.
در واقع عنصر ارسالی با مقدار پاس داده میشود. اما چیزی که با مقدار پاس داده میشود، خودش یک ارجاع است. از نظر فنی به این فراخوانی با اشتراک (call-by-sharing) میگویند.
در عمل یعنی: اگر خود پارامتر را تغییر دهید (مثل num و obj2)، اثری روی شیء اصلی که به تابع پاس داده شده ندارد.
اما اگر مقادیر درونی پارامتر را تغییر دهید، این تغییرات اعمال میشوند (مثل obj1).