مهارت های اصولی جاوا اسکریپت را بیاموزید و توسعه دهنده بهتری شوید

جاوا اسکریپت دارای مقادیر اولیه، شیء ها و توابع است. همه آنها دارای مقدار هستند. همه آنها مثل اشیا عمل می کنند، حتی مقادیر اولیه.

مقادیر اولیه

اعداد، بولی ها، مقادیر تعریف نشده و تهی، همه مقادیر اولیه هستند.

اعداد

فقط یک نوع عدد در جاوا اسکریپت وجود دارد، عدد اعشاری با دقع دوبرابر. محاشبه اعداد اعشاری دقیق نیست.

همانطور که می دانید، ۰.۱ + ۰.۲ برابر با ۰.۳ نیست. اما درمورد محاسبه عدد صحیح دقیقا برابر است با ۱+۲ === ۳

اعداد، متدها را از شیء Number.prototype می گیرند. متدها می توانند اعداد را فراخوانند:

(۱۲۳).toString();  //"123"
(۱.۲۳).toFixed(1); //"1.2"

توابعی برای تبدیل رشته ها به اعداد وجود دارد: parseInt(), parseFloat()and Number():

Number.parseInt("1")       //1
Number.parseInt("text")    //NaN
Number.parseFloat("1.234") //1.234
Number("1")                //1
Number("1.234")            //1.234

عملیات حسابی نامعتبر یا تبدیل ها نامعتبر یک استثنا را پر نمی کند اما در مقدار NaN نتیجه خواهد داد (غیر عددی). . isNaN() می تواند NaN را کشف و نمایان کند.

عملگر + می تواند اضافه کند یا اتصال ایجاد کند.

۱ + ۱      //۲
"۱" + "۱"  //"۱۱"
۱ + "۱"    //"۱۱"

رشته

یک رشته یک سری از کاراکترهای کدگذاری شده را ذخیره می کند. متن می تواند داخل علامت “” یا ” قرار گیرد.

رشته ها از String.prototype جانشین متدها می شوند. متدهایی مثل substring(), indexOf() and concat()

"text".substring(1,3) //"ex"
"text".indexOf('x')   //2
"text".concat(" end") //"text end"

رشته ها مثل تمام مقادیر اولیه، تغییر ناپذیر هستند. به عنوان مثال concat() رشته موجود را تغییر نمی دهد اما رشته جدیدی ایجاد می کند.

Boolean

یک boolean دو مقدار دارد: true  و false

زبان مقدار های درست و نادرست دارد. false, null, undefined, ”(empty string), 0  و  NaNنادرست هستند. بقیه مقادیر شامل همه شیء ها درست هستند.

وقتی مقدار صحیح درمفهوم یک boolean اجرا می شود به مقدار true ارزیابی می شود. مقدار نادرست هم بصورت false  ارزیابی می شود. به مثال زیر توجه کنید:

let text = '';
if(text) {
  console.log("This is true");
} else {
  console.log("This is false");
}

عملگر مساوی برابر است با  === و عملگر نامساوی برابر است با !==.

متغیرها

متغیرها می توانند با استفاده از var, let  و  const تعریف شوند.

Var یک متغیر را شناسایی و بطور انتخابی ارزش گذاری می کند. متغیرهایی که توسط var شناسایی شده اند، یک تابع هدف (معین) دارند و مانند متغیر شناسایی شده در بالای تابع رفتار می کنند. این متغیرها را بالابر می نامند (hoisting).

اعلان let یک بلوک معین دارد.

مقدار متغیری که ارزش گذاری نشده undefined است.

متغیری که با const اعلان و شناسایی شده نمی تواند مجددا بازگرانده شود. هرچند که مقدار آن تغییرپذیر باشد. const متغییر را ثابت می کند و Object.freeze() شیء را.

اعلان const یک بلوک معین دارد.

اشیا

یک شیء مجموعه ای پویا از جفت های key-value است. کلید مشخصه یک رشته منحصر به فرد است. وقتی یک غیررشته به عنوان کلید مشخصه استفاده شود، به رشته تبدیل می شود. مقدار مشخصه می تواند یک مقدار اولیه، شیء یا تابع باشد.

ساده ترین روش ایجاد یک شیء استفاده از یک شیء حرفی است:

let obj = {
  message : "A message",
  doSomething : function() {}
}

برای دستیابی به ویژگی ها دو راه وجود دارد: نشانه نقطه و کروشه.

می توانیم مشخصات شیء را در هرزمان بخوانیم، اضافه، حذف یا ویرایش کنیم:

گرفتن: object.name, object[expression]

تنظیم: object.name = value, object[expression] = value

حذف: delete object.name, delete object[expression]

let obj = {}; //create empty object
obj.message = "A message"; //add property
obj.message = "A new message"; //edit property
delete obj.message; //delete property

