Skip to content

JavaScript Eng Yaxshi Usullar (Best Practices)

Global o'zgaruvchilardan saqlaning, new dan saqlaning, == dan saqlaning, eval() dan saqlaning.


Global o'zgaruvchilardan saqlaning

Global o'zgaruvchilardan foydalanishni minimallang. Bu barcha ma'lumot turlari, obyektlar va funksiyalarni o'z ichiga oladi. Global o'zgaruvchilar va funksiyalar boshqa skriptlar tomonidan qayta yozilishi mumkin. Buning o'rniga mahalliy o'zgaruvchilardan foydalaning va yopilmalar (closures) ishlatishni o'rganing.


Har doim mahalliy o'zgaruvchilarni e'lon qiling

Funksiyada ishlatiladigan barcha o'zgaruvchilar mahalliy o'zgaruvchilar sifatida e'lon qilinishi kerak. Mahalliy o'zgaruvchilar var, let yoki const kalit so'zi bilan e'lon qilinishi shart, aks holda ular global o'zgaruvchilarga aylanadi.

Eslatma

Qat'iy rejim (strict mode) e'lon qilinmagan o'zgaruvchilarga ruxsat bermaydi.


E'lonlarni yuqoriga qo'ying

Barcha e'lonlarni har bir skript yoki funksiyaning yuqorisiga qo'yish yaxshi amaliyotdir. Bu:

  • Toza kod beradi
  • Mahalliy o'zgaruvchilarni qidirish uchun bitta joy beradi
  • Keraksiz (nazarda tutilgan) global o'zgaruvchilardan qochishni osonlashtiradi
  • Keraksiz qayta e'lonlar ehtimolini kamaytiradi
js
// Boshida e'lon qiling
let firstName, lastName, price, discount, fullPrice;

// Keyinroq ishlating
firstName = "John";
lastName = "Doe";

price = 19.90;
discount = 0.10;

fullPrice = price - discount;

Bu sikl o'zgaruvchilariga ham tegishli:

