کتاب دستور زبان جاوااسکریپت ۲ نسخه PDF انگلیسی
۸۴.۸۷۰ تومان قیمت اصلی ۸۴.۸۷۰ تومان بود.۳۸.۴۵۰ تومانقیمت فعلی ۳۸.۴۵۰ تومان است.
مشخصات فایل
- نوع فایل: PDF
- زبان: انگلیسی
- تعداد صفحات: 284 صفحه
- حجم فایل: 20.7 مگابایت
- قابل استفاده در: موبایل، تبلت، کامپیوتر
- نوع دسترسی: دانلود فوری بعد از خرید
معرفی کتاب JavaScript Grammar اثر Greg Sidelnikov
JavaScript Grammar اثر Greg Sidelnikov یک راهنمای آموزشی برای درک ساختار زبان JavaScript، رفتار Scope و Functionها، Objectها، Prototypeها و قابلیتهای مدرن این زبان است. فایل این محصول با نامی مرتبط با JavaScript Grammar II ثبت شده است؛ بنابراین در توضیحات حاضر از نسبت دادن شماره ویرایش یا سال دقیق فراتر از چیزی که فایل بهطور قطعی نشان میدهد خودداری میکنیم و تمرکز را روی محتوای قابل اتکای کتاب و مفاهیم ماندگار JavaScript قرار میدهیم. این اثر برای برنامهنویسی مناسب است که Syntax مقدماتی را دیده اما میخواهد بداند چرا یک قطعه Code در Runtime رفتار خاصی دارد، Scope چگونه تعیین میشود، Closure چگونه State را حفظ میکند و Prototype Chain چه نقشی در Object-oriented JavaScript دارد.
یادگیری حرفهای JavaScript فقط حفظ کردن Keywordها نیست. بخش زیادی از Bugهای واقعی زمانی رخ میدهند که Developer تفاوت Primitive و Reference، Coercion، Hoisting، Lexical Scope، this، Asynchronous Execution یا Mutability را دقیق نمیداند. چنین مفاهیمی در Frameworkهای مختلف نیز باقی میمانند؛ چه با JavaScript خالص کار کنید، چه با React، Vue، Node.js یا ابزارهای دیگر.
JavaScript چگونه اجرا میشود؟
JavaScript یک زبان سطح بالا با Runtime و Event Loop است. Engine Source Code را Parse و Compile/Interpret میکند و سپس Statementها در Execution Contextهای مختلف اجرا میشوند.
برای درک رفتار زبان باید میان Call Stack، Heap و Queueهای مربوط به عملیات Async تفاوت گذاشت. این مدل کمک میکند دلیل اجرا شدن Callbackها یا Promiseها در زمانهای متفاوت روشن شود.
Execution Context
هنگام اجرای Global Code یا فراخوانی Function، Context جدیدی ساخته میشود. Variable Environment، Scope و مقدار this با این Context مرتبطاند.
درک Execution Context پایه فهم Hoisting، Closure و Function Call است.
Primitive Values
نوعهای Primitive شامل String، Number، Boolean، undefined، null، Symbol و BigInt هستند. این مقدارها رفتار Value-like دارند و برخلاف Objectها Propertyهای mutable واقعی روی خود Value ذخیره نمیکنند.
شناخت Type برای Comparison، Conversion و API Design اهمیت دارد.
Reference-like Behavior در Objectها
Object، Array و Function Object هستند. وقتی Object را به Variable دیگری Assign میکنیم معمولاً هر دو Reference به همان Object اشاره میکنند.
به همین دلیل تغییر Property از یک Reference میتواند از Reference دیگر نیز دیده شود.
typeof
Operator typeof برای بررسی نوع مفید است، اما رفتار تاریخی خاصی دارد؛ برای مثال typeof null نتیجه object میدهد.
برای Array معمولاً Array.isArray انتخاب دقیقتری است.
Type Coercion
JavaScript در بعضی Operationها Type را به شکل ضمنی تبدیل میکند. این قابلیت میتواند Convenient باشد اما اگر Rules شناخته نشوند Bug ایجاد میکند.
استفاده آگاهانه از Conversion صریح در Code حساس خوانایی را افزایش میدهد.
Equality
== پیش از Comparison ممکن است Coercion انجام دهد، در حالی که === Type و Value را بدون تبدیل مشابه مقایسه میکند.
در بیشتر Codeهای Application استفاده از Strict Equality رفتار قابل پیشبینیتری ایجاد میکند.
Truthy و Falsy
Conditionها فقط Boolean نمیپذیرند و Valueهای دیگر نیز به Boolean تبدیل میشوند. مقادیری مانند 0، رشته خالی، null، undefined و NaN falsy هستند.
این رفتار در Default Value و Validation اهمیت دارد.
NaN
NaN نشاندهنده نتیجه عددی نامعتبر است. نکته مهم این است که NaN حتی با خودش نیز برابر نیست.
برای بررسی آن Number.isNaN معمولاً مناسبتر از Comparison مستقیم است.
var
var Function-scoped است و Declaration آن Hoist میشود. همین رفتار میتواند در Loop یا Blockهای شرطی نتیجه غیرمنتظره بسازد.
در Code مدرن معمولاً let و const انتخابهای واضحتری هستند.
let و const
let و const Block-scoped هستند. const اجازه Reassignment Reference را نمیدهد، اما اگر Value یک Object باشد Propertyهای آن همچنان میتوانند تغییر کنند.
پس const به معنی Immutable Object نیست.
Temporal Dead Zone
Variableهای let و const از ابتدای Scope شناخته میشوند، اما تا Declaration قابل دسترسی نیستند. این فاصله Temporal Dead Zone نام دارد.
Scope
Scope تعیین میکند یک Identifier از کجا قابل دسترسی است. JavaScript از Lexical Scope استفاده میکند؛ یعنی Structure Source Code روی Resolution Variableها اثر دارد.
Lexical Environment
Function داخلی میتواند Variableهای Scope بیرونی را ببیند. همین Relation پایه Closure است.
Hoisting
Declarationها در مرحله ایجاد Context ثبت میشوند، اما رفتار Function Declaration، var و let/const یکسان نیست.
Hoisting را بهتر است بهعنوان رفتار Environment هنگام ایجاد Context فهمید، نه اینکه «خطها واقعاً به بالا منتقل میشوند».
Function Declaration
Function Declaration معمولاً پیش از محل نوشتاری خود قابل فراخوانی است، زیرا Binding آن هنگام ایجاد Scope آماده میشود.
Function Expression
در Function Expression، Function به Variable Assign میشود و Availability آن به Ruleهای همان Variable وابسته است.
Arrow Functions
Arrow Function Syntax کوتاهتری دارد و this مستقل نمیسازد. این رفتار در Callbackها مفید است اما Arrow Function جایگزین همه Functionهای معمولی نیست.
Lexical this
Arrow Function مقدار this را از Scope بیرونی میگیرد. به همین دلیل برای Methodهایی که به Receiver پویا نیاز دارند ممکن است انتخاب نامناسبی باشد.
this در Function معمولی
مقدار this در Function معمولی به نحوه Call بستگی دارد. Method Call، Constructor Call و explicit binding رفتار متفاوتی دارند.
یکی از Bugهای متداول JavaScript جدا کردن Method از Object و از دست دادن Context آن است.
call، apply و bind
این Methodها امکان کنترل this را فراهم میکنند. bind Function جدید با Context ثابت میسازد، در حالی که call و apply Function را اجرا میکنند.
Closure
Closure زمانی شکل میگیرد که Function پس از پایان Scope بیرونی همچنان به Variableهای آن دسترسی داشته باشد.
Closure برای Encapsulation، Factory Function، Event Handler و State کوچک کاربرد دارد.
Memory و Closure
Closure میتواند Data را زنده نگه دارد. اگر Referenceهای غیرضروری حفظ شوند، Memory Usage افزایش مییابد.
پس Closure ابزار قدرتمندی است اما باید Lifetime داده را فهمید.
Functionهای Higher-order
Function میتواند Function دیگر را ورودی بگیرد یا خروجی دهد. map، filter و reduce نمونههایی از APIهایی هستند که از این قابلیت بهره میبرند.
Array
Array Structure ترتیبی برای نگهداری Valueهاست و مجموعه بزرگی از Methodهای Transformation و Search دارد.
شناخت تفاوت Methodهای Mutating و Non-mutating برای مدیریت State مهم است.
map
map برای هر Element خروجی جدید تولید و Array جدید میسازد. زمانی مناسب است که هدف Transformation یکبهیک باشد.
filter
filter Elementهایی را نگه میدارد که Predicate برای آنها true باشد.
reduce
reduce مجموعه را به یک Accumulator تبدیل میکند. این ابزار قدرتمند است، اما اگر Callback پیچیده شود Loop یا Functionهای واضحتر ممکن است Readability بهتری داشته باشند.
some و every
some بررسی میکند حداقل یک Element شرط را برآورده میکند و every نیازمند درست بودن شرط برای همه Elementهاست.
find
find اولین Element سازگار با شرط را برمیگرداند و برای Search ساده مناسب است.
Array Mutation
Methodهایی مانند push، pop، splice و sort میتوانند Array اصلی را تغییر دهند. در معماریهایی که State immutability مهم است باید این رفتار آگاهانه مدیریت شود.
Object
Object مجموعهای از Propertyهاست که Key به Value نگاشت میشود. Objectها پایه بسیاری از Modelهای Domain در JavaScript هستند.
Property Access
Dot notation برای Keyهای ثابت و bracket notation برای Keyهای dynamic مفید است.
Destructuring
Destructuring امکان استخراج Property یا Elementها را در Syntax کوتاه فراهم میکند. Default Value و Rest Pattern نیز با آن ترکیب میشوند.
Spread Syntax
Spread برای باز کردن Iterable یا Propertyهای Object استفاده میشود. Copy حاصل از Spread معمولاً Shallow است.
Nested Objectها همچنان Reference مشترک دارند.
Rest Parameters
Rest تعداد متغیری از Argumentها را به Array تبدیل میکند و جایگزین خواناتری برای بعضی استفادههای قدیمی از arguments است.
Prototype
JavaScript از Prototype-based inheritance استفاده میکند. Object میتواند Property را از Prototype خود پیدا کند.
Prototype Chain
اگر Property روی Object وجود نداشته باشد، Lookup در Prototype ادامه پیدا میکند تا به null برسد.
فهم این Chain برای Method Sharing و رفتار Classها ضروری است.
Constructor Function
پیش از Class Syntax، Constructor Function همراه new روش رایج ساخت Instance بود. Prototype Methodها میان Instanceها Share میشوند.
class Syntax
Class در JavaScript Syntax سطح بالاتری روی سیستم Prototype است و مدل ارثبری مستقل جدیدی ایجاد نمیکند.
Inheritance
extends و super ساخت Hierarchy را ساده میکنند. با این حال Composition اغلب Coupling کمتری ایجاد میکند.
Encapsulation
Encapsulation یعنی محدود کردن State داخلی و ارائه Interface مشخص. Closure، Module و Private Fieldهای جدیدتر ابزارهایی برای این کار هستند.
Iterables
Iterable Objectی است که Protocol مربوط به Symbol.iterator را پیادهسازی میکند. Array، String، Map و Set نمونههای مهماند.
Iterator
Iterator Objectی با Method next است که Value و done را برمیگرداند.
Generators
Generator با function* و yield امکان تولید Lazy Sequence را فراهم میکند.
Generator برای Pipeline، Traversal و State Machine ساده مفید است.
Map
Map Structure Key/Value است و برخلاف Object محدود به String/Symbol Key نیست. برای Lookupهایی که Semantics Map دارند انتخاب خوبی است.
Set
Set مجموعه Valueهای یکتا نگه میدارد. حذف Duplicate یا Membership Test از کاربردهای رایج آن است.
Modules
Module Code را به Scopeهای جدا تقسیم میکند و import/export Contract میان Fileها را مشخص میکند.
این ساختار Global Namespace را کاهش و Testing را ساده میکند.
Asynchronous JavaScript
عملیات Network، Timer و I/O معمولاً Async هستند. JavaScript با Callback، Promise و async/await این Flow را مدیریت میکند.
Callback
Callback Functionی است که برای اجرای بعدی ارسال میشود. Nesting زیاد Callback میتواند Error Handling و Readability را دشوار کند.
Promise
Promise وضعیت pending، fulfilled یا rejected دارد و Chain کردن عملیات Async را ساختاریافتهتر میکند.
async/await
async و await Syntaxی شبیه Flow ترتیبی روی Promiseها ارائه میدهند. Error همچنان باید با try/catch یا Promise handling مدیریت شود.
Event Loop
Event Loop هماهنگ میکند Callbackهای آماده چه زمانی وارد Call Stack شوند. JavaScript روی Browser معمولاً یک Thread اصلی برای اجرای Code UI دارد.
Task و Microtask
Promise callbackها معمولاً در Microtask Queue قرار میگیرند و ترتیب آنها با Timer callbackها متفاوت است.
فهم این تفاوت برای پیشبینی ترتیب Logها و جلوگیری از Starvation مهم است.
setTimeout
Delay در setTimeout زمان تضمینشده اجرا نیست؛ حداقل زمانی است که Callback پیش از آن اجرا نمیشود. اگر Stack مشغول باشد اجرا دیرتر میشود.
DOM
Document Object Model ساختار Page را به Objectهایی قابل دستکاری تبدیل میکند. Query، تغییر Attribute و ساخت Element از عملیات پایهاند.
Events
Browser Eventهایی مانند click، input و keydown تولید میکند. Event Listener باید Lifecycle مناسبی داشته باشد تا Leak یا رفتار تکراری ایجاد نشود.
Event Bubbling
Event میتواند از Element هدف به Ancestorها Bubble کند. Event Delegation از همین رفتار برای مدیریت تعداد زیادی Element استفاده میکند.
preventDefault و stopPropagation
این دو Method رفتار متفاوت دارند: یکی Default Action Browser را متوقف و دیگری مسیر Propagation را کنترل میکند.
requestAnimationFrame
برای Animationهای وابسته به Rendering Browser، requestAnimationFrame معمولاً مناسبتر از Timer ثابت است، زیرا با چرخه Paint هماهنگ میشود.
Performance
Performance JavaScript به Algorithm، DOM Access، Allocation و Network وابسته است. Micro-optimization بدون Profiling معمولاً اولویت درستی نیست.
Debounce
Debounce اجرای Function را تا آرام شدن Eventها عقب میاندازد. Search Input نمونه کاربردی آن است.
Throttle
Throttle تعداد اجرای Function در بازه زمانی را محدود میکند و برای scroll یا resize مفید است.
Error Handling
try/catch برای Exceptionهای synchronous و خطاهای awaitشده استفاده میشود. Error باید Context کافی داشته باشد و Failure خاموش نشود.
Custom Error
ساخت Errorهای Domain-specific به Caller اجازه میدهد Failureهای مختلف را جدا مدیریت کند.
Strict Mode
Strict Mode برخی رفتارهای مبهم یا خطرناک قدیمی را محدود میکند. Moduleهای ES بهصورت پیشفرض strict هستند.
Debugging
Browser DevTools، Breakpoint، Network Panel و Console ابزارهای اصلی Debug هستند. خواندن Stack Trace مهارتی ضروری است.
Linting
Linter خطاهای رایج و Style ناسازگار را زودتر پیدا میکند. Ruleها باید با Team و Codebase هماهنگ باشند.
Testing
Unit Test برای Functionهای Pure آسانتر است. Separation بین Logic و DOM/Network Testing را ساده میکند.
Immutability
کاهش Mutation غیرضروری Reasoning درباره State را آسان میکند. با این حال JavaScript ذاتاً Objectهای mutable دارد و باید الگوی تیم مشخص باشد.
Functional Style
Functionهای کوچک، Transformationهای روشن و Side Effect محدود میتوانند Code را قابل پیشبینیتر کنند.
Object-oriented Style
در Domainهایی با Entity و Behavior مرتبط، Object و Class میتوانند ساختار مناسبی باشند. JavaScript اجازه ترکیب چند Paradigm را میدهد.
ES6 و نسلهای بعدی
let/const، Arrow Function، Class، Module، Promise، Destructuring، Rest/Spread و Iterator بخش مهمی از JavaScript مدرن را شکل دادند.
کتاب JavaScript Grammar به دورهای مربوط است که قابلیتهای ES6 تا نسلهای بعدی ES2019/ES10 در آموزش JavaScript اهمیت ویژهای پیدا کرده بودند.
محدودیت تاریخی کتاب
JavaScript و Browser APIها بهسرعت تغییر میکنند. برخی Featureهای جدیدتر مانند Optional Chaining، Nullish Coalescing، Private Fields و Top-level Await ممکن است در نسخه فایل حاضر پوشش داده نشده باشند.
بهتر است Conceptهای زبان را از کتاب یاد بگیرید و Syntax و Compatibility جدید را با Documentation فعلی تکمیل کنید.
خوانایی کد
Code کوتاه الزاماً Code خوب نیست. Naming، Function Size، Control Flow و Data Shape باید برای Reader قابل فهم باشند.
Separation of Concerns
Logic، DOM Manipulation، Network و State بهتر است مرزهای مشخص داشته باشند. این تفکیک Refactoring و Testing را آسانتر میکند.
Dependency Management
Projectهای جدید از Package Manager و Module System استفاده میکنند. Dependency باید Version و Security Update مناسب داشته باشد.
Security
JavaScript سمت Client نباید Secret نگه دارد. هر Data دریافتی از User یا Network باید بر اساس Context Validate یا Escape شود.
XSS
قرار دادن String غیرقابل اعتماد در HTML میتواند Cross-site Scripting ایجاد کند. استفاده از APIهای safe DOM و Encoding مناسب ضروری است.
JSON
JSON Format رایج انتقال Data است. Parse کردن Data به معنی معتبر بودن Schema آن نیست و Validation همچنان لازم است.
روش مطالعه پیشنهادی
برای هر موضوع یک مثال بسیار کوچک در Console یا Browser بسازید. رفتار Scope، this، Prototype و Event Loop را با Log و Breakpoint مشاهده کنید.
سپس همان Concept را در یک Mini Project استفاده کنید تا تفاوت حفظ Syntax و فهم Runtime روشن شود.
پروژه تمرینی
یک Task Manager کوچک با Module، Event، Local State، Async API و Validation بسازید. تلاش کنید Business Logic را از DOM جدا نگه دارید و Unit Test برای Functionهای اصلی بنویسید.
این کتاب برای چه کسانی مناسب است؟
- توسعهدهندگان Frontend در سطح مقدماتی تا متوسط.
- برنامهنویسانی که میخواهند Scope، Closure و this را عمیقتر بفهمند.
- افراد علاقهمند به Prototype و Object Model جاوااسکریپت.
- توسعهدهندگان Node.js که به مبانی خود زبان نیاز دارند.
- کسانی که قصد یادگیری Event Loop و Async JavaScript دارند.
جمعبندی
JavaScript Grammar اثر Greg Sidelnikov راهنمایی برای عبور از یادگیری سطحی Syntax و رسیدن به فهم رفتار واقعی JavaScript است. Typeها، Scope، Function، Closure، this، Array Methodها، Objectها، Prototype، Class، Iterator، Promise، Event Loop و Browser Eventها از مباحثی هستند که پایه توسعه حرفهای JavaScript را میسازند.
با توجه به سرعت تغییر اکوسیستم وب، جزئیات Version-sensitive باید با مستندات جدید تکمیل شوند؛ اما مفاهیم اصلی زبان همچنان ماندگارند. خوانندهای که این پایهها را بهدرستی بفهمد، در یادگیری Frameworkها نیز کمتر به حفظ Recipe وابسته میشود و میتواند دلیل رفتار Code و Failureهای آن را دقیقتر تحلیل کند.

نقد و بررسیها
هنوز بررسیای ثبت نشده است.