जावास्क्रिप्ट में गतिशील चर नामों का उपयोग करें


344

PHP में आप इस तरह से अद्भुत / भयावह चीजें कर सकते हैं:

$a = 1;
$b = 2;
$c = 3;
$name = 'a';
echo $$name;
// prints 1

क्या जावास्क्रिप्ट के साथ ऐसा कुछ करने का कोई तरीका है?

उदाहरण के लिए, क्या मेरे पास var name = 'the name of the variable';नाम के साथ चर का संदर्भ मिल सकता है name?


2
के संभावित शिकार stackoverflow.com/questions/724857/... , और stackoverflow.com/questions/1664282/... , लेकिन स्वीकार किए जाते हैं जवाब यहाँ बेहतर, IMO।
गोयडे

क्या इससे आपके सवाल का जवाब मिलता है? जावास्क्रिप्ट में "चर" चर? । स्वीकृत उत्तर यहां एक से बेहतर है क्योंकि यह दिखाता है कि यह कैसे करना है, लेकिन यह भी सही ढंग से चेतावनी देता है कि आप जो भी करना चाहते हैं वह करने के लिए लगभग हमेशा एक बेहतर तरीका है । मेटा पर XY समस्या देखें ।
गोरगेंल

जवाबों:


353

चूंकि ECMA- / Javascript बारे में है Objectsऔर Contexts(जो, वस्तु के somekind भी कर रहे हैं), हर चर एक ऐसे कहा जाता है में संग्रहीत किया जाता Variable- एक समारोह के मामले में (या, एक्टिवेशन ऑब्जेक्ट के

तो यदि आप इस तरह चर बनाते हैं:

var a = 1,
    b = 2,
    c = 3;

में वैश्विक गुंजाइश (= सं समारोह संदर्भ), आप अप्रत्यक्ष रूप में उन चर बारे में वैश्विक वस्तु (=window एक ब्राउज़र में)।

वे "डॉट" या "ब्रैकेट" नोटेशन का उपयोग करके पहुंच सकते हैं:

var name = window.a;

या

var name = window['a'];

यह केवल, इस विशेष उदाहरण में वैश्विक वस्तु के लिए काम करता है क्योंकि चर वस्तु का वैश्विक वस्तु है windowवस्तु ही। किसी फ़ंक्शन के संदर्भ में, आपके पास सक्रियण ऑब्जेक्ट तक सीधी पहुंच नहीं है । उदाहरण के लिए:

function foobar() {
   this.a = 1;
   this.b = 2;

   var name = window['a']; // === undefined
   alert(name);
   name = this['a']; // === 1
   alert(name);
}

new foobar();

newएक स्व-परिभाषित वस्तु (संदर्भ) का एक नया उदाहरण बनाता है। newसमारोह के दायरे के बिना भी global(= खिड़की) होगा। यह उदाहरण सतर्क undefinedऔर 1क्रमशः होगा। यदि हम इसके this.a = 1; this.b = 2साथ प्रतिस्थापित करेंगे:

var a = 1,
    b = 2;

दोनों अलर्ट आउटपुट अपरिभाषित होंगे। उस परिदृश्य में, चर aऔर bसे सक्रियण ऑब्जेक्ट में संग्रहीत किया जाएगा foobar, जिसे हम एक्सेस नहीं कर सकते हैं (निश्चित रूप से हम कॉल करके aऔर सीधे उन तक पहुंच सकते हैं b)।


1
एक और अच्छी बात यह है कि इस तरह से आप किसी भी वैश्विक स्तर के फ़ंक्शन के लिए कॉलबैक (प्रारंभ / समाप्ति) जोड़ सकते हैं।
प्रतिपक्षी

5
लेकिन क्या होगा अगर मेरा डायनामिक वैरिएबल किसी फंक्शन में लोकल हो? उदाहरण के लिए: फ़ंक्शन बोनीक () {var a = 1; // यह वर्जन डायनेमिक नहीं होगा = यह ['ए']; // यह भी काम नहीं करेगा वर्जन डायनेमिक = ['ए']; }
कोकोडोको

@ कोकोडको- क्योंकि यह "संदर्भ" या किसी फ़ंक्शन के निष्पादन संदर्भ का संदर्भ नहीं है (निष्पादन संदर्भ को संदर्भित करने का कोई तरीका नहीं है, यह ECMA-262 द्वारा निषिद्ध है)। यह इस बात से निर्धारित होता है कि किसी फ़ंक्शन को कैसे (या बाइंड द्वारा ) कहा जाता है , यह सिर्फ एक ऑब्जेक्ट है जिसका निष्पादन संदर्भ से कोई लेना-देना नहीं है जिसमें यह सुलभ है।
रॉब

यदि आपको नेस्टेड प्रॉपर्टीज़ एक्सेस करने की आवश्यकता है, तो stackoverflow.com/questions/4244896/…
श्री Br

मुझे ब्रैकेट नोटेशन के साथ सही दिशा में इंगित किया। अटक गई थी सोच डॉट नोटेशन।
एंड्रयू

149

eval एक विकल्प है।

var a = 1;
var name = 'a';

document.write(eval(name)); // 1

19
नहीं यह बुराई के रूप में नहीं होना चाहिए बुराई है। कभी नहीं eval का उपयोग करें!
ईजीबीबी

52
@EasyBB - अगर आप कहने वाले हैं कि कभी भी किसी चीज का उपयोग न करें, तो मैं यह समझाने में मददगार नहीं हूं कि क्यों। मेरे पास एक ऐसी स्थिति है जिसमें मैं किसी भी अन्य तरीके के बारे में नहीं सोच सकता कि मैं क्या कर रहा हूँ जो मैं अन्य के अलावा कर रहा हूँ ()
रैंपेंट क्रिएटिव ग्रुप

4
एवल ने अंतिम उपयोगकर्ताओं पर हमलों के लिए एक जोखिम पैदा किया है और हम इसे तकनीकी रूप से बुराई नहीं मान रहे हैं, बल्कि गलत समझा गया है और एक मामले में इसका दुरुपयोग किया गया है। मैंने php प्रतिक्रियाओं को देखा है जो कि इसमें शाब्दिक संस्करण रखती हैं फिर इसे चलाने के लिए eval का उपयोग करें। हालांकि इस मामले में इसका उपयोग नहीं किया जाना चाहिए क्योंकि बेहतर तरीके हैं। हाथ से निकाले जाने वाले इस प्रश्न का उपयोग बिल्कुल नहीं किया जाना चाहिए क्योंकि कुल मिलाकर बेहतर तरीके हैं और मुझे यकीन है कि हम में से बहुत से लोग इसे जानते हैं।
ईज़ीबीबी

2
Via javascriptweblog.wordpress.com/2010/04/19/how-evil-is-eval --- "आइए विचार करें कि सबसे अधिक बार eval का उपयोग करने के खिलाफ तर्क दिए गए हैं: 1) इसके लिए एक संकलन की आवश्यकता है और इसलिए धीमी गति से 2) क्या होगा यदि दुर्भावनापूर्ण लिपि ने अपने तर्क में अपना रास्ता ढूंढ लिया! 3) यह बदसूरत 4 लग रहा है) यह निष्पादन के संदर्भ और उस दायरे के इस बंधन को विरासत में मिला है जिसमें इसका आह्वान किया गया है "
मैटलुम्मस

1
यहां बताया गया है कि eval का उपयोग करके डायनामिक वैरिएबल कैसे बनाए जाते हैं: stackoverflow.com/a/13291766/5528600
am2124429

80

आप इसे प्राप्त करने के लिए विंडो ऑब्जेक्ट का उपयोग कर सकते हैं।

window['myVar']

window आपके द्वारा उपयोग किए जा रहे सभी वैश्विक चर और वैश्विक कार्यों का संदर्भ है।


28
और कहने की जरूरत नहीं है, यह एक तरह से सुरक्षित है ()।
क्रे

45

बस यह नहीं पता कि इतने खराब जवाब को कितने वोट मिले। यह काफी आसान उत्तर है लेकिन आप इसे जटिल बनाते हैं।

// If you want to get article_count
// var article_count = 1000;
var type = 'article';
this[type+'_count'] = 1000;  // in a function we use "this";
alert(article_count);

13
"एक फ़ंक्शन में हम उपयोग करते हैं this" - यदि आप इस तरह से एक वैश्विक चर का उपयोग करना चाहते हैं , तो स्पष्ट होना बेहतर है और windowऑब्जेक्ट का उपयोग करें , न कि thisthisअस्पष्ट है।
MrWhite

1
लेकिन एक फ़ंक्शन के अंदर आप अपने उदाहरण से thisचर का उपयोग करने के लिए , या कुछ और का उपयोग नहीं कर सकते हैं type, यदि आपके पास इसका नाम दूसरे चर में है: function test(vname) { var type = 'article'; this[vname] = 'something else'; alert(type); }; test('type')दिखाएगा article, नहीं something else। और यही "जटिल उत्तर" बताते हैं।
ओराफू

28
a = 'varname';
str = a+' = '+'123';
eval(str)
alert(varname);

इसे इस्तेमाल करे...


27

यह एक उदाहरण है :

for(var i=0; i<=3; i++) {
    window['p'+i] = "hello " + i;
}

alert(p0); // hello 0
alert(p1); // hello 1
alert(p2); // hello 2
alert(p3); // hello 3

एक और उदाहरण :

var myVariable = 'coco';
window[myVariable] = 'riko';

alert(coco); // display : riko

तो, myVariable का मूल्य " कोको " एक चर कोको बन जाता है ।

क्योंकि वैश्विक दायरे में सभी चर विंडो ऑब्जेक्ट के गुण हैं।


14

जावास्क्रिप्ट में आप इस तथ्य का उपयोग कर सकते हैं कि सभी गुण मुख्य मूल्य जोड़े हैं। jAndy ने पहले ही इस बात का उल्लेख किया है लेकिन मुझे नहीं लगता कि उनका जवाब दिखा कि इसका कैसे फायदा उठाया जा सकता है।

आमतौर पर आप वैरिएबल नाम रखने के लिए एक वैरिएबल बनाने की कोशिश नहीं कर रहे हैं, लेकिन वैरिएबल नाम बनाने की कोशिश कर रहे हैं और फिर उनका इस्तेमाल करते हैं। PHP $$varसंकेतन के साथ करता है, लेकिन जावास्क्रिप्ट की आवश्यकता नहीं है क्योंकि संपत्ति कुंजी सरणी कुंजियों के साथ विनिमेय हैं।

var id = "abc";
var mine = {};
mine[id] = 123;
console.log(mine.abc);

123 देता है। आमतौर पर आप वैरिएबल का निर्माण करना चाहते हैं, यही वजह है कि अप्रत्यक्ष है इसलिए आप इसे दूसरे तरीके से भी कर सकते हैं।

var mine = {};
mine.abc = 123;
console.log(mine["a"+"bc"]);

1
var someJsonObj = {}; एक लूप में .... के लिए (var i = 0; i <= 3; i ++) {someJsonObj [i] =>]; }, लेकिन मैं कुछ भी हो सकता हूं। इतना गतिशील रूप से उत्पन्न चर, सभी आसान संदर्भ के लिए someJsonObj के अंदर बैठते हैं।
राजीव

5

2019

टी एल; डॉ

  • eval ऑपरेटर इस संदर्भ में स्ट्रिंग अभिव्यक्ति चला सकता है और उस संदर्भ से चर वापस कर सकता है;
  • literal objectसैद्धांतिक रूप से लिखकर ऐसा कर सकते हैं: {[varName]}लेकिन यह परिभाषा द्वारा अवरुद्ध है।

इसलिए मैं इस सवाल पर आता हूं और यहां हर कोई असली समाधान लाए बिना ही खेलता है। लेकिन @Axel Heider के पास अच्छी पहुंच है।

उपाय है eval। लगभग सबसे भूला हुआ ऑपरेटर। (लगता है कि सबसे एक हैwith() )

evalऑपरेटर गतिशील रूप से अभिव्यक्ति को उस संदर्भ में चला सकता है जिसे कहा जाता है। और उस अभिव्यक्ति का परिणाम लौटाते हैं। हम फ़ंक्शन के संदर्भ में एक चर के मूल्य को गतिशील रूप से वापस करने के लिए उपयोग कर सकते हैं।

उदाहरण:

function exmaple1(){
   var a = 1, b = 2, default = 3;
   var name = 'a';
   return eval(name)
}

example1() // return 1


function example2(option){
  var a = 1, b = 2, defaultValue = 3;

  switch(option){
    case 'a': name = 'a'; break;
    case 'b': name = 'b'; break;
    default: name = 'defaultValue';
  }
  return eval (name);
}

example2('a') // return 1
example2('b') // return 2
example2() // return 3

ध्यान दें कि मैं हमेशा स्पष्ट रूप से लिखता हूं अभिव्यक्ति evalचलेगी। कोड में अनावश्यक आश्चर्य से बचने के लिए। evalबहुत मजबूत है लेकिन मुझे यकीन है कि आप पहले से ही जानते हैं

BTW, अगर यह कानूनी था तो हम literal objectचर नाम और मूल्य पर कब्जा करने के लिए उपयोग कर सकते थे, लेकिन हम गणना की संपत्ति के नाम और संपत्ति के मूल्य को शॉर्टहैंड नहीं कर सकते, दुख की बात है, अमान्य है

functopn example( varName ){
    var var1 = 'foo', var2 ='bar'

    var capture = {[varName]}

}

example('var1') //trow 'Uncaught SyntaxError: Unexpected token }`

यह एक तेज़ समाधान है, लेकिन यह एक बुरा अभ्यास है क्योंकि यह सुरक्षित नहीं है और प्रदर्शन को कम करता है क्योंकि JS इंजन उस पद्धति का अनुकूलन नहीं कर सकता है।
डिएगो ऑर्टिज़

बहुत बढ़िया समाधान
रोहित पराते

4

यदि आप किसी वैश्विक ऑब्जेक्ट जैसे विंडो या ग्लोबल (नोड) का उपयोग नहीं करना चाहते हैं, तो आप कुछ इस तरह की कोशिश कर सकते हैं:

var obj = {};
obj['whatever'] = 'There\'s no need to store even more stuff in a global object.';

console.log(obj['whatever']);

4

मुझे मक्खी और ऑब्जेक्ट तरीके से अच्छी तरह से काम करने के लिए कई फॉर्मडैट खींचने की जरूरत थी

var forms = {}

फिर मेरे लूप में जहां भी मुझे एक फॉर्म डेटा बनाने की ज़रूरत थी, जिसका मैंने इस्तेमाल किया

forms["formdata"+counter]=new FormData();
forms["formdata"+counter].append(var_name, var_value);

धन्यवाद ... यह पूरी तरह से मुझे बचा लिया! यह $ refs ['listView' + index] .nativeView.animate ({..}) मुझे इस तरह से refs के अंदर var की आवश्यकता है। $ refs.listView1 listView2 और इतने पर ...
Meiki Neumann

2

यह उन लोगों के लिए एक विकल्प है जिन्हें डायनामिक रूप से नामित चर निर्यात करने की आवश्यकता है

export {
  [someVariable]: 'some value',
  [anotherVariable]: 'another value',
}

// then.... import from another file like this:
import * as vars from './some-file'

एक अन्य विकल्प केवल एक ऑब्जेक्ट बनाना है, जिसकी चाबियाँ गतिशील रूप से नामित की जाती हैं

const vars = { [someVariable]: 1, [otherVariable]: 2 };

// consume it like this
vars[someVariable];

1

उनका मतलब है कि नहीं, आप नहीं कर सकते। इसे पूरा करने का कोई तरीका नहीं है। इसलिए यह संभव था कि आप ऐसा कुछ कर सकें

function create(obj, const){
// where obj is an object and const is a variable name
function const () {}

const.prototype.myProperty = property_value;
// .. more prototype

return new const();

}

ईसीएमएस्क्रिप्ट 5 में लागू किए गए एक की तरह एक फ़ंक्शन बनाएं।


4
खबरदार: कास्ट ईएस 6 में एक कीवर्ड है
तेजस मनोहर

4
... और उससे पहले एक भविष्य आरक्षित शब्द था
टीजे क्राउडर

वहाँ evalऑपरेटर
Pery मिमोन

1

eval () मेरे परीक्षणों में काम नहीं आया। लेकिन DOM ट्री में नया जावास्क्रिप्ट कोड जोड़ना संभव है। तो यहाँ एक फ़ंक्शन है जो एक नया चर जोड़ता है:

function createVariable(varName,varContent)
{
  var scriptStr = "var "+varName+"= \""+varContent+"\""

  var node_scriptCode = document.createTextNode( scriptStr )
  var node_script = document.createElement("script");
  node_script.type = "text/javascript"
  node_script.appendChild(node_scriptCode);

  var node_head = document.getElementsByTagName("head")[0]
  node_head.appendChild(node_script);
}

createVariable("dynamicVar", "some content")
console.log(dynamicVar)

2
छोटे सुधार, var node_head = document.getElementsByTagName("head")[0]आईडी के बजाय इसका उपयोग करना बेहतर है , क्योंकि कोई भी व्यक्ति id="head"को <head>:-) नहीं देता है
ddlab