شیء ها می تواند به عنوان نقشه استفاده شوند. یک نقشه ساده می تواند با استفاده ازObject.create(null)  ایجاد شود:

let french = Object.create(null);
french["yes"] = "oui";
french["no"]  = "non";
french["yes"];//"oui"

تمام مشخصات شیء عمومی هستند. Object.keys() می تواند برای تکرار همه مشخصات استفاده شود.

function logProperty(name){
  console.log(name); //property name
  console.log(obj[name]); //property value
}
Object.keys(obj).forEach(logProperty);

Object.assign() تمام ویژگی ها را از یک شیء یه شیء ای دیگر کپی می کند. یک شیء می تواند از طریق کپی تمام ویژگی ها آن در یک شیء خالی، همانندسازی شود.

let book = { title: "The good parts" };
let clone = Object.assign({}, book);

یک شیء تغییرناپذیر شیء ای است که بعد از ایجاد هیچ تغییری نمی کند. اگر میخواهید شیء تغییر ناپذیر ایجاد کنید از Object.freeze()  استفاده کنید.

مقدار اولیه در برابر شیء

مقادیر اولیه مثل اشیاء عمل می کنند (به جز null  و  undefined)، به این معنی که متدها را دارند اما شیء نیستند.

اعداد، رشته ها و بولی ها دارای پوشش معادل هستند. اینها توابع Number، String  و  Boolean هستند.

برای اجازه دستیابی به ویژگی ها در مقدار اولیه، جاوا اسکریپت یک شیء پوششی ایجاد و سپس آن را از بین می برد. فرایند ایجاد و از بین برندن این شیء توسط موتور جاوا اسکریپت بهینه سازی می شود.

مقدار اولیه تغییر ناپذیر است و شیء تغییر پذیر.

آرایه

جاوا اسکریپت دارای شیء های array-like است. یک آرایه با استفاده از یک شیء اجرا می شود. عناصر با استفاده از شاخص های خود قابل دسترسی هستند. شاخص ها به رشته تبدیل شده و به عنوان نام هایی برای بازیابی مقدار استفاده می شوند. در مثال بعد arr[1] مقداری همانند arr[‘1’] : arr[1] === arr[‘1’] ارئه می دهد.

یک آرایه ساده مثل let arr = [‘A’, ‘B’, ‘C’] با استفاده از شیء مانند مثال زیر اجرا می شود:

{
  '۰': 'A',
  '۱': 'B',
  '۲': 'C'
}

با حذف آرایه توسط delete جای آن خالی می ماند، برای رفع این مشکل می توان از splice() استفاده کرد. اما ممکن است سرعت آن کم باشد.

let arr = ['A', 'B', 'C'];
delete arr[1];
console.log(arr); // ['A', empty, 'C']
console.log(arr.length); // 3

آرایه های جاوا اسکریپت شاخص را از محدوده مورد انتظار بیرون نمی برد. اگر شاخص در دسترس نباشد، undefined را باز میگرداند.

پشته و صف به راحتی می تواند با استفاده از متدهای آرایه اجرا شوند:

let stack = [];
stack.push(1);           // [1]
stack.push(2);           // [1, 2]
let last = stack.pop();  // [1]
console.log(last);       // 2
let queue = [];
queue.push(1);           // [1]
queue.push(2);           // [1, 2]
let first = queue.shift();//[2]
console.log(first);      // 1

توابع

توابع واحد های مستقل از رفتار هستند. توابع شیء هستند. توابع می توانند به متغیرها ارجاع داده شوند، در شیء ها یا آرایه ها ذخیره شوند، به عنوان یک استدلال به توابع دیگر منتقل شوند، و از توابع بازگردانده شوند.

برای تعریف یک تابه سه راه وجود دارد:

  • معرفی تابع (دستور العمل تابع)
  • عبارت تابع (معنی تابع)
  • تابع بردار

معرفی تابع

  • function اولین کلمه کلیدی در صف است.
  • باید یک نام داشته باشد.
  • باید قبل از تعریف استفاده شود. معرفی تابع حرکت می کند یا بالای پشته خود قرار می گیرد.
function doSomething(){}

عبارت تابع

  • function اولین کلمه کلیدی صف نیست.
  • نام آن اختیاری است. می تواند یک عبارت تابع بدون نام باشد، یا یک عبارت تابعی که نامگذاری شده.
  • نیاز به تعرف دارد، سپس می تواند اجرا شود.
  • بعد از تعریف بصورت خودکار می تواند اجرا شود (با نام IIFE عبارت تابع را بلافاصله فرا می خواند)
let doSomething = function() {}

تابع بردار

arrow function ترکیب جالبی است برای ایجاد یک عبارت تابع بدون نام.

let doSomething = () => {};

تابع بردار this و arguments متعلق به خود را ندارد.

احضار تابع

