Kodni namoyish qilish: Javascript va Javascript

Ruby va JavaScript-ni boshdan-oyoq boshlamoqchi. Ushbu ikkala skript tillari dinamik yozilgan va ob'ektga yo'naltirilgan dasturlashni qo'llab-quvvatlaydi. Ularning farqlari yoki o'xshashliklarini ba'zi bir umumiy xususiyatlar bo'yicha ko'rib chiqamiz.

Rad etish: Biz bu erda faqat zamonaviy JavaScript ES6 sintaksisini ko'rib chiqmoqdamiz.

Pramote Polyamate surati 500px

String interpolyatsiyasi

Kompyuter dasturlashda simli interpolyatsiya - bu o'zgaruvchining qiymatini yoki satrda ifodani kiritish jarayoni.

Ruby-da bu chaqiriladi, siz buni taxmin qilgansiz, simli interpolyatsiya.

Yoqut:

first_name = "Martin"
last_name = "Riggs"
"Salom, men # {first_name} # {last_name}" deb yozadi.

Javascript-da xuddi shu narsani shablon harflari bilan olish mumkin.

JavaScript:

const firstName = 'Martin';
const lastName = 'Riggs';
console.log (`Salom, men $ {firstName} $ {lastName} emasman. ');

Usullari va vazifalari

Vikipediya tushuntiradiki, kompyuter dasturlashda kichik dastur - bu muayyan vazifani bajaradigan, birlik sifatida qadoqlangan dastur ko'rsatmalarining ketma-ketligi. Keyinchalik ushbu jihoz muayyan vazifani bajarish kerak bo'lgan dasturlarda ishlatilishi mumkin.

Turli dasturlash tillarida subroutine protsedura, funktsiya, rutin, usul yoki kichik dastur deb nomlanishi mumkin.

Foydalanish uchun ushbu kichik dasturlarni avval aniqlash va keyin ularni chaqirish kerak. Ruby-da ular uslub sifatida tanilgan va JavaScript-da ular funktsiyalar deb nomlanadi.

Yoqut:

def to'liq ism (ism, familiya, ismi)
  "# {first_name.capitalize} # {last_name.capitalize}"
oxiri
to'liq_name qo'yadi ("beatrix", "kiddo")

JavaScript:

funktsiya fullName (firstName, familiya) {
  return $ $ firstName.capitalize ()} $ {lastName.capitalize ()} ';
};
console.log (fullName ("beatrix", "kiddo"));

Agar siz yuqorida keltirilgan misollar bilan ishlayotgan bo'lsangiz, ehtimol siz JavaScript misolining ishlamayotganligini payqadingiz, lekin xatoga yo'l qo'ydi: Uncaught TypeError: firstName.capitalize bu funktsiya emas!

Buning sababi shundaki, JavaScript bosh harf bilan yozish funktsiyasini aniqlamaydi. Yoqutda juda qulay va #capitalize kabi idiomatik usullar mavjud, ular juda qulay. Yuqoridagi misolni ishlash uchun JavaScript String ob'ektida protetib zanjiridan (maymun patch) foydalanishimiz kerak:

String.prototype.capitalize = funktsiya () {
  return this.charAt (0) .toUpperCase () + this.slice (1);
}

Bloklar

Ruby-da bloklar bu asosan noma'lum kodlar to'plami bo'lib, ularni ichkariga o'tkazib yuborish mumkin. Ruby-da o'rnatilgan ob'ektlarning ko'pgina usullari bloklarni qabul qiladi va bu usullarning o'zini tutish uchun qulay usuldir.

Yoqut:

def taymer
  start_time = Vaqt.now
  "Ishlayotgan blok ..."
  
  Yo'l bering
  "Tayyor!"
  end_time = Time.now - start_time
  "Bajarish vaqti: # {tugatish vaqti}"
oxiri
taymerni qo'yadi {(0..10000000) .sort}

Hey, JavaScript-da bloklar mavjud emas, shuning uchun yuqorida ko'rsatilgan amalga oshirish mumkin emas va taqqoslash bema'ni! Yoki shundaymi? Javascript funktsiyalari qayta chaqirish funktsiyalarini argument sifatida qabul qilishi mumkin va agar biz Ruby bloklarini noma'lum usullarga o'xshash deb hisoblasak, biz shunga o'xshash natijaga erishamiz.

JavaScript:

funktsiya taymeri (qo'ng'iroqni qaytarish) {
  const startTime = yangi sana (). getTime ();
  console.log ("Qo'ng'iroqni qayta ishlash ...");
  
  qayta qo'ng'iroq qilish();
  console.log ("Tayyor!");
  const endTime = yangi sana (). getTime ();
  return `ijro vaqti: $ {endTime - startTime} ';
};
taymer (() => Array.from (Array (10000000) .keys ()). sort ());

Eslatma: Yoqutdan farqli o'laroq, JavaScript-da o'rnatilgan Range ob'ekti yo'q. Yuqoridagi Array.from (Number) .keys () qatori 0 raqamidan raqamga qaytadi.

Idiomatik iteratsiyalar

Ruby Arrays (va boshqa Hisoblagichlar yoki iterativ tuzilmalar) bo'ylab aylanadigan juda yaxshi idiomatik iteratorlarga ega ekanligi bilan mashhur.

Yoqut:

