2010-01-08 18 views
10

मुझे लगता है कि सिर्फ इस तरह दिखता है एक छोटे से कोड का सा है:)जावास्क्रिप्ट में evalatives के विकल्प क्या हैं?

function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) { 
    this.i = []; 
    for (var i=1,j=0 ;i<9;i++) { 
     var k = eval("i"+i); 
     if (k > 0) { 
      this.i[j++] = k; 
     } 
    } 
} 

FireBug प्रोफाइलर दावों दूसरा सबसे लंबे समय तक समारोह eval है कि (, रन समय की लगभग 6% तक ले जा।

Everyone says eval is EVIL (खराब में) और धीमा (जैसा कि मैंने पाया है), लेकिन मैं वास्तव में कुछ और नहीं कर सकता - सर्वर बस डेटाबेस को डेटा खींचता है और ब्राउज़र पर धक्का देता है।

मेरे पास कौन से विकल्प हैं? मैं वही कर सकता हूं जैसा कि मैं सर्वर पर कर रहा हूं लेकिन यह बोझ को चेन को ऊपर ले जाता है। मैं डेटाबेस लेआउट को बदल नहीं सकता क्योंकि सबकुछ उन 8 चरों में हुक करता है और यह एक बड़े उपक्रम है।

+3

उम्मीद है कि इससे लोगों को यह दिखाने में मदद मिलेगी कि आपको कभी भी 'eval' का उपयोग नहीं करना पड़ेगा। – ChaosPandion

उत्तर

13
function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) { 
    var args = [i1, i2, i3, i4, i5, i6, i7, i8]; // put values in an array 
    this.i = []; 
    for (var i=0,j=0 ;i<8;i++) { // now i goes from 0-7 also 
     var k = args[i]; // get values out 
     if (k > 0) { 
      this.i[j++] = k; 
     } 
    } 
} 

उपरोक्त कोड को और सरल बनाया जा सकता है, मैंने eval से छुटकारा पाने के लिए न्यूनतम परिवर्तन किया है। आप j से छुटकारा पा सकते हैं, उदाहरण के लिए:

function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) { 
    var args = [i1, i2, i3, i4, i5, i6, i7, i8]; 
    this.i = []; 
    for (var i = 0; i < args.length; i++) { 
     var k = args[i]; 
     if (k > 0) { this.i.push(k); } 
    } 
} 

समकक्ष है। या, (दो स्थानों पर अपने पैरामीटर सूची से बचने के लिए) में निर्मित arguments वस्तु का उपयोग करें:

function StrippedExample(i1, i2, i3, i4, i5, i6, i7, i8) { 
    this.i = []; 
    for (var i = 1; i < arguments.length; i++) { 
     var k = arguments[i]; 
     if (k > 0) { this.i.push(k); } 
    } 
} 

यहां तक ​​कि आप सूची को फ़िल्टर नहीं किए गए हैं, तो आप this.i = arguments की तरह कुछ करने के लिए नहीं करना चाहती क्योंकि arguments असली ऐरे नहीं है; इसमें callee संपत्ति है जिसकी आपको आवश्यकता नहीं है और i में आपको कुछ सरणी विधियों की आवश्यकता हो रही है। के रूप में अन्य लोगों ने बताया है, यदि आप जल्दी से एक सरणी में arguments वस्तु परिवर्तित करना चाहते हैं, तो आप इस अभिव्यक्ति के साथ ऐसा कर सकते हैं:

Array.prototype.slice.call(arguments) 

आप उपरोक्त var args = [i1, i2 ... लाइनों के बजाय कि इस्तेमाल कर सकते हैं।

+1

यह कोड वर्तमान में गलत है, क्योंकि यह 1-अनुक्रमणिका का उपयोग कर रहा है जबकि सरणी 0-अनुक्रमित है। यह निश्चित रूप से इसकी तुलना में निश्चित रूप से अधिक जटिल है, क्योंकि आप केवल 'तर्क' को 'तर्क' सरणी के साथ बदल सकते हैं, और इसे स्वयं परिभाषित नहीं कर सकते हैं। –

+0

उस पकड़ने के लिए धन्यवाद, ब्रायन। मुझे लगता है कि मैंने इसे ठीक किया है। – benzado

+1

अब आप मूल से 'if (k> 0) 'भाग को याद कर चुके हैं। –

5
  1. कॉल एक तर्क के साथ समारोह - एक सरणी
  2. उपयोग arguments वस्तु
1

इस कोड arguments सरणी हर जावास्क्रिप्ट समारोह की पहुंच न हो उपयोग करने के लिए किया जाना चाहिए।

ऐसा नहीं है कि eval नहीं है बुराई (यह, लिस्प में है, इसलिए इसमें अच्छा होना चाहिए) यह बस एक हैक का एक संकेत है है - आप काम करने के लिए कुछ की जरूरत है और आप इसे मजबूर कर दिया। यह मेरे लिए चिल्लाता है "लेखक ने अच्छे प्रोग्रामिंग डिजाइन को छोड़ दिया और बस कुछ काम किया जो"।

+0

मैं जावास्क्रिप्ट के सभी इन्स और बहिष्कारों के साथ एयू फ़ैट नहीं हूं। मैं चीजों को पूरा करने के लिए चारों ओर हैक कर सकता हूं, लेकिन जैसा कि यहां प्रदर्शित किया गया है, यह हमेशा सबसे अच्छा तरीका नहीं है। –

0

यह देखते हुए कि एक निश्चित मात्रा में चर है, आप मैन्युअल रूप से उनमें से एक सरणी बना सकते हैं और इसके माध्यम से लूप कर सकते हैं।लेकिन अगर आप तर्क की एक परिवर्तनीय मात्रा है, एक तरह से चर एक सरणी के रूप में कार्य करने के लिए पारित कर दिया पाने के लिए है:

var args = Array.prototype.slice.call(arguments.callee.caller.arguments); 

और अपने कार्य इस प्रकार दिखाई देगा:

function StrippedExample() { 
    var args = Array.prototype.slice.call(arguments.callee.caller.arguments); 
    for(var i in args) { 
     if (args[i] > 0) { 
      this.i[j++] = args[i]; 
     } 
    } 
} 
+0

आपको के साथ तर्क संपादित करने की आवश्यकता है [i] और j –

+2

प्रारंभ करना आपको सरणी को फिर से करने के लिए 'for..in' का उपयोग नहीं करना चाहिए। लूप के लिए एक सरल 'बेहतर है। – JPot

7

आप बस कर रहे हैं आपके फ़ंक्शन 8 तर्कों से एक सरणी बनाना, जो शून्य से कम या बराबर वाले को हटा रहा है।

निम्नलिखित कोड बराबर है, और यह तर्क के किसी भी मनमाना संख्या के लिए काम करेंगे: अलग-अलग तर्क के बजाय अपने कार्य करने के लिए एक सरणी पारित करने के लिए करने के लिए

function StrippedExample() { 
    var args = []; 

    for (var i = 0; i < arguments.length; i++) { 
    if (arguments[i] > 0) { 
     args.push(arguments[i]); 
    } 
    } 
    //... 
} 
+0

'if (k> 0) 'भाग को न भूलें। – JPot

+0

@JPot, धन्यवाद, हालत जोड़ा ... – CMS

4

एक वैकल्पिक:

StrippedExample([3, 1, 4, 1, 5, 9, 2, 6]) 

फिर अपने कोड होगा:

function StrippedExample(inArray) { 
    this.i = []; 
    for (var i=0,j=0 ;i<inArray.length;i++) { 
     var k = inArray[i]; 
     if (k > 0) { 
      this.i[j++] = k; 
     } 
    } 
} 

तुम सच में अलग में पारित करने के लिए की जरूरत है तर्क, आप अपने arguments सरणी का उपयोग करके उन तक पहुंच सकते हैं, जो एक ऑब्जेक्ट है जो सरणी की तरह कार्य करता है (हालांकि यह वास्तव में नहीं है; सभी ऐरे विधियों पर काम नहीं करते हैं) जो आपके कार्य में पारित किए गए सभी तर्कों का खुलासा करता है; वे भी इस मामले में घोषित किए जाने की जरूरत नहीं है, लेकिन यह अच्छे फार्म है एक टिप्पणी का संकेत तर्क आप अपने कोड के उपयोगकर्ताओं के लिए उम्मीद कर रहे हैं किस तरह के शामिल करने के लिए:

function StrippedExample(/*i1, i2, i3, i4, i5, i6, i7, i8*/) { 
    this.i = []; 
    for (var i=0,j=0 ;i<arguments.length;i++) { 
     var k = arguments[i]; 
     if (k > 0) { 
      this.i[j++] = k; 
     } 
    } 
} 

आप की गारंटी कर रहे हैं केवल 8 है तत्व, तो आप inArray.length या arguments.length के स्थान पर 8 का उपयोग कर सकते हैं; मैंने आपके उदाहरणों में अधिक सामान्य संस्करण का उपयोग करने का फैसला किया है, जो आपके लिए उपयोगी था।

+0

मुझे 10 सेकंड से हराया .. –

1
function StrippedExample() { 

    this.i = []; 
    for (var i=1,j=0 ;i<arguments.length;i++) { 
     var k = arguments[i]; 
     if (k > 0) { 
      this.i[j++] = k; 
     } 
    } 
} 
0

Eval विकल्प:

exp = '1 + 1' 
x = Function('return ' + exp)() 
console.log(x) 

यह आपके लिए क्या देख रहे हैं?

संबंधित मुद्दे