یک تابع با کلمه کلیدی function تعریف می شود و به روش های مختلف می تواند فراخوانده شود:

  • فرم تابع
doSomething(arguments)
  • فرم متد
theObject.doSomething(arguments)
theObject["doSomething"](arguments)
  • فرم سازنده
new Constructor(arguments)
  • فرم اجرا
doSomething.apply(theObject, [arguments])
 doSomething.call(theObject, arguments)

توابع می توانند نسبت به شناسایی در تعریف تابع، توسط استدلال های بیشتر و یا محدود فراخوانده شوند. استدلال های اضافی پذیرفته نمی شوند و پارامترهای حذف شده با undefined تنظیم می شوند.

توابع (به جز توابع arrow) دارای دو شبه-پارامتر هستند: this و arguments

This

متدها توابعی هستند که در شیء ها ذخیره شده اند. توابع مستقل هستند. برای اینکه تابع بداند روی کدام شیء نفوذ کند this استفاده می شود. this مفهوم تابع را نمایش می دهد.

وقتی تابع توسط فرم تابع فراخوانده می شود امکان استفاده از this وجود ندارد: doSomething() . در چنین موقعیتی this  یا undefined است یا شیء window .بستگی دارد حالت strict فعال باشد یا نه.

وقتی تابع همراه متد از theObject.doSomething()  فراخوانده می شود، this شیء را نمایش می دهد.

وقتی تابع به عنوان سازنده new DoSomething(),  استفاده می شود، this شیء ای که اخیرا ایجاد شده را نمایش می دهد.

اما، مقدارthis با apply()  ، call()  و bind() تنظیم می شود. به عنوان مثال تابعی مثل doSomething.call(theObject) فراخوانده می شود، سپس this شیء ای است که به عنوان اولین پارامتر به متد call()  فرستاده می شود.

مقدار call() بستگی به این دارد که تابع چطور فراخوانده شود، نه اینکه کجا تعریف شود. البته این منبع گیج کننده ای است.

Arguments

شبه-پارامتر arguments تمام استدلال های استفاده شده در invocation را ارائه می دهد. این یک شیء شبه آرایه است اما آرایه نیست. متد آرایه را کم دارد.

function log(message){
  console.log(message);
}
function logAll(){
  let args = Array.prototype.slice.call(arguments);
  return args.forEach(log);
}
logAll("msg1", "msg2", "msg3");

یک alternative، دستورالعمل پارامترهای جدید باقیمانده است. اینبار args یک شیء آرایه است.

function logAll(...args){
  return args.forEach(log);
}

Return

یک تابع بدون دستور return ، undefined را باز می گرداند. هنگام استفاده از به واد کردن semi-colon خودکار توجه داشته باشید. تابع زیر یک شیء خالی را باز نمی گرداند، در عوض undefined را باز می گرداند.

function getObject(){ 
  return 
  {
  }
}
getObject()

