ગુજરાતી

જાવાસ્ક્રિપ્ટ સિમ્બોલ્સનું અન્વેષણ કરો: અનન્ય પ્રોપર્ટી કીઝ, મેટાડેટા સ્ટોરેજ અને નામની અથડામણ ટાળવા માટે તેમના ઉપયોગો. વ્યવહારુ ઉદાહરણો શામેલ છે.

જાવાસ્ક્રિપ્ટ સિમ્બોલ્સ: અનન્ય પ્રોપર્ટી કીઝ અને મેટાડેટા

જાવાસ્ક્રિપ્ટ સિમ્બોલ્સ, જે ECMAScript 2015 (ES6) માં રજૂ કરવામાં આવ્યા હતા, તે અનન્ય અને अपरिवर्तनीय (immutable) પ્રોપર્ટી કીઝ બનાવવાની એક પદ્ધતિ પ્રદાન કરે છે. સ્ટ્રિંગ્સ અથવા નંબર્સથી વિપરીત, સિમ્બોલ્સ તમારી સંપૂર્ણ જાવાસ્ક્રિપ્ટ એપ્લિકેશનમાં અનન્ય હોવાની ખાતરી આપે છે. તે નામકરણની અથડામણ (naming collisions) ટાળવા, હાલની પ્રોપર્ટીઝમાં દખલ કર્યા વિના ઓબ્જેક્ટ્સ સાથે મેટાડેટા જોડવા અને ઓબ્જેક્ટના વર્તનને કસ્ટમાઇઝ કરવાનો એક માર્ગ પ્રદાન કરે છે. આ લેખ જાવાસ્ક્રિપ્ટ સિમ્બોલ્સની વ્યાપક ઝાંખી પૂરી પાડે છે, જેમાં તેમની બનાવટ, ઉપયોગો અને શ્રેષ્ઠ પ્રથાઓનો સમાવેશ થાય છે.

જાવાસ્ક્રિપ્ટ સિમ્બોલ્સ શું છે?

સિમ્બોલ એ જાવાસ્ક્રિપ્ટમાં એક પ્રિમિટિવ ડેટા પ્રકાર છે, જે નંબર્સ, સ્ટ્રિંગ્સ, બૂલિયન્સ, નલ અને અનડિફાઇન્ડ જેવો જ છે. જોકે, અન્ય પ્રિમિટિવ પ્રકારોથી વિપરીત, સિમ્બોલ્સ અનન્ય હોય છે. દરેક વખતે જ્યારે તમે સિમ્બોલ બનાવો છો, ત્યારે તમને એક સંપૂર્ણપણે નવી, અનન્ય કિંમત મળે છે. આ વિશિષ્ટતા સિમ્બોલ્સને આના માટે આદર્શ બનાવે છે:

સિમ્બોલ્સ બનાવવા

તમે Symbol() કન્સ્ટ્રક્ટરનો ઉપયોગ કરીને સિમ્બોલ બનાવો છો. એ નોંધવું અગત્યનું છે કે તમે new Symbol() નો ઉપયોગ કરી શકતા નથી; સિમ્બોલ્સ ઓબ્જેક્ટ્સ નથી, પરંતુ પ્રિમિટિવ કિંમતો છે.

મૂળભૂત સિમ્બોલ બનાવટ

સિમ્બોલ બનાવવાનો સૌથી સરળ રસ્તો છે:

const mySymbol = Symbol();
console.log(typeof mySymbol); // Output: symbol

Symbol() પર દરેક કૉલ એક નવી, અનન્ય કિંમત જનરેટ કરે છે:

const symbol1 = Symbol();
const symbol2 = Symbol();
console.log(symbol1 === symbol2); // Output: false

સિમ્બોલ વર્ણનો

તમે સિમ્બોલ બનાવતી વખતે વૈકલ્પિક સ્ટ્રિંગ વર્ણન પ્રદાન કરી શકો છો. આ વર્ણન ડિબગીંગ અને લોગિંગ માટે ઉપયોગી છે, પરંતુ તે સિમ્બોલની વિશિષ્ટતાને અસર કરતું નથી.

const mySymbol = Symbol("myDescription");
console.log(mySymbol.toString()); // Output: Symbol(myDescription)

વર્ણન સંપૂર્ણપણે માહિતીના હેતુ માટે છે; સમાન વર્ણનવાળા બે સિમ્બોલ્સ હજુ પણ અનન્ય છે:

const symbolA = Symbol("same description");
const symbolB = Symbol("same description");
console.log(symbolA === symbolB); // Output: false

