জাভাস্ক্রিপ্ট প্রথম তৈরি করা হয় ১৯৯০ দশকের এর মাঝামাঝিতে "Netscape Navigator Web Browser" এর জন্য। তৎকালীন সময়ে ওয়েভ পেইজগুলো Static হিসাবে ব্যবহার করা হতো। খুব কমই ইউজার Interaction পসিবল ছিল। ডাইনামিক ওয়েব Interaction চাহিদা পূরণের জন্য জাভাস্ক্রিপ্ট তৈরি করা হয়। Brendan Eich জাভাস্ক্রিপ্ট তৈরি করেন "Netscape Communication" এ থাকা সময়ে। Java, Scheme, Self থেকে অনেক কিছুই জাভাস্ক্রিপ্টে নেওয়া হয়েছে, যা প্রাথমিক অবস্থায় জাভাস্ক্রিপ্টকে ইউজার ফ্রেন্ডলি পরিচিতি দেয় এবং জাভাস্ক্রিপ্ট অনেক জনপ্রিয় হতে থাকে।


২০১৯ সালে জনপ্রিয় সাইট Stack Overflow এর প্রায় ৯০ হাজার ডেভেলপারের উপর চালানো সার্ভে অনুযায়ী ২০১৯ সালে সবথেকে জনপ্রিয় প্রোগ্রামিং ল্যাগুয়েজ হিসাবে স্বীকৃত হয়েছে জাভাস্ক্রিপ্ট।

জাভাস্ক্রিপ্ট অনেক  জনপ্রিয় হলেও এর কিছু weird ব্যবহারের জন্য  অনেকের কাছেই জাভাস্ক্রিপ্ট অনেক confusing programming language হিসাবে পরিচিত। আমরা যদি জাভাস্ক্রিপ্ট এর confusing parts গুলা ব্যবহারে সচেতন থাকি তাহলে আমরা জাভাস্ক্রিপ্টকে ভালভাবে ব্যবহার করতে পারব।

পাস-বাই-ভ্যালু বনাম পাস-বাই-রেফারেন্স

জাভাস্ক্রিপ্ট ফাংশনের argument হিসাবে primitive type (number, integer, string etc ) পাস করা হয় তখন তা পাস-বাই-ভ্যালু হিসাবে তা পাস হয় কিন্তু যখন object/function এর argument হিসাবে পাস করা হয় তখন তা পাস-বাই-রেফারেন্স হিসাবে পাস হয়।

function foo(a,b,c) {
   a = 3;
   b.push("ans is bangladesh");
   c.first = false;
}

let x = 4;
let y = ["who", "will", "win", "next", "2023",  "worldcup ?"];
var z = {first: true};
foo(x,y,z);
console.log(x, y, z.first); // 4, ["who", "will", "win", "next", "2023",  "worldcup?" , "ans is Bangladesh"], false

উপরের উদাহরণ যদি খেয়াল করি, ভ্যারিয়েবল x এর ভ্যালু পাস-বাই-ভ্যালু হয়েছে, যা foo ফাংশনের বাহিরে চ্যাঞ্জ ভ্যালু থাকেনি কিন্তু অব্জেক্ট হিসাবে foo ফাংশনের পাস করা ভ্যারিয়েবল z এর ভ্যালু চ্যাঞ্জ হয়েছে । কারণ তা পাস-বাই-রেফারেন্স হিসাবে পাস হয়েছে ।

জাভাস্ক্রিপ্টে loosely-typed ল্যাঙ্গুয়েজ

জাভাস্ক্রিপ্টে ভ্যারিয়েবল বা অবজেক্ট এর ফিক্সড কোন টাইপ নাই, তারা যখন যা খুশী তা হয়ে যেতে পারে ।


let iAm = "shakil";

console.log(typeof iAm); // "string"

iAm = 3.1416;

console.log(typeof iAm); // "number"

iAm = true;

console.log(typeof iAm); // boolean


ছোটবেলায় আমি যখন ক্রিকেট খেলা দেখতাম আমি ক্রিকেটার হতে চাইতাম। আবার চকলেট কিনতে গেলে মনে হত যদি দোকানদার পারতাম তাহলে অনেক ভাল হত। এখন সুযোগ থাকলে আমি জাভাস্ক্রিপ্ট হতে চাবো।

জাভাস্ক্রিপ্ট Hoisting

hoisting হচ্ছে জাভাস্ক্রিপ্ট এর এমন একটা বৈশিষ্ট্য যখনই আমরা কোন ভ্যারিয়েবল ডিক্লিয়ার করি না কেন তা একদম শুরুতে চলে যায়।


name = "who cares";

console.log("i am " + name); // i am who cares

var name;

কিন্তু initialization যদি পরে করি তাহলে আবার জাভাস্ক্রিপ্ট কাটাপ্পার মত ধোঁকা দেয়। (বাহুবলী নামক মুভিতে কাটাপ্পা বাহুবলীর সরলতার সুযোগে ধোঁকা দেয়)


var name;

console.log("i am " + name); // i am undefined

name = "who cares";

কিন্তু আবার যদি ভ্যারিয়েবল কে ES6 এর let বা const এর মাধ্যমে ডিক্লেয়ার করা হয় তাহলে তা "Jorah Mormont" এর মত বিশ্বস্ত থাকে ("Jorah Mormont" হলেন জনপ্রিয় টিভি প্রোগ্রাম "Game of Thrones" এর একজন ক্যারেক্টার , যিনি mother of dragon, Daenerys Targaryen এর অনেক বিশ্বস্ত ছিলেন)


// let
console.log(name);
let name = "who cares";
// Uncaught ReferenceError: name is not defined

// const
console.log(name);
const name = "who cares";
// Uncaught ReferenceError: name is not defined

আবার যদি ফাংশন declaration করা হয় তা ঠিকঠাক মত hoisiting হয়ে একদম শুরুতে চলে যায়


hello("who cares");

function hello(name) {

    console.log("Hello " + name); // hello who cares
}

কিন্তু আবার যদি ফাংশনকে ভ্যারিয়েবল এ assign করা হয় তখন তা ঠিকঠাক hoisting না হয়ে কাটাপ্পা হয়ে যায়।

hello("who cares");

var hello = function(name) {
    console.log("Hello " + name);
}
// TypeError: hello is not a function

ফাংশন যাহা তাহাই অবজেক্ট জাভাস্ক্রিপ্টে

ফাংশনকে জাভাস্ক্রিপ্ট অবজেক্ট এর মত ট্রিট করে। তাকে চাইলে ভ্যারিয়েবল এর মধ্যে assign করা যায় ।


var hello = function(name) {
    console.log("Hello " + name);
}

hello("who cares"); 

যখন খুশি তখন তাতে নতুন ভ্যারিয়েবল যোগ করা যায়।


var hello = function(name) {
    console.log("Hello " + name);
}

hello.world = "this world is for good people";

console.log(hello.world); // this world is for good people

এমনকি ফাংশনকে চাইলে অন্য ফাংশন থেকে return ও করা যায়।

function trustMeIAmObject() {

	function okThenReturnMe(){
		console.log("i am a function and also an object");
   }
   return okThenReturnMe;
}

let areYouAnObject = trustMeIAmObject();

areYouAnObject(); // i am a function and also an object

পরবর্তী পোস্টে আমরা জাভাস্ক্রিপ্টের আরো বিভ্রান্তিকর বিষয়াদি সম্পর্কে জানব ।