آموزش نوع داده ها در جاوا اسکریپت
در این فصل، مقدمه ای را در مورد نوع داده ها(type system) در جاوا اسکریپت، یاد خواهیم گرفت.
نوع داده ها در جاوا اسکریپت
جاوا اسکریپت تنها 6 نوعِ داده دارد. نوعِ داده(type)، درواقع نوعِ مقادیری هستند که در یک متغیر قرار می گیرند. نوع داده های اکما اسکریپت به صورت زیر هستند:
- Undefined
- Null
- Boolean
- String
- Number
- Object
بنابراین، کانستراکتور ها(constructor) از نظر فنّی نوع داده ی جدیدی را ایجاد نمی کنند، حتی اگر گفته شود که از آنها نمونه(instance) ایجاد شده است.
استاتیک یا دینامیک
در سیستم نوع داده ها، استاتیک یعنی در زمان کامپایل یا بدون اجرای برنامه؛ اما دینامیک یعنی به هنگام اجرای برنامه(runtime).
استفاده از نوعِ استاتیک یا نوعِ دینامیک
در یک زبان برنامه نویسی استاتیک، متغیرها، پارامترها، و عضوهای آبجکت ها(که در جاوا اسکریپت به آن پروپرتی می گوییم) هرکدام از چند نوع(type) برخوردار هستند که کامپایلر در زمان کامپایل، آنها را شناسایی می کند. کامپایلر می تواند از این اطلاعات برای بررسی نوع ها( type checks) و بهینه سازی کدهای کامپایل شده، استفاده کند.
حتی در زبان های برنامه نویسی استاتیک، متغیرها نیز از یک نوع(type) دینامیک برخوردار هستند؛ یعنی نوع مقدار متغیر در یک نقطه مشخص از زمان اجرا(runtime). نوعِ(type) دینامیک می تواند با نوع استاتیک متفاوت باشد؛ بعنوان مثال در زبان جاوا.
Object foo = "abc";
نوع استاتیک foo همان آبجکت(Object) است. نوع دینامیک آن String است. جاوا اسکریپت از نوع دینامیک است؛ معمولاً انواع متغیرها، در زمان کامپایل، شناخته شده نیستند.(بعدا بررسی شود).
مقایسه ی تایپ چک استاتیک، و تایپ چک دینامیک
اگر اطلاعاتی، در مورد یک نوعِ داده داشته باشیم، میتوانیم بررسی کنیم که آیا مقداری که در یک عملیات ( مثل فراخوانی یک تابع، اعمال یک عملگر و غیره) استفاده میشود، نوع صحیحی دارد یا خیر؟ از نظر استاتیکی، زبان هایی که تایپ چک شده اند(یعنی نوع آنها بررسی شده است)، این بررسی را در زمان کامپایل انجام می دهند. اما زبان های دینامیک که تایپ چک شده اند، به هنگام زمان اجرا(runtime) این بررسی را انجام می دهند.
یک زبان، می تواند هم به صورت استایک و هم به صورت دینامیک، تایپ چک(type-checked) شود. اگر یک بررسی( a check fails) با شکست مواجه شود، معمولاً نوعی خطا دریافت می کنیم. جاوا اسکریپت، نوع بسیار محدودی از تایپ چک های دینامیک را انجام می دهد:
> var foo = null;
> foo.prop
TypeError: Cannot read property 'prop' of null
اما اتفاقات به صورت خاموش عمل می کنند. بعنوان مثال، اگر ما به یک پروپرتی(property) دسترسی داشته باشیم که وجود ندارد، مقدار undefined را دریافت می کنیم:
> var bar = {};
> bar.prop
undefined
اجبار مقدار صحیح
در جاوا اسکریپت، راه اصلی برای برخورد با یک مقدار(value) که نوع(type) آن، صحیح نیست، این است که آن مقدار را وادار یا اجبار(Coercion) کنیم که نوع صحیحی داشته باشد. اجبار (Coercion)، یعنی تبدیل نوع ضمنی(implicit type conversion). اکثر عملوندها، اجباری هستند:
> '3' * '4'
12
مکانیسم هایِ تبدیلِ داخلیِ جاوا اسکریپت، تنها از نوع داده های زیر پشتیبانی می کنند:
- Boolean
- Number
- String
- Object
برای تبدیل یک نمونه(instance) از یک کانستراکتور(سازنده: constructor) به یک نمونه از یک کانستراکتور دیگر، راه استانداردی وجود ندارد.
نکته: اصطلاح strongly typed به معنی محدودیت شدید، و اصطلاح weakly typed (محدودیت ضعیف) به طور کلی اصطلاحات معنی داری نیستند. از این اصطلاحات استفاده می شود، اما به طور اشتباه. بهتر است که به جای استفاده از نوع استاتیک(statically typed)، از "تایپ چک استاتیک(type-checked)" استفاده کنیم.