برای اجتناب از موضوع در خط  return  از { استفاده کنید.

Dynamic Typing

جاوا اسکریپت دارای Dynamic Typing است. مقدارها دارای تایپ هستند، اما متغیرها نه. تایپ می تواند در زمان اجرا تغییر کند.

function log(value){
  console.log(value);
}
log(1);
log("text");
log({message : "text"});

عملگر typeof() می تواند نوع یک متغیر را بررسی کند.

let n = 1;
typeof(n);   //number
let s = "text";
typeof(s);   //string
let fn = function() {};
typeof(fn);  //function

Single Thread

زمان اجرای اصلی جاوا اسکریپت بصورت تک ریسمان است. بدین معنی که دو تابع نمی تواند در یک زمان اجرا شود. یک زمان اجرا حاوی یک صف رویداد است که لیستی از پیام ها را برای پردازش ذخیره کرده. هیچ وضعیت ناهماهنگ و وقفه ای وجود ندارد. اما در Event Queue نیاز به اجرای سریع است. درغیر این صورت مرورگر بدون احتیاط درخواست حذف وظیفه را می دهد.

استثناها

جاوا اسکریپت دارای مکانیزم کنترل استثنا است. با پوشش دادن کد با استفاده از دستور try/catch  کار می کند. دستور دارای تک بلوک catch است که تمام استثناها را کنترل می کند.

بهتر است بدانید که جاوا اسکریپت گاهی خطاهای ساکن را ترجیح می دهد. کد زیر، وقتی برای تغییر یک شیء ثابت تلاش می کنیم، استثنا به جا نمی گذارد.

let obj = Object.freeze({});
obj.message = "text";

حالت Strict بعضی خطاهای ساکن جاوا اسکریپت را حذف می کند. use strict  حالت Strict را فعال می کند.

الگو های Prototype

Object.create()  ، تابع سازنده و class اشیا را روی سیستم نمونه اولیه می سازند.

به مثال زیر توجه کنید:

let servicePrototype = {
 doSomething : function() {}
}
let service = Object.create(servicePrototype);
console.log(service.__proto__ === servicePrototype); //true

Object.create()  یک  شیء جدید service  می سازد که دارای شیء servicePrototype به عنوان نمونه اولیه خود است. به این معنی که doSomething() در شیء service قابل دسترس است. همچنین یعنی ویژگی __proto__  در service به شیء servicePrototype اشاره دارد.

حالا با استفاده از class  شیء ای مشابه می سازیم:

class Service {
  doSomething(){}
}
let service = new Service();
console.log(service.__proto__ === Service.prototype);

تمام متدهای تعریف شده در کلاس Service به شیء اضافه می شوند. نمونه های کلاس Service نمونه اولیه ای مشابه شیء (Service.prototype)  خواهد داشت. تمام نمونه ها متد را مامور فراخوانی کلاس ها به شیء Service.prototype  خواهند کرد. متدها یک بار در Service.prototype تعریف می شوند، سپس توسط نمونه ها جایگزین می شوند.

حلقه Prototype

اشیا جانشین اشیا دیگر می شوند. هر شیء نمونه اولیه ای دارد و ویژگی های خود را از آن میگیرد. نمونه اولیه از طریق ویژگی پنهان  __proto__ قابل دسترس است.

وقتی شما ویژگی ای را درخواست می کنید که در شیء وجود ندارد، جاوا اسکریپت حلقه نمونه اولیه را یا تا پیدا کردن ویژگی و یا رسیدن به پایان حلقه پایین می آورد.

الگوهای تابعی

جاوا اسکریپت دارای توابع کلاس یک و بستارها است. اینها مفاهیمی است که راه برنامه نویسی تابعی در جاوا اسکریپت را باز می کند. در نتیجه توابع مراتب بالاتر امکانپذیر می شود.

filter(), map(), reduce()  جعبه ابزار اساسی برای کار با آرایه ها به روش تابع هستند.

filter()  مقادیر را از لیستی بر اساس تابع پیشفرضی انتخاب می کند، که تصمیم می گیرد چه مقداری باید حفظ شود

map()  با استفاده از یک تابع mapping لیستی از مقادیر را به لیست دیگری از آنها تبدیل می کند.

let numbers = [1,2,3,4,5,6];
function isEven(number){
  return number % 2 === 0;
}
function doubleNumber(x){
  return x*2;
}
let evenNumbers = numbers.filter(isEven);
//۲ ۴ ۶
let doubleNumbers = numbers.map(doubleNumber);
//۲ ۴ ۶ ۸ ۱۰ ۱۲

reduce() لیست مقادیر را به یک مقدار کاهش می دهد.

function addNumber(total, value){
  return total + value;
}
function sum(...args){
  return args.reduce(addNumber, 0);
}
sum(1,2,3); //6

بستار یک تابع داخلی است که به متغیرهای تابع منشا دسترسی دارد، حتی بعد از اجرای تابع منشاء. به مثال زیر توجه کنید:

function createCount(){
   let state = 0;
   return function count(){
      state += 1;
      return state;
   }
}
let count = createCount();
console.log(count()); //1
console.log(count()); //2

count() یک تابع تو در تو است. count() به متغیر state از منشاء آن دسترسی پیدا می کند.

در تابع منشا createCount() قابل استفاده است. count()  یک بستار است.

یک تابع مرتبه بالاتر، تابعی است که تابع دیگری را به عنوان ورودی میگیرد، یک یا دو تابع را باز می گرداند.

filter(), map(), reduce()  توابع مرتبه بالاتر هستند.

یک تابع مطلق تابعی است که مقدار را فقط بر اساس ورودی اش باز می گرداند. توابع مطلق متغیرها را از تابع بیرونی استفاده نمی کنند. توابع مطلق باعث هیچ دگرگونی و بهم ریختگی نمی شوند.

در مثال قبل isEven(), doubleNumber(), addNumber()  و sum() توابع مطلق هستند.

برای اطلاع بیشتر از عملکرد جاوا اسکریپت موضوعات زیر را مطالعه کنید:

قدرت بستارها در جاوا اسکریپت

قدرت کلاس یک در جاوا اسکریپت

چگونه ترکیب point-free باعث بهتر شدن شما در برنامه نویسی کاربردی می شود.

چند تابع طراحی داخلی که می توانید از چرک نویس بنویسید

کدهای خود را با استفاده از برنامه نویسی کاربردی ساده تر کنید

نتیجه گیری

قدرت جاوا اسکریپت در سادگی آن است. درک اساس جاوا اسکریپت باعث درک بهتر ما و استفاده از زبان می شود.

1 Star2 Stars3 Stars4 Stars5 Stars (2 votes, average: 5٫00 out of 5)
Loading...
counter customizable free hit