js
for (let i = 0; i < 5; i++) {

O'zgaruvchilarni initsializatsiya qiling

O'zgaruvchilarni e'lon qilganingizda initsializatsiya qilish yaxshi amaliyotdir. Bu:

  • Toza kod beradi
  • O'zgaruvchilarni initsializatsiya qilish uchun bitta joy beradi
  • Undefined qiymatlardan qochadi
js
// Boshida e'lon va initsializatsiya qiling
let firstName = "";
let lastName = "";
let price = 0;
let discount = 0;
let fullPrice = 0;
const myArray = [];
const myObject = {};

Eslatma

O'zgaruvchilarni initsializatsiya qilish mo'ljallangan foydalanish (va mo'ljallangan ma'lumot turi) haqida tasavvur beradi.


JavaScript o'zgaruvchilarini qayta e'lon qilish

var bilan e'lon qilingan JavaScript o'zgaruvchisini qayta e'lon qilsangiz, u o'z qiymatini yo'qotmaydi:

js
// Tavsiya etilmaydi
var carName = "Volvo";
var carName;

let yoki const bilan e'lon qilingan o'zgaruvchini qayta e'lon qilish mumkin emas:

js
// Bu ishlamaydi
let carName = "Volvo";
let carName;

// Bu ham ishlamaydi
const carName = "Volvo";
const carName;

Obyektlarni const bilan e'lon qiling

Obyektlarni const bilan e'lon qilish turni tasodifiy o'zgartirishning oldini oladi:

js
let car = {type:"Fiat", model:"500", color:"white"};
car = "Fiat";      // Obyektni satrga o'zgartiradi

const car = {type:"Fiat", model:"500", color:"white"};
car = "Fiat";      // Mumkin emas

Massivlarni const bilan e'lon qiling

Massivlarni const bilan e'lon qilish turni tasodifiy o'zgartirishning oldini oladi:

js
let cars = ["Saab", "Volvo", "BMW"];
cars = 3;    // Massivni raqamga o'zgartiradi

const cars = ["Saab", "Volvo", "BMW"];
cars = 3;    // Mumkin emas

new Object() ishlatmang

  • new String() o'rniga "" ishlating
  • new Number() o'rniga 0 ishlating
  • new Boolean() o'rniga false ishlating
  • new Object() o'rniga {} ishlating
  • new Array() o'rniga [] ishlating
  • new RegExp() o'rniga /()/ ishlating
  • new Function() o'rniga function (){} ishlating
js
let x1 = "";             // yangi primitiv satr
let x2 = 0;              // yangi primitiv raqam
let x3 = false;          // yangi primitiv boolean
const x4 = {};           // yangi obyekt
const x5 = [];           // yangi massiv obyekti
const x6 = /()/;         // yangi regexp obyekti
const x7 = function(){}; // yangi funksiya obyekti

Avtomatik tur o'zgartirishdan ehtiyot bo'ling

JavaScript erkin tiplangan tildir. O'zgaruvchi barcha ma'lumot turlarini saqlashi va ma'lumot turini o'zgartirishi mumkin:

js
let x = "Hello";     // typeof x = string
x = 5;               // typeof x = number

Raqamlar tasodifiy satrlarga yoki NaN ga aylanishi mumkin:

js
let x = 5 + 7;       // x = 12,  typeof x = number
let x = 5 + "7";     // x = "57", typeof x = string
let x = "5" + 7;     // x = "57", typeof x = string
let x = 5 - 7;       // x = -2,  typeof x = number
let x = 5 - "7";     // x = -2,  typeof x = number
let x = "5" - 7;     // x = -2,  typeof x = number
let x = 5 - "x";     // x = NaN, typeof x = number

Satrdan satrni ayirish xato yaratmaydi, lekin NaN qaytaradi:

js
"Hello" - "Dolly"    // NaN qaytaradi

=== taqqoslashdan foydalaning

== taqqoslash operatori taqqoslashdan oldin har doim (mos turlarga) aylantiradi. === operatori qiymat va turni taqqoslashga majburlaydi:

js
0 == "";        // true
1 == "1";       // true
1 == true;      // true

0 === "";       // false
1 === "1";      // false
1 === true;     // false

Parametr standart qiymatlaridan foydalaning

Funksiya yetishmayotgan argument bilan chaqirilsa, yetishmayotgan argumentning qiymati undefined ga o'rnatiladi. Standart qiymatlar berish yaxshi odat:

js
function myFunction(x, y) {
  if (y === undefined) {
    y = 0;
  }
}

ECMAScript 2015 funksiya ta'rifida standart parametrlarga ruxsat beradi:

js
function (a=1, b=1) { /*funksiya kodi*/ }

Switch-larni default bilan tugatang

switch bayonotlarini har doim default bilan tugatang, hatto kerak emas deb o'ylasangiz ham:

js
switch (new Date().getDay()) {
  case 0:
    day = "Sunday";
    break;
  case 1:
    day = "Monday";
    break;
  // ...
  default:
    day = "Unknown";
}

Number, String va Boolean-ni obyekt sifatida ishlatmang

Raqamlar, satrlar yoki boolean-larni har doim primitiv qiymatlar sifatida ko'ring, obyektlar sifatida emas:

js
let x = "John";
let y = new String("John");
(x === y) // false — chunki x satr, y esa obyekt

let x = new String("John");
let y = new String("John");
(x == y) // false — chunki obyektlarni taqqoslab bo'lmaydi

eval() ishlatmang

eval() funksiyasi matnni kod sifatida bajarish uchun ishlatiladi. Deyarli barcha hollarda uni ishlatish shart emas. U o'zboshimchalik bilan kodni bajarishga ruxsat berganligi uchun xavfsizlik muammosini ham ifodalaydi.