પ્રોપર્ટી કીઝ તરીકે સિમ્બોલ્સનો ઉપયોગ

સિમ્બોલ્સ પ્રોપર્ટી કીઝ તરીકે ખાસ કરીને ઉપયોગી છે કારણ કે તે વિશિષ્ટતાની ખાતરી આપે છે, ઓબ્જેક્ટ્સમાં પ્રોપર્ટીઝ ઉમેરતી વખતે નામકરણની અથડામણ અટકાવે છે.

સિમ્બોલ પ્રોપર્ટીઝ ઉમેરવી

તમે સ્ટ્રિંગ્સ અથવા નંબર્સની જેમ જ સિમ્બોલ્સનો પ્રોપર્ટી કીઝ તરીકે ઉપયોગ કરી શકો છો:

const mySymbol = Symbol("myKey");
const myObject = {};

myObject[mySymbol] = "Hello, Symbol!";

console.log(myObject[mySymbol]); // Output: Hello, Symbol!

નામકરણની અથડામણ ટાળવી

કલ્પના કરો કે તમે તૃતીય-પક્ષ લાઇબ્રેરી સાથે કામ કરી રહ્યા છો જે ઓબ્જેક્ટ્સમાં પ્રોપર્ટીઝ ઉમેરે છે. તમે હાલની પ્રોપર્ટીઝને ઓવરરાઇટ કરવાના જોખમ વિના તમારી પોતાની પ્રોપર્ટીઝ ઉમેરવા માગી શકો છો. સિમ્બોલ્સ આ કરવા માટે એક સુરક્ષિત માર્ગ પ્રદાન કરે છે:

// Third-party library (simulated)
const libraryObject = {
  name: "Library Object",
  version: "1.0"
};

// Your code
const mySecretKey = Symbol("mySecret");
libraryObject[mySecretKey] = "Top Secret Information";

console.log(libraryObject.name); // Output: Library Object
console.log(libraryObject[mySecretKey]); // Output: Top Secret Information

આ ઉદાહરણમાં, mySecretKey એ સુનિશ્ચિત કરે છે કે તમારી પ્રોપર્ટી libraryObject માં કોઈપણ હાલની પ્રોપર્ટીઝ સાથે સંઘર્ષ કરતી નથી.

સિમ્બોલ પ્રોપર્ટીઝની ગણતરી

સિમ્બોલ પ્રોપર્ટીઝની એક નિર્ણાયક લાક્ષણિકતા એ છે કે તે for...in લૂપ્સ અને Object.keys() જેવી સામાન્ય ગણતરી પદ્ધતિઓથી છુપાયેલી હોય છે. આ ઓબ્જેક્ટ્સની અખંડિતતાનું રક્ષણ કરવામાં મદદ કરે છે અને સિમ્બોલ પ્રોપર્ટીઝની આકસ્મિક ઍક્સેસ અથવા ફેરફારને અટકાવે છે.

const mySymbol = Symbol("myKey");
const myObject = {
  name: "My Object",
  [mySymbol]: "Symbol Value"
};

console.log(Object.keys(myObject)); // Output: ["name"]

for (let key in myObject) {
  console.log(key); // Output: name
}

સિમ્બોલ પ્રોપર્ટીઝને ઍક્સેસ કરવા માટે, તમારે Object.getOwnPropertySymbols() નો ઉપયોગ કરવાની જરૂર છે, જે ઓબ્જેક્ટ પરની તમામ સિમ્બોલ પ્રોપર્ટીઝનો એરે પરત કરે છે:

const mySymbol = Symbol("myKey");
const myObject = {
  name: "My Object",
  [mySymbol]: "Symbol Value"
};

const symbolKeys = Object.getOwnPropertySymbols(myObject);
console.log(symbolKeys); // Output: [Symbol(myKey)]
console.log(myObject[symbolKeys[0]]); // Output: Symbol Value

વેલ-નોન સિમ્બોલ્સ

જાવાસ્ક્રિપ્ટ બિલ્ટ-ઇન સિમ્બોલ્સનો સમૂહ પ્રદાન કરે છે, જે વેલ-નોન સિમ્બોલ્સ તરીકે ઓળખાય છે, જે ચોક્કસ વર્તણૂકો અથવા કાર્યક્ષમતાઓનું પ્રતિનિધિત્વ કરે છે. આ સિમ્બોલ્સ Symbol કન્સ્ટ્રક્ટરની પ્રોપર્ટીઝ છે (દા.ત., Symbol.iterator, Symbol.toStringTag). તે તમને વિવિધ સંદર્ભોમાં ઓબ્જેક્ટ્સ કેવી રીતે વર્તે છે તે કસ્ટમાઇઝ કરવાની મંજૂરી આપે છે.

