54

वहाँ निम्नलिखित में से किसी के लिए इसी तरह कुछ करने के लिए एक रास्ता है: - या -परिवर्तनीय ऑपरेटर संभव हैं?

var1 = 10; var2 = 20; 
var operator = "<"; 
console.log(var1 operator var2); // returns true 

var1 = 10; var2 = 20; 
var operator = "+"; 
total = var1 operator var2; // total === 30 

उत्तर

104

बॉक्स से बाहर नहीं होने के लिए फ़ंक्शन का उपयोग कर सकते हैं। हालांकि, जेएस सहित कई भाषाओं में हाथ से निर्माण करना आसान है।

var operators = { 
    '+': function(a, b) { return a + b }, 
    '<': function(a, b) { return a < b }, 
    // ... 
}; 

var op = '+'; 
alert(operators[op](10, 20)); 

आप तार के माध्यम से जाने से बचने की plus तरह ascii आधारित नाम का उपयोग कर सकते हैं, अगर आप की जरूरत नहीं है। हालांकि, इस के समान प्रश्नों में से आधे से पूछा गया था क्योंकि किसी के पास ऑपरेटर का प्रतिनिधित्व करने वाले तार थे और उनसे कार्य चाहते थे।

6

आप eval() समारोह का उपयोग कर सकते हैं, लेकिन यह एक अच्छा विचार नहीं है। मुझे लगता है कि बेहतर तरीका इस तरह अपने ऑपरेटरों के लिए काम करता है लिख रहा है:

var addition = function(first, second) { 
    return first+second; 
}; 

var subtraction = function(first, second) { 
    return first-second; 
}; 

var operator = addition; 

alert(operator(12, 13)); 

var operator = subtraction; 

alert(operator(12, 13)); 
2

आप जावास्क्रिप्ट में ऑपरेटरों को ओवरलोड नहीं कर सकते। आप

var plus = function(a, b) { 
    return a + b; 
}; 

var smaller = function(a, b) { 
    return a < b; 
}; 

var operator = plus; 
var total = operator(a, b); 
operator = smaller; 
if(operator(var1, var2)){ /*do something*/ } 
5

मुझे विश्वास है कि आप एक चर ऑपरेटर चाहते हैं। ऑब्जेक्ट के रूप में बनाया गया है, यहां एक है। आप को बदलने के द्वारा वर्तमान कार्रवाई बदल सकते हैं: एक और उत्तर मैं हाल ही में पोस्ट से

[yourObjectName].operation = "<" //changes operation to less than 


function VarOperator(op) { //you object containing your operator 
    this.operation = op; 

    this.evaluate = function evaluate(param1, param2) { 
     switch(this.operation) { 
      case "+": 
       return param1 + param2; 
      case "-": 
       return param1 - param2; 
      case "*": 
       return param1 * param2; 
      case "/": 
       return param1/param2; 
      case "<": 
       return param1 < param2; 
      case ">": 
       return param1 > param2; 
     } 
    } 
} 

//sample usage: 
var vo = new VarOperator("+"); //initial operation: addition 
vo.evaluate(21,5); // returns 26 
vo.operation = "-" // new operation: subtraction 
vo.evaluate(21,5); //returns 16 
vo.operation = ">" //new operation: ">" 
vo.evaluate(21,5); //returns true 
3

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

var actions = []; 
var overload = { 
    valueOf: function(){ 
    var caller = arguments.callee.caller; 
    actions.push({ 
     operation: caller.name, 
     left: caller.arguments[0] === this ? "unknown" : this, 
     right: caller.arguments[0] 
    }); 
    return Object.prototype.toString.call(this); 
    } 
}; 
overload.toString = overload.valueOf; 
overload == 10; 
overload === 10; 
overload * 10; 
10/overload; 
overload in window; 
-overload; 
+overload; 
overload < 5; 
overload > 5; 
[][overload]; 
overload == overload; 
console.log(actions); 

आउटपुट:

[ { operation: 'EQUALS', 
    left: overload, 
    right: 10 }, 
    { operation: 'MUL', 
    left: overload, 
    right: 10 }, 
    { operation: 'DIV', 
    left: 'unknown', 
    right: overload }, 
    { operation: 'IN', 
    left: overload, 
    right: DOMWindow }, 
    { operation: 'UNARY_MINUS', 
    left: overload, 
    right: undefined }, 
    { operation: 'TO_NUMBER', 
    left: overload, 
    right: undefined }, 
    { operation: 'COMPARE', 
    left: overload, 
    right: 5 }, 
    { operation: 'COMPARE', 
    left: 'unknown', 
    right: overload }, 
    { operation: 'ToString', 
    left: 'unknown', 
    right: overload } ] 

इस बिंदु आप सभी आदानों और ऑपरेशन है, तो शेष भाग आपरेशन का परिणाम है पर। ऑपरेशन के रिसीवर को एक प्राथमिक मूल्य मिलेगा, या तो स्ट्रिंग या नंबर, और आप इसे रोक नहीं सकते हैं। यदि यह एक मनमाना रिसीवर नहीं है, तो उस वर्ग का एक उदाहरण कहें जिसे आपने ऑपरेटर ओवरलोड किया है, आप इनकमिंग वैल्यू/ओवरराइटिंग को रोकने के लिए विभिन्न गेट/सेट जाल को संभाल सकते हैं। आप कुछ केंद्रीय लुकअप में ऑपरेंड और ऑपरेशन को स्टोर कर सकते हैं और इसे उत्पन्न करने वाले ऑपरेशन के लिए एक आदिम मूल्य का पता लगाने के लिए एक सरल विधि का उपयोग कर सकते हैं, और फिर जो भी तर्क आप अपने कस्टम ऑपरेशन करना चाहते हैं उसे बनाएं। एक अन्य विधि जो मनमाने ढंग से रिसीवरों को अनुमति देगी जिसे बाद में जटिल रूपों में पुनर्निर्मित किया जा सकता है, डेटा को आदिम मूल्य में एन्कोड करने में होगा ताकि इसे आपकी जटिल कक्षा में वापस लाया जा सके। जैसे कि 3 अलग-अलग 8 बिट पूर्णांक (255,255,255) के आरजीबी मान को अंतराल पर एक ही संख्या में परिवर्तित किया जा सकता है और रिसीवर अंत इसे वापस अपने जटिल घटकों में परिवर्तित कर सकता है। या अधिक जटिल डेटा के लिए आप एक JSON क्रमबद्ध स्ट्रिंग भी वापस कर सकते हैं।

सद्भावना प्रॉक्सी (फ़ायरफ़ॉक्स 6 +, ध्वज के साथ नोडज) तक पहुंच होने से यह पूरी प्रक्रिया बेहद आसान हो जाती है, क्योंकि आप मूल रूप से सबकुछ पर फंसे हुए प्रॉक्सी बना सकते हैं और पूरी प्रक्रिया को अंत तक अंत तक आत्मनिर्भर कर सकते हैं और जो कुछ भी आप चाहते हैं उसे कर सकते हैं। 0/

2

हम सभी संभावित मूल्यों के मूल्यवर्ती उदाहरण, आंतरिक इंजन तक पहुंच सकते हैं, किसी भी रिसीवर ऑब्जेक्ट के बारे में पूर्व-जागरूकता, और यहां तक ​​कि मनमाने ढंग से रिसीवर को भी जाल कर सकते हैं। eval का उपयोग करके इसे कार्यान्वित कर सकते हैं, क्योंकि हम इसे ऑपरेटर जांच के लिए उपयोग कर रहे हैं।

var number1 = 30; 
var number2 = 40; 
var operator = "==="; 

function evaluate(param1, param2, operator) { 
    return eval(param1 + operator + param2); 
} 

if(evaluate(number1, number2, operator)) { 
} 

इस तरह हम गतिशील ऑपरेटर मूल्यांकन का उपयोग कर सकते हैं।

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