ismlar = ["Tango", "Cash", "Dalton", "Riggs"]
names.each do | nomi |
  ism qo'yadi
oxiri

ES6 bilan, JavaScript-da massivni takrorlash shabada bo'ladi:

JavaScript:

const names = ['Tango', 'Cash', 'Dalton', 'Riggs'];
names.forEach (name => console.log (ism));

Eslatma: Javascript forEach funktsiyasi elementlar indeksiga ham kirishi mumkin. Ruby-da, har_with_index deb ataladigan boshqa iteratordan foydalanamiz.

Sinflar va sinf meros

Ob'ektga yo'naltirilgan dasturlashda sinflar - bu ob'ektlarni yaratish, holat (ob'ektning xususiyatlari yoki atributlari) uchun qiymatlarni ta'minlovchi va bunday xatti-harakatlarni (atributlarni o'qish va yozishga kirishuvchi va sozlovchilar kabi) ob'ektlarni yaratish uchun kod shablonlari.

Yoqut:

sinf avtoulov
  def initialize (nomi, turi)
    @ ism = ism
    @ turi = turi
  oxiri
  def ism
    @ ism
  oxiri
  def turi
    @tip
  oxiri
oxiri
sinf avtomobil 
diablo = Car.new ("Lamborghini")
diablo.name qo'yadi
diablo.type qo'yadi

JavaScript:

sinf avtoulov {
 
  konstruktor (nomi, turi) {
    this.name = ism;
    this.type = turi;
  }
 
  getName () {
    return this.name;
  }
 
  getType () {
    return this.type;
  }
 
}
sinf avtoulov transport vositasini kengaytirmoqda {
 
  quruvchi (ism) {
    super (ism, 'mashina');
  }
}
const diablo = yangi mashina ('Lamborghini');
konsol.log (diablo.getName ());
konsol.log (diablo.getType ());

Eslatma: Yuqoridagi misolda, Ruby Vehicle klassi odatda namunaviy o'zgaruvchilar uchun olish usullarini yaratish uchun atributlarni o'qish vositasi bilan amalga oshiriladi. JavaScript-ni amalga oshirishga o'xshashroq ko'rinishi uchun men atributlar o'quvchi vositasidan foydalanmaslikni tanladim.

Vayron qilish

Zamonaviy JavaScript vayron qiluvchi deb nomlangan juda ajoyib narsani taqdim etdi, unda siz massivlar yoki ob'ektlar ichidagi elementlarni qisqa sintaksis yordamida o'zgaruvchilarga tayinlashingiz mumkin.

JavaScript:

firstName, lastName = 'James Bond'.split ();
console.log (`Mening ismim $ {lastName}, $ {firstName} $ {lastName} ');

Siz buni Rubyda qilolmaysiz!

Yoqut:

first_name, last_name = "James Bond" .split
qo'yadi "Mening ismim # {last_name}, # {first_name} # {last_name}"

Eslatma: Ruby-da massivlarni yo'q qila olsak-da, JavaScript-da bo'lgani kabi, to'g'ridan-to'g'ri yo'q qilish chiqindilariga o'xshash Ruby yo'q.

Tarqatish operatori

Zamonaviy JavaScript shuningdek, nol yoki undan ko'p argumentlar yoki elementlar kutilayotgan iterativ iboralarni kengaytirish imkoniyatini beradigan tarqalish operatorini ham taklif qildi.

JavaScript:

funktsiya yig'indisi (x, y, z) {
  x + y + z qaytish;
};
const raqamlari = [1, 2, 3];
konsol.log (sum (... raqamlar);
[a, b, ... dam olish] = [10, 20, 30, 40, 50];
konsol.log (a);
konsol.log (b);
console.log (dam olish); // dam Array!

Ruby-da bizda splat operatori mavjud.

Yoqut:

def summasi (x, y, z)
  x + y + z
oxiri
raqamlar = [1, 2, 3]
summa qo'yadi (* raqamlar)
a, * dam olish, b = [10, 20, 30, 40, 50]
qo'yadi a
qo'yadi b
dam oladi # dam olish - bu Array!

Eslatma: Ehtimol siz Ruby * yozuvida boshqa parametrlar orasida qolganligini payqadingiz. Bu splat operatori o'zgaruvchilar orasida istalgan joyda joylashtirilishi mumkin. JavaScript-da, tarqalish operatori oxirgi bo'lishi kerak.

Ruby shuningdek, heshlarda bir xil ishlarni bajarish uchun ** qo'shaloq splat operatoriga ega. JavaScript ES2018 spetsifikatsiyasi ob'ektlarga ham tarqalish operatorini tanishtiradi.

Yakuniy so'z

Siz tushunganingizdek, ikkala til ham umuman farq qilmaydi va ES6 bilan JavaScript yozish yoqimli bo'lib boraverdi. Albatta, JavaScript - bu brauzerning tili va uning hodisalar davri asenkron holatni ta'minlaydi. Boshqa tomondan, Ruby metaprogramma qilish uchun juda kuchli vositalarga ega va idiomatik sintaksisi uchun juda yoqadi. Oxirida, men o'rganish va ikkalasini ham foydali deb o'ylayman, chunki ko'pincha bitta dasturlash tilini bilish sizga boshqa bir dasturda qandaydir muammoni qanday hal qilish yoki hal qilish bo'yicha g'oyalarni beradi.