Symbol.iterator

Symbol.iterator એ એક સિમ્બોલ છે જે ઓબ્જેક્ટ માટે ડિફોલ્ટ ઇટરેટરને વ્યાખ્યાયિત કરે છે. જ્યારે કોઈ ઓબ્જેક્ટમાં Symbol.iterator કી સાથેની મેથડ હોય, ત્યારે તે ઇટરેબલ બની જાય છે, જેનો અર્થ છે કે તમે તેને for...of લૂપ્સ અને સ્પ્રેડ ઓપરેટર (...) સાથે ઉપયોગ કરી શકો છો.

ઉદાહરણ: કસ્ટમ ઇટરેબલ ઓબ્જેક્ટ બનાવવું

const myCollection = {
  items: [1, 2, 3, 4, 5],
  [Symbol.iterator]: function* () {
    for (let item of this.items) {
      yield item;
    }
  }
};

for (let item of myCollection) {
  console.log(item); // Output: 1, 2, 3, 4, 5
}

console.log([...myCollection]); // Output: [1, 2, 3, 4, 5]

આ ઉદાહરણમાં, myCollection એ એક ઓબ્જેક્ટ છે જે Symbol.iterator નો ઉપયોગ કરીને ઇટરેટર પ્રોટોકોલ લાગુ કરે છે. જનરેટર ફંક્શન items એરેમાં દરેક આઇટમ યીલ્ડ કરે છે, જે myCollection ને ઇટરેબલ બનાવે છે.

Symbol.toStringTag

Symbol.toStringTag એ એક સિમ્બોલ છે જે તમને ઓબ્જેક્ટના સ્ટ્રિંગ પ્રતિનિધિત્વને કસ્ટમાઇઝ કરવાની મંજૂરી આપે છે જ્યારે Object.prototype.toString() ને કૉલ કરવામાં આવે છે.

ઉદાહરણ: toString() પ્રતિનિધિત્વને કસ્ટમાઇઝ કરવું

class MyClass {
  get [Symbol.toStringTag]() {
    return 'MyClassInstance';
  }
}

const instance = new MyClass();
console.log(Object.prototype.toString.call(instance)); // Output: [object MyClassInstance]

Symbol.toStringTag વિના, આઉટપુટ [object Object] હશે. આ સિમ્બોલ તમારા ઓબ્જેક્ટ્સનું વધુ વર્ણનાત્મક સ્ટ્રિંગ પ્રતિનિધિત્વ આપવાનો એક માર્ગ પ્રદાન કરે છે.

Symbol.hasInstance

Symbol.hasInstance એ એક સિમ્બોલ છે જે તમને instanceof ઓપરેટરના વર્તનને કસ્ટમાઇઝ કરવા દે છે. સામાન્ય રીતે, instanceof તપાસે છે કે ઓબ્જેક્ટની પ્રોટોટાઇપ ચેઇનમાં કન્સ્ટ્રક્ટરની prototype પ્રોપર્ટી છે કે નહીં. Symbol.hasInstance તમને આ વર્તનને ઓવરરાઇડ કરવાની મંજૂરી આપે છે.

ઉદાહરણ: instanceof તપાસને કસ્ટમાઇઝ કરવી

class MyClass {
  static [Symbol.hasInstance](instance) {
    return Array.isArray(instance);
  }
}

console.log([] instanceof MyClass); // Output: true
console.log({} instanceof MyClass); // Output: false

આ ઉદાહરણમાં, Symbol.hasInstance મેથડ તપાસે છે કે ઇન્સ્ટન્સ એરે છે કે નહીં. આ અસરકારક રીતે MyClass ને વાસ્તવિક પ્રોટોટાઇપ ચેઇનને ધ્યાનમાં લીધા વિના, એરે માટેની તપાસ તરીકે કાર્ય કરાવે છે.

અન્ય વેલ-નોન સિમ્બોલ્સ

જાવાસ્ક્રિપ્ટ અન્ય કેટલાક વેલ-નોન સિમ્બોલ્સને વ્યાખ્યાયિત કરે છે, જેમાં શામેલ છે:

ગ્લોબલ સિમ્બોલ રજિસ્ટ્રી