मैं करता हूं :) लेकिन धन्यवाद, अब मैं अंत में इस `आईडी =" सिर "चीज को हटा सकता हूं
एक्सल हेदर

1
यह सिर्फ एक वैश्विक चर बनाने का एक अत्यधिक जटिल तरीका लगता है ?! ... (और यह सवाल का जवाब कैसे देता है?)
Mrhhite

प्रतिभाशाली :) eval समाधान है। भले ही आपका कोड काम नहीं करता हो
pery mimon

1

यद्यपि इसका एक स्वीकृत उत्तर है, मैं एक अवलोकन जोड़ना चाहूंगा:

ES6 में let काम नहीं करता है :

/*this is NOT working*/
let t = "skyBlue",
    m = "gold",
    b = "tomato";

let color = window["b"];
console.log(color);

हालाँकि कार्यों का उपयोग करनाvar

/*this IS working*/
var t = "skyBlue",
    m = "gold",
    b = "tomato";

let color = window["b"];
console.log(color);

मुझे उम्मीद है कि यह कुछ के लिए उपयोगी हो सकता है।


1
वहीconst

1
सच। लेकिन आप चर के साथ एक वस्तु बना सकते हैं और वहाँ से चर का चयन कर सकते हैं const vars = { t, m, b }; console.log(vars['b']):। अन्यथा evalकाम भी करता है।
बजे फैबियन वॉन एलर्ट्स

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.