خلاصهای از نسخههای مختلف اکمااسکریپت در جاوااسکریپت
۱۴۰۳/۴/۲۵اکمااسکریپت (ECMAScript) استاندارد اصلی جاوااسکریپت است که به عنوان پایهای برای توسعه ویژگیهای جدید و بهبود قابلیتهای این زبان برنامهنویسی عمل میکند. هر نسخه از این استاندارد با ویژگیها و بهبودهای جدیدی منتشر میشود که به برنامهنویسان کمک میکند تا کدهای خود را به روزتر، امنتر و قدرتمندتر بنویسند. این مقاله، ترجمهای از مقالهای در Web Reference است و در آن به صورت مختصر به بررسی تحولات اصلی و ویژگیهای کلیدی در نسخههای مختلف اکمااسکریپت خواهیم پرداخت و روند تکامل این استاندارد را مرور خواهیم کرد.
به عنوان یک زبان برنامه نویسی، جاوااسکریپت به طور گسترده در ساخت رابط های کاربری تعاملی و پویا استفاده میشه. جاوااسکریپتی که در سال ۱۹۹۵ توسط برندان آیک تحت عنوان موکا خلق شد و بعد از آن LiveScript و در نهایت به جاوااسکریپت تغییر نام داد.
استاندارد ECMAScript توسط Ecma International که سازمانی مستقر در سوئیس است، توسعه یافته و نگهداری میشود و به طور رسمی به عنوان ECMA-262 شناخته میشود. این استاندارد به عنوان اساس و پایهی جاوااسکریپت عمل میکند و نسخههای آن به طور مستقیم بر توسعه و تکامل این زبان تأثیر میگذارند. در این مقاله به بررسی کل ی تکامل اکمااسکریپت میپردازیم و به برخی از بروزرسانیهای کلیدی در هر نسخهی آن اشاره خواهیم کرد.
ECMAScript 1 (1997)
اکمااسکریپت ۱ که به عنوان ES1 هم شناخته میشود، اولین نسخه از استاندارد اکمااسکریپت است که در سال ۱۹۹۷ (۱۳۷۶ شمسی) منتشر شد. این نسخه برپایهی زبان جاوااسکریپت و ویژگیهایی چون متغیرها، توابع و دستورات کنترل جریان برنامه (همون if و else) بود.
// Example of a variable in ES1
var name = 'John Doe'
console.log(name) // Output: "John Doe"
// Example of a function in ES1
function add(a, b) {
return a + b
}
console.log(add(1, 2)) // Output: 3
ECMAScript 2 (1998)
اکمااسکریپت ۲ یا همون ES2 دومین نسخه از استاندارد اکمااسکریپت بود که در سال ۱۹۹۸ منتشر شد. این نسخه یک سری تغییرات جزئی روی زبان داشت و عمدتاً بر روی سازگارترکردن استاندارد تمرکز داشت.
ECMAScript 3 (1999)
اکمااسکریپت ۳ یا همون ES3 هم سومین نسخه از استاندارد اکما بود که در سال ۱۹۹۹ منتشر شد و چندین ویژگی مهم مثل عبارات منظم (regex) و ساختار try-catch را به زبان اضافه کرد و مدیریت stringها را بهبود بخشید.
// Example of regular expressions in ES3
var text = 'Hello, World!'
var regex = /Hello/
console.log(regex.test(text)) // Output: true
// Example of try-catch statement in ES3
try {
var x = y + 1
} catch (error) {
console.log(error) // Output: ReferenceError: y is not defined
}
ECMAScript 4 (هیچوقت منتشر نشد)
اکمااسکریپت ۴ نسخهای بود که به عنوان نسخهی چهارم اکمااسکریپت برنامهریزی شده بود ولی هیچ وقت منتشر نشد. این نسخه قرار بود تغییرات قابل توجهی در زبان ایجاد بکنه. تغییراتی شامل کلاسها، interfaceها و namespaceها. با این حال این پروپوزالها با مخالفتهای قابل توجهی روبرو شد و در نهایت توسعه این نسخه کنار گذاشته شد.
ECMAScript 5 (2009)
اکمااسکریپت ۵ یا همان ES5 پنجمین نسخه از استاندارد اکما بود که در سال ۲۰۰۹ منتشر شد. این نسخه چندین ویژگی مهم شامل حالت strict mode و پشتیبانی از JSON را معرفی کرد و کار با آرایهها را هم بهبود بخشید.
// Example of strict mode in ES5
function add(a, b) {
'use strict'
return a + b
}
console.log(add(1, 2)) // Output: 3
// Example of JSON support in ES5
var jsonText = '{"name":"John Doe","age":30}'
var jsonData = JSON.parse(jsonText)
console.log(jsonData.name) // Output: "John Doe"
// Example of improved array manipulation in ES5
var numbers = [1, 2, 3, 4, 5]
console.log(numbers.indexOf(3)) // Output: 2
console.log(
numbers.map(function (number) {
return number * 2
})
) // Output: [2, 4, 6, 8, 10]
ECMAScript 5.1 (2011)
اکمااسکریپت ۵.۱ که به عنوان ES5.1 هم شناخته میشود در واقع یک بروزرسانی برای ES5 بود که در سال ۲۰۱۱ منتشر شد. این نسخه بیشتر بر روی سازگاری بیشتر استاندارد و تصحیح خطاها تمرکز کرده بود.
ECMAScript 6 (2015)
اکمااسکریپت ۶ یا همان ES6 ششمین نسخه از استاندارد اکمااسکریپت بود که در سال ۲۰۱۵ منتشر شد. این نسخه چندین ویژگی بسیار مهم مانند let و const و arrow functionها، template literalها و کلاسها را معرفی کرد. ویژگیهای دیگری مانند Map و Set، حالت Destructuring و... مواردی بودن که باعث شدن جاوااسکریپت به یک زبان بسیار جدی در دنیای تکنولوژی تبدیل بشه.
// Example of let and const in ES6
let name = 'John Doe'
const age = 30
// Example of arrow function in ES6
let add = (a, b) => a + b
console.log(add(1, 2)) // Output: 3
// Example of template literals in ES6
let message = `Hello, ${name}!`
console.log(message) // Output: "Hello, John Doe!"
// Example of class in ES6
class Person {
constructor(name, age) {
this.name = name
this.age = age
}
greet() {
return `Hello, ${this.name}!`
}
}
let john = new Person('John Doe', 30)
console.log(john.greet()) // Output: "Hello, John Doe!"
ECMAScript 2016 (ES7)
اکمااسکریپت ۲۰۱۶ که به عنوان ES7 هم شناخته میشه، هفتمین نسخه از اکما بود که در سال ۲۰۱۶ منتشر شد. این نسخه دو ویژگی اصلی را معرفی کرد: عملگر توان و Array.prototype.includes()
// Example of exponentiation operator in ES7
let square = 2 ** 2
console.log(square) // Output: 4
// Example of Array.prototype.includes in ES7
let numbers = [1, 2, 3, 4, 5]
console.log(numbers.includes(3)) // Output: true
ECMAScript 2017 (ES8)
اکمااسکریپت ۲۰۱۷ یا همان ES8، هشتمین نسخهی این استاندارد بود که در سال ۲۰۱۷ منتشر شد و چندین ویژگی مهم شامل async/await
، Object.values()
، Object.entries()
و string padding را معرفی کرد. کد زیر مثالی از ویژگیهای این نسخه است:
// Example of async/await in ES8
async function fetchData() {
let response = await fetch('https://api.example.com/data')
let data = await response.json()
return data
}
// Example of Object.values() and Object.entries() in ES8
let person = { name: 'John Doe', age: 30 }
console.log(Object.values(person)) // Output: ["John Doe", 30]
console.log(Object.entries(person)) // Output: [["name", "John Doe"], ["age", 30]]
// Example of string padding in ES8
let text = 'Hello'
console.log(text.padStart(10, '-')) // Output: "-----Hello"
console.log(text.padEnd(10, '-')) // Output: "Hello-----"
ECMAScript 2018 (ES9)
اکمااسکریپت ۲۰۱۸ یا همان ES9 بروزرسانی قابل توجهی روی زبان بوجود آورد. ویژگیهایی مانند تکرار بصورت غیرهمزمان (asynchronous)، عملگرهای کاربردی rest و spread و همچنین تابع Promise.prototype.finally()
از مواردی بود که در این نسخه به جاوااسکریپت اضافه شد.
// Example of asynchronous iteration in ES9
async function asyncIterable() {
let iterable = {
[Symbol.asyncIterator]() {
let i = 0
return {
next() {
if (i < 3) {
return Promise.resolve({ value: i++, done: false })
}
return Promise.resolve({ done: true })
},
}
},
}
for await (let value of iterable) {
console.log(value) // Output: 0, 1, 2
}
}
// Example of Promise.prototype.finally() in ES9
fetch('https://api.example.com/data')
.then((data) => console.log(data))
.catch((error) => console.log(error))
.finally(() => console.log('Finished!'))
// Example of rest/spread operators in ES9
let person = { name: 'John Doe', age: 30, country: 'USA' }
let { name, ...rest } = person
console.log(name) // Output: "John Doe"
console.log(rest) // Output: { age: 30, country: "USA" }
ECMAScript 2019 (ES10)
اکمااسکریپت ۲۰۱۹ یا همان ES10، ویژگیهایی مانند متدهای Array.prototype.flat(), Array.prototype.flatMap()
و همچنین Object.fromEntries()
را معرفی کرد.
// Example of Array.prototype.flat() and Array.prototype.flatMap() in ES10
let array = [1, 2, [3, 4]]
console.log(array.flat()) // Output: [1, 2, 3, 4]
let numbers = [1, 2, 3, 4]
console.log(numbers.flatMap((x) => [x, x * 2])) // Output: [1, 2, 2, 4, 3, 6, 4, 8]
// Example of Object.fromEntries() in ES10
let entries = [
['name', 'John Doe'],
['age', 30],
]
console.log(Object.fromEntries(entries)) // Output: { name: "John Doe", age: 30 }
ECMAScript 2020 (ES11)
اکمااسکریپت ۲۰۲۰ یا ES11 با ویژگیهایی مانند BigInt برای نوع اعداد integer طولانی، متد Promise.allSettled()
، عملگر Nullish Coalescing یا همان (??) و البته عملگر بررسی زنجیرهکردن اختیاری یا همان (?.) منتشر شد.
// Example of globalThis in ES11
console.log(globalThis) // Output: Window {...}
// Example of private fields in ES11
class Person {
#name = 'John Doe'
#age = 30
getName() {
return this.#name
}
getAge() {
return this.#age
}
}
let person = new Person()
console.log(person.getName()) // Output: "John Doe"
console.log(person.getAge()) // Output: 30
// Example of nullish coalescing in ES11
let value = null
console.log(value ?? 'default') // Output: "default"
ECMAScript 2021 (ES12)
اکمااسکریپت ۲۰۲۱ که به عنوان ES12 هم شناخته میشود، مانند نسخههای قبلی چندین ویژگی جدید را در زبان جاوااسکریپت معرفی کرد. ویژگیهای مانند عملگرهای انتساب منطقی اضافهکننده، جداکنندههای عددی و متدهای Promise.any()
و String.prototype.replaceAll()
.
// Example of Logical Assignment Operators in ES12
let a = 0,
b = 1
a &&= b
console.log(a) // Output: 0
a ||= b
console.log(a) // Output: 1
a &&= b
console.log(a) // Output: 1
// Example of Numeric Separators in ES12
let billion = 1_000_000_000 // This is equivalent to let billion = 1000000000;
console.log(billion) // Output: 1000000000
// Example of Promise.any() in ES12
let promises = [Promise.reject('1'), Promise.resolve('2'), Promise.reject('3')]
Promise.any(promises)
.then((value) => console.log(value)) // Output: "2"
.catch((error) => console.log(error))
// Example of String.prototype.replaceAll() in ES12
let string = 'foo foo foo'
console.log(string.replaceAll('foo', 'bar')) // Output: "bar bar bar"
ECMAScript 2022 (ES13)
اکمااسکریپت ۲۰۲۲ یا ES13، سیزدهمین نگارش از استاندارد اکمااسکریپت است که ویژگیهای مهمی را معرفی کرد:
- امکان استفاده از await در سطح بالا، به گونهای که استفاده از این کلمه کلیدی را خارج از یک تابع async ممکن ساخت
- عناصر جدید در کلاس: فیلدهای private و public برای instance، فیلدهای static از نوع private و public، نمونه و متدها و دسترسیدهندههای نمونه خصوصی، و متدها و دسترسیدهندههای استاتیک خصوصی
- امکان استفاده از بلوکهای استاتیک داخل کلاسها، که اجازه میدهد تا ارزیابی و مقداردهی اولیه بر اساس هر کلاس انجام شود
- سینتکس
#x in obj
که به شما اجازه میدهد وجود فیلدهای خصوصی در اشیا را تست کنید - شاخصهای تطابق عبارت منظم از طریق فلگ /d، که شاخصهای شروع و پایان برای زیررشتههای تطابقیافته را فراهم میکند
- ویژگی cause در اشیای Error، که میتواند برای ثبت زنجیره علل در خطاها استفاده شود
- متد at برای Strings، Arrays، و TypedArrays، که امکان ایندکسدهی نسبی را فراهم میکند
Object.hasOwn
، یک جایگزین راحت برایObject.prototype.hasOwnPropert
ECMAScript 2023 (ES14)
چهاردهمین نسخه از استاندارد اکمااسکریپت، اکمااسکریپت ۲۰۲۳ هست که چندین متد جدید بر روی Array.prototype و TypedArray.prototype اضافه کرد که شامل موارد مانند toSorted, toReversed, with, findLast, و findLastIndex میباشد.
این نسخه پشتیبانی از کامنتهای "#!" در ابتدای فایلها را آغاز کرد و مسیر را برای فایلهای ECMAScript قابل اجرا به طور مستقیم هموار کرد. بعلاوه، این ویژگی امکان استفاده از بیشتر Symbolها به عنوان کلید را در مجموعههای ضعیف مجاز ساخت. این ویژگیهای جدید به طور بالقوه به توسعهدهندگان بهبودهایی در چندین زمینه مانند مدیریت آرایهها، استفاده از نمادها در نقشههای ضعیف، قابلیت اجرای اسکریپتها، و برنامهنویسی تابعی با تأکید بیشتر بر تغییرناپذیری (immutability) ارائه میدهد.
مروری سریع از این ویژگیها:
جستجوی معکوس در آرایهها: متدهای findLast()
و findLastIndex()
به prototypes آرایه و TypedArray اضافه شدند. این متدها که مشابه find()
و findIndex()
هستند، به صورت معکوس عمل میکنند و رویکردی ساده برای جستجوی یک آرایه از انتها بدون نیاز به کپی موقت آرایه یا محاسبات پیچیده ایندکسها ارائه میدهند.
استفاده انعطافپذیر از کلید در WeakMapها: این بروزرسانی اجازه میدهد تا نمادهای غیرثبتشده به عنوان کلید در WeakMap استفاده شوند و گزینههای بیشتری برای توسعهدهندگان فراهم می آورد تا از symbolها به عنوان شناساییکنندههای منحصر به فرد برای ذخیرهسازی و بازیابی دادهها استفاده کنند.
پشتیبانی از اسکریپتهای قابل اجرا: استانداردسازی hashbangs (یا shebangs) در اسکریپتهای قابل اجرا اکنون به فایلهای ECMAScript این امکان را میدهد که مستقیماً از خط فرمان اجرا شوند، که ممکن است قابلیت حمل اسکریپتها را در سیستمعاملهای مختلف بهبود بخشد.
عملیات آرایههای تغییرناپذیر: معادلهای جدید متدهای reverse()
، sort()
، و splice()
در Array.prototype
که یک کپی جدید از آرایه را باز میگردانند به جای تغییر آرایه اصلی. با متد with()
, این ویژگی از سبک برنامهنویسی تابعی که معمولاً بر تغییرناپذیری دادهها تأکید دارد، پشتیبانی میکند. در زیر، میتوانید نمونههایی ز برخی از این متدها را مشاهده کنید:
- متد
toSorted()
مشابهsort()
است، اما یک آرایه جدید مرتب شده را باز میگرداند و آرایه اصلی را بدون تغییر باقی میگذارد.
let arr = [3, 1, 2]
let sortedArr = arr.toSorted()
console.log(sortedArr) // Output: [1, 2, 3]
console.log(arr) // Output: [3, 1, 2]
- متد
with()
این اجازه را میدهد که یک عنصر تنها را بر اساس ایندکس آن مدیریت کرد و یک آرایه جدید برگرداند.
let arr2 = ['apple', 'banana', 'cherry']
let newArr2 = arr2.with(1, 'blueberry')
console.log(newArr2) // Output: ['apple', 'blueberry', 'cherry']
console.log(arr2) // Output: ['apple', 'banana', 'cherry']
درک اصول اکمااسکریپت
توسعهی اکمااسکریپت تحت نظارت کمیته Ecma TC39، از یک پروسه ساختاریافته پیروی میکند تا پیشنهادات جدید از ایدههای اولیه به ویژگیهای کاملاً مشخصشده، تست شده و پیادهسازیشده تکامل یابند. پیشنهادات از مرحله ابتدایی (Strawperson) عبور میکنند و به stageهای پیشنویس، نامزدی و نهایی شدن میرسند. حامیان، پیشنهادات را در این استیجها هدایت میکنند و پیشرفت این استیجها نیازمند توافق کمیته است.
این فرآیند شفاف است و فرصتهایی را برای دریافت نظرات از هر دو طرف کمیته و جامعه فراهم میآورد و در نهایت به ادغام پیشنهادات نهاییشده در نسخههای جدید استاندارد ECMAScript منجر میشود.
نتیجهگیری
همونطور که دیدیم، توسعه مشخصات جدید شامل فرآیند دقیق تست و اعتبارسنجی است تا دقت، امکانپذیری و سازگاری آنها با برنامههای وب موجود اطمینان حاصل شود. هر پیشرفت، مانند آنچه در ECMAScript 2023 (ES14) دیده میشود، نقشی در شکلگیری چشمانداز JavaScript ایفا میکند و آن را در برابر تقاضاهای دیجیتال متغیر، قویتر و پویاتر میسازد.