ક્યારેક, તમારે તમારી એપ્લિકેશનના વિવિધ ભાગોમાં અથવા તો વિવિધ એપ્લિકેશનો વચ્ચે સિમ્બોલ્સ શેર કરવાની જરૂર પડે છે. ગ્લોબલ સિમ્બોલ રજિસ્ટ્રી એક કી દ્વારા સિમ્બોલ્સની નોંધણી અને પુનઃપ્રાપ્તિ માટેની એક પદ્ધતિ પ્રદાન કરે છે.

Symbol.for(key)

Symbol.for(key) મેથડ તપાસે છે કે આપેલ કી સાથેનો સિમ્બોલ ગ્લોબલ રજિસ્ટ્રીમાં અસ્તિત્વમાં છે કે નહીં. જો તે અસ્તિત્વમાં હોય, તો તે તે સિમ્બોલ પરત કરે છે. જો તે અસ્તિત્વમાં ન હોય, તો તે કી સાથે એક નવો સિમ્બોલ બનાવે છે અને તેને રજિસ્ટ્રીમાં નોંધણી કરે છે.

const globalSymbol1 = Symbol.for("myGlobalSymbol");
const globalSymbol2 = Symbol.for("myGlobalSymbol");

console.log(globalSymbol1 === globalSymbol2); // Output: true
console.log(Symbol.keyFor(globalSymbol1)); // Output: myGlobalSymbol

Symbol.keyFor(symbol)

Symbol.keyFor(symbol) મેથડ ગ્લોબલ રજિસ્ટ્રીમાં સિમ્બોલ સાથે સંકળાયેલ કી પરત કરે છે. જો સિમ્બોલ રજિસ્ટ્રીમાં ન હોય, તો તે undefined પરત કરે છે.

const mySymbol = Symbol("localSymbol");
console.log(Symbol.keyFor(mySymbol)); // Output: undefined

const globalSymbol = Symbol.for("myGlobalSymbol");
console.log(Symbol.keyFor(globalSymbol)); // Output: myGlobalSymbol

મહત્વપૂર્ણ: Symbol() સાથે બનાવેલા સિમ્બોલ્સ ગ્લોબલ રજિસ્ટ્રીમાં આપમેળે નોંધાયેલા *નથી*. ફક્ત Symbol.for() સાથે બનાવેલા (અથવા પુનઃપ્રાપ્ત) સિમ્બોલ્સ જ રજિસ્ટ્રીનો ભાગ છે.

વ્યવહારુ ઉદાહરણો અને ઉપયોગના કેસો

અહીં કેટલાક વ્યવહારુ ઉદાહરણો છે જે દર્શાવે છે કે વાસ્તવિક-દુનિયાના દૃશ્યોમાં સિમ્બોલ્સનો ઉપયોગ કેવી રીતે થઈ શકે છે:

૧. પ્લગઇન સિસ્ટમ્સ બનાવવી

સિમ્બોલ્સનો ઉપયોગ પ્લગઇન સિસ્ટમ્સ બનાવવા માટે થઈ શકે છે જ્યાં વિવિધ મોડ્યુલો એકબીજાની પ્રોપર્ટીઝ સાથે સંઘર્ષ કર્યા વિના કોર ઓબ્જેક્ટની કાર્યક્ષમતાને વિસ્તૃત કરી શકે છે.

// Core object
const coreObject = {
  name: "Core Object",
  version: "1.0"
};

// Plugin 1
const plugin1Key = Symbol("plugin1");
coreObject[plugin1Key] = {
  description: "Plugin 1 adds extra functionality",
  activate: function() {
    console.log("Plugin 1 activated");
  }
};

// Plugin 2
const plugin2Key = Symbol("plugin2");
coreObject[plugin2Key] = {
  author: "Another Developer",
  init: function() {
    console.log("Plugin 2 initialized");
  }
};

// Accessing plugins
console.log(coreObject[plugin1Key].description); // Output: Plugin 1 adds extra functionality
coreObject[plugin2Key].init(); // Output: Plugin 2 initialized

આ ઉદાહરણમાં, દરેક પ્લગઇન એક અનન્ય સિમ્બોલ કીનો ઉપયોગ કરે છે, જે સંભવિત નામકરણની અથડામણને અટકાવે છે અને સુનિશ્ચિત કરે છે કે પ્લગઇન્સ શાંતિપૂર્વક સહ-અસ્તિત્વ ધરાવી શકે છે.

૨. DOM એલિમેન્ટ્સમાં મેટાડેટા ઉમેરવું

સિમ્બોલ્સનો ઉપયોગ DOM એલિમેન્ટ્સ સાથે તેમના હાલના એટ્રિબ્યુટ્સ અથવા પ્રોપર્ટીઝમાં દખલ કર્યા વિના મેટાડેટા જોડવા માટે થઈ શકે છે.

const element = document.createElement("div");

const dataKey = Symbol("elementData");
element[dataKey] = {
  type: "widget",
  config: {},
  timestamp: Date.now()
};

// Accessing the metadata
console.log(element[dataKey].type); // Output: widget

આ અભિગમ મેટાડેટાને એલિમેન્ટના પ્રમાણભૂત એટ્રિબ્યુટ્સથી અલગ રાખે છે, જાળવણીક્ષમતા સુધારે છે અને CSS અથવા અન્ય જાવાસ્ક્રિપ્ટ કોડ સાથેના સંભવિત સંઘર્ષોને ટાળે છે.

૩. પ્રાઇવેટ પ્રોપર્ટીઝનો અમલ કરવો

જ્યારે જાવાસ્ક્રિપ્ટમાં સાચી પ્રાઇવેટ પ્રોપર્ટીઝ નથી, ત્યારે સિમ્બોલ્સનો ઉપયોગ પ્રાઇવસીનું અનુકરણ કરવા માટે થઈ શકે છે. પ્રોપર્ટી કી તરીકે સિમ્બોલનો ઉપયોગ કરીને, તમે બાહ્ય કોડ માટે પ્રોપર્ટીને ઍક્સેસ કરવાનું મુશ્કેલ (પરંતુ અશક્ય નહીં) બનાવી શકો છો.

class MyClass {
  #privateSymbol = Symbol("privateData"); // Note: This '#' syntax is a *true* private field introduced in ES2020, different than the example

  constructor(data) {
    this[this.#privateSymbol] = data;
  }

  getData() {
    return this[this.#privateSymbol];
  }
}

const myInstance = new MyClass("Sensitive Information");
console.log(myInstance.getData()); // Output: Sensitive Information

// Accessing the "private" property (difficult, but possible)
const symbolKeys = Object.getOwnPropertySymbols(myInstance);
console.log(myInstance[symbolKeys[0]]); // Output: Sensitive Information

જ્યારે Object.getOwnPropertySymbols() હજી પણ સિમ્બોલને ખુલ્લો કરી શકે છે, તે બાહ્ય કોડ માટે "પ્રાઇવેટ" પ્રોપર્ટીને આકસ્મિક રીતે ઍક્સેસ કરવા અથવા સંશોધિત કરવાની શક્યતા ઓછી બનાવે છે. નોંધ: સાચા પ્રાઇવેટ ફિલ્ડ્સ (# પ્રીફિક્સનો ઉપયોગ કરીને) હવે આધુનિક જાવાસ્ક્રિપ્ટમાં ઉપલબ્ધ છે અને મજબૂત પ્રાઇવસી ગેરંટી આપે છે.

સિમ્બોલ્સનો ઉપયોગ કરવા માટેની શ્રેષ્ઠ પ્રથાઓ

જ્યારે સિમ્બોલ્સ સાથે કામ કરો ત્યારે ધ્યાનમાં રાખવા માટેની કેટલીક શ્રેષ્ઠ પ્રથાઓ અહીં છે:

નિષ્કર્ષ

જાવાસ્ક્રિપ્ટ સિમ્બોલ્સ અનન્ય પ્રોપર્ટી કીઝ બનાવવા, ઓબ્જેક્ટ્સ સાથે મેટાડેટા જોડવા અને ઓબ્જેક્ટના વર્તનને કસ્ટમાઇઝ કરવા માટે એક શક્તિશાળી પદ્ધતિ પ્રદાન કરે છે. સિમ્બોલ્સ કેવી રીતે કાર્ય કરે છે તે સમજીને અને શ્રેષ્ઠ પ્રથાઓનું પાલન કરીને, તમે વધુ મજબૂત, જાળવણીક્ષમ અને અથડામણ-મુક્ત જાવાસ્ક્રિપ્ટ કોડ લખી શકો છો. ભલે તમે પ્લગઇન સિસ્ટમ્સ બનાવી રહ્યા હોવ, DOM એલિમેન્ટ્સમાં મેટાડેટા ઉમેરી રહ્યા હોવ, અથવા પ્રાઇવેટ પ્રોપર્ટીઝનું અનુકરણ કરી રહ્યા હોવ, સિમ્બોલ્સ તમારા જાવાસ્ક્રિપ્ટ ડેવલપમેન્ટ વર્કફ્લોને વધારવા માટે એક મૂલ્યવાન સાધન પ્રદાન કરે છે.