-
Javascript
تاریخچه
جاوا اسکریپت را در ابتدا شخصی به نام Brendan Eich در شرکت Netscape با نام Mocha طراحی نمود. این نام بعدا به LiveScript و نهایتا به جاوا اسکریپت تغییر یافت. [۲] این تغییر نام تقریبا با افزوده شدن پشتیبانی از جاوا در مرورگر وب Netscape Navigator همزمانی دارد. اولین نسخهٔ جاوا اسکریپت در نسخه 2.0B3 این مرورگر در دسامبر 1995 معرفی و عرضه شد. این نام گذاری منجر به سردرگمی های زیادی شده و این ابهام را ایجاد میکند که جاوا اسکریپت با جاوا مرتبط است در حالی که این طور نیست. عدهٔ زیادی این کار را یک ترفند تجاری برای به دست آوردن بخشی از بازار جاوا که در آن موقع زبان جدید مطرح برای برنامه نویسی تحت وب بود میدانند. .
به دلیل موفقیت عمدهٔ جاوا اسکریپت در نقش زبان نویسه ای سمت کارخواه (client side scripting language) برای صفحات وب، مایکروسافت یک نسخه سازگار از این زبان را ایجاد کرد و به علت مشکلات حقوقی آن را Jscript نامید. این زبان در نسخه 3.0 از مرورگر Internet Explorer و در آگوست 1996 داده شد. تفاوت های این دو زبان به حدی جزیی است که اغلب Jscript و جاوا اسکریپت به جای هم به کار میروند. هرچند که مایکروسافت در اینجا چند ده دلیل برای تفاوت Jscript با استاندارد ECMA مطرح میکند.
Netscape جاوا اسکریپت را به سازمان Ecma International برای استاندارد سازی ارسال کرده است و نتیجه نسخهٔ استاندارد شدهای به نام ECMA Script است.
جاوا اسکریپت به یکی از پر طرفدار در وب تبدیل شده است. هر چند ابتدا بسیاری از برنامه نویسان حرفهای زبان را کم ارزش تلقی میکردند چون مخاطبین آن نویسندگان صفحات وب و آماتورهای این چنینی بودند[۶]. ظهور AJAX بار دیگر جاوا اسکریپت را در معرض توجه قرار داد و برنامه نویسان حرفهای بیشتری را به خود جذب نمود. نتیجه ازدیاد فریمورک و کتابخانههای جامعی در این زمینه، بهبود شیوههای رایج برنامه نویسی در جاوا اسکریپت و افزایش کاربرد جاوا اسکریپت خارج از وب است.
امکانات زبانی
امکانات زیر (در صورت قید نشدن) همگی مطابق استاندارد ECMA Script میباشند.
زبان امری و ساخت یافته
جاوا اسکریپت از تمامی نحو ساختاری زبان C پشتیبانی میکند. مانند گزاره (if و switch و حلقههای while و ...) یک مورد استثنا تعیین حوزهٔ متغییر هاست: تعریف حوزه در حد block در جاوا اسکریپت وجود ندارد. هر چند جاوا اسکریپت 1.7 با کلمهٔ کلیدی let این نوع حوزه دهی را امکان پذیر می سازد. مانند c در جاوا اسکریپت بین عبارت و گزاره تفاوت وجود دارد.
پویایی
تایپ دهی پویا
مانند اکثر زبان های نویسهای تایپ به مقدارها منسوب میگردد و نه به متغییرها. برای مثال متغییر x ممکن است به یک عدد وابسته سازی شود، و بعدا به یک رشته. جاوا اسکریپت برای تعیین تایپ شی راههای مختلفی از جمله تایپ دهی اردکی (duck typing) را دارد. [۷]
تایپ دهی ضعیف
زبان جاوا اسکریپت از نظر تایپ دهی ضعیف به شمار میآید و در آن نتیجهٔ عملیاتی مانند 5 + “37”، عبارت “537” خواهد بود. (عدد را با رشته جمع کرده است)
اشیا به دید آرایههای انتسابی
جاوا اس***پت تقریبا تماما بر اساس اشیا است. اشیا، آرایههای انتسابی به همراه یک «ساختار شماتیک» هستند. نام ویژگی اشیا، کلیدهای آرایه انتسابی هستند و درواقع obj.x = 10 با obj[“x”] = 10 هم ارز هستند و شیوه نگارش با نقطه صرفا یک سهولت نحوی است. ویژگی ها و مقدارهایشان در زمان اجرا قابلیت تغییر اضافه و حذف دارند. همچنین میتوان روی ویژگی های یک شی با ساختار for … in پیمایش کرد.
ارزیابی در زمان اجرا
جاوااسکریپا یک تابع eval دارد که قادر است گزارههای تولید شده در یک رشته در زمان اجرا را، اجرا کند.
تابعی بودن
تابعی بودن
توابع موجوداتی «درجه اول» محسوب میشوند، یعنی خود یک شی هستند. بنابراین میتوانند ویژگی داشته باشند، در آرگومان های تابع ها داده شوند و مانند هر شی دیگری با آن ها رفتار شود
توابع داخلی و بستارها
توابع داخلی (توابع تعریف شده داخل یک تابع دیگر) هر بار که تابع بیرونی فرا خوانده شود، ایجاد میشوند و متغییرهای توابع بیرونی تا زمانی که تابع داخلی وجود داشته باشد، وجود خواهند داشت، حتی پس از اتمام آن فراخوانی از تابع بیرونی. (مثال: اگر تابع داخلی به عنوان مقدار برگشتی تابع باشد، هنوز به متغییرهای تابع بیرونی دسترسی دارد) – این مکانیزم بستار گرفتن در جاوا اسکریپت است.
«ساختار شماتیک» محوری
ساختار شماتیک
جاوا اسکریپت به جای ردهها برای تعریف ویژگی های اشیا، که شامل متد ها و وراثت است از «ساختار شماتیک» استفاده میکند (prototype). امکان شبیه سازی بسیاری از امکانات رده-محور با ساختار های شماتیک جاوا اسکریپت امکان پذیر است.
توابع در نقش سازندهٔ اشیا
برای توابع علاوه بر نقش عادی، به عنوان سازنده ی اشیا هم عمل میکنند. آوردن یک new قبل فراخوانی تابع، آن را با کلمهٔ کلیدی this وابسته سازی شده به شی جدید اجرا میکند.ویژگی prototype از تابع مورد نظر، ساختار شماتیک شی جدید را مشخص میکند.
توابع در نقش متد
بر خلاف بیشتر زبان های شی گرا تفاوتی میان تعریف تابع و متد وجود ندارد. بلکه تفاوت در زمان فراخوانی تابع است، زمانی که یک تابع به عنوان متد یک شی فراخوانده میشود کلمهٔ کلیدی this محلی آن تابع به شی مورد نظر وابسته سازی میشود.
امکانات دیگر
امکانات دیگر
جاوا اسکریپت برای تامین اشیا و متدها که با آن ها تعامل کند به یک محیط اجرایی (مانند مرورگر وب) نیاز دارد تا بتواند به این ترتیب با دنیای خارج ارتباط برقرار کند. همچنین برای دسترسی به سایر نویسهها (include) هم به این محیط نیازمند است (مانند تگ <script>در HTML ) . (البته این یک ویژگی زبانی نیست اما در عمل اغلب این طور پیاده سازی شده است)
تعداد متغییر پارامتر (variadic)
تعداد نامعینی پارامتر را میتوان به یک تابع ارسال نمود. تابع میتواند هم از طریق پارامترهای رسمی و هم از طریق شی محلی arguments به آن ها دسترسی داشته باشد.
Literalهای آرایه و شی
مانند بسیاری از زبان های نویسهای آرایهها و اشیا (که در زبان های دیگر همان آرایههای انتسابی هستند) را میتوان با یک نحو موجز ایجاد و توصیف نمود. در واقع این شیوهٔ نگارش پایهٔ قالب دادهای JSON هم هست.
عبارات منظم
جاوا اسکریپت به شیوهای مشابه زبان پرل از عبارات منظم پشتیبانی میکند که نحوی قدرتمند و موجز را به شکلی فراتر از توابع پیش ساخته برای کار با رشته ها، فراهم میکند.
نظام تایپ دهی
انواع زیر جزو انواع دادههای قابل دسترس در زبان جاوا اسکریپت است. در استاندارد ECMA انواع دیگری هم تعریف شده که صرفا داخلی است و برای پیاده سازی است. [۸]
تعریف نشده: این تایپ فقط یک مقدار با نام undefined دارد و متعلق به تمام متغییرهای مقدار دهی نشده است
نوع تهی: نوع تهی هم فقط یک مقدار دارد با نام null
نوع دودویی: نمایندهٔ یک مقدار منطقی است و دو مقدار true و false را می پذیرد.
نوع رشته: در بر گیرندهٔ تمام رشتههای متناهی از 0 یا بیشتر عنصر 16 بیتی بدون علامت است. این عناصر با اندیس های نامنفی قابل دسترسی هستند. طول رشته تعداد عناصر داخل آن و طول رشتهٔ تهی برابر 0 است.
زمانی که رشته حاوی متن واقعی باشد هر عنصر به عنوان یک واحد UTF-16 در نظر گرفته میشود (مستقل از این که شیوهٔ واقعی نگه داری رشته چه باشد). تمام عملیات بر روی رشتهها آن ها را به عنوان اعداد صحیح بدون علامت در نظر میگیرند و تضمین کنندهٔ تولید رشته به حالت normalize شده نیست و تضمین های خاص زمانی هم ندارد. علت این تصمیم گیری سادگی در پیاده سازی ذکر شده است.
نوع عدد: نوع عدد در جاوا اسکریپت مطابق با استادارد IEEE برای اعداد شناور دودویی است (با اندکی تفاوت).
نوع شی: شی در جاوا اسکریپت یک مجموعه بدون ترتیب از ویژگی ها است. هر ویژگی میتواند داخلی، فقط-خواندنی، غیر قابل حذف، و غیر قابل پیمایش باشد (یا ترکیبی از این ها یا هیچ کدام)
تبدیلات خودکار
این زبان دارای تبدیلات خود کار بین این انواع دادهای است.
زمانی که بخواهد یک if را ارزیابی کند یا از عملگرهای منطقی ! و && و || استفاده شود، تبدیل به نوع دودویی را انجام میدهد. مقادیر 0 و 0- وNaN به false و سایر مقادیر عددی به true نگاشت میگردد. همچنین رشتهٔ تهی false و سایر رشتهها true در نظر گرفته میشود. انواع شی و تابع true و undefined و null هم false در نظر گرفته میشود.
زمانی که یکی از عملوند های عملگر + رشته باشد، تبدیل به رشته صورت میگیرد، مانند 5 + “37” که میشود “537”
عملگرهای دیگری عددی (جز جمع) منجر به تبدیل به عدد میگردد مانند 3 – “57” که مقدار عددی 34- را به دست میدهد.
مثال
چند برنامه ساده به جاوا اسکریپت
برنامههای ورودی و خروجی در مرورگر وب:
<script type="text/javascript">
alert ("Hello world");
var x = prompt("Enter Name:", "Default name");
alert ( "Hello, " + x )
</script>
برای استفاده ساده از عناصر HTML و DOM:
<script type="text/javascript">
document.write("Hello world");
function handle() {
document.write("You entered: " + document.getElementById("myinput").value );
}
</script>
<form>
<input type="text" id="myinput"/>
<input type="button" onclick="handle()" value="Click here" />
</form>
برنامه sort:
<script type="text/javascript">
var myarray = [1,5,8,2,3,0,2,9,11];
var i = 0;
var j = 0;
for (i = 0; i < myarray.length ; ++i )
{
for (j = 0; j < myarray.length; ++j)
{
if (myarray[i] < myarray[j])
{
var tmp = myarray[i];
myarray[i] = myarray[j];
myarray[j] = tmp;
}
}
}
for (i = 0; i < myarray.length; ++i)
{
document.write (myarray[i] + " " );
}
</script>
برنامه swap:
<script type="text/javascript">
var a = 10, b = 40;
[a,b] = [b,a]
alert("" + a + " " + b);
</script>
برنامه factorial:
<script type="text/javascript">
function factorial(x) {
if (x > 0)
return x * factorial(x-1);
return 1;
}
alert(factorial(5));
</script>
منبع: ویکی پدیا