2010-07-21 8 views
157

मैं जानता हूँ कि PHP में हम कुछ इस तरह कर सकते हैं:कैसे जावास्क्रिप्ट में तार में चर अंतर्वेशन को, संयोजन के बिना?

$hello = "foo"; 
$my_string = "I pity the $hello"; 

आउटपुट: "I pity the foo"

मैं अगर यह एक ही बात के साथ-जावास्क्रिप्ट में संभव है सोच रहा था। संयोजन का उपयोग किए बिना तार के अंदर चर का उपयोग करना - यह अधिक संक्षिप्त और लिखने के लिए सुरुचिपूर्ण लग रहा है।

उत्तर

264

फ़ायरफ़ॉक्स 34/क्रोम 41/सफारी से शुरू करने के लिए आवश्यक लिख सकता है, esp सामान्य नहीं है 9/माइक्रोसॉफ्ट एज आप एक ES2015/ES6 सुविधा Template Literals कहा जाता है का उपयोग करें और इस वाक्य विन्यास का उपयोग कर सकते हैं:

`String text ${expression}` 

खाका शाब्दिक वापस टिक (``) (कब्र लहजे) के बजाय डबल या एकल कोट्स में रहे हैं।

उदाहरण:

var a = 5; 
var b = 10; 
console.log(`Fifteen is ${a + b}.`); 
// "Fifteen is 15. 

कि कैसे साफ है?

बोनस:

यह भी बहु लाइन स्ट्रिंग्स के लिए जावास्क्रिप्ट में भागने के बिना, की अनुमति देता है टेम्पलेट्स के लिए अच्छा है:

return ` 
    <div class="${foo}"> 
     ... 
    </div> 
`; 

Browser support:

इस वाक्य रचना है पुराने ब्राउज़र (इंटरनेट एक्सप्लोरर और सफारी < = 8) द्वारा समर्थित नहीं है, तो आपउपयोग कर सकते हैं 0 ES5 में अपने कोड transpile करने के लिए इसे हर जगह चला जाएगा सुनिश्चित करने के लिए।


साइड नोट:

IE8 से शुरू + आप बुनियादी स्ट्रिंग console.log अंदर स्वरूपण का उपयोग कर सकते हैं:

console.log('%s is %d.', 'Fifteen', 15); 
// Fifteen is 15. 
+22

इस तथ्य को याद न करें कि टेम्पलेट स्ट्रिंग को आपके सामान्य उद्धरण वर्णों के बजाय बैक टिक (\ ') के साथ सीमित किया गया है। '" $ {foo} "' सचमुच $ {foo} '\' $ {foo} \ '' जो वास्तव में आप चाहते हैं – Hovis

+1

इसके अलावा ईएस 6 को ईएस 5 में संगतता समस्या को ठीक करने के लिए कई ट्रांसलेटर हैं! – Omid

145

Prior to फ़ायरफ़ॉक्स 34/क्रोम 41/सफारी 9/माइक्रोसॉफ्ट एज, नहीं, कि संभव नहीं जावास्क्रिप्ट में था।

var hello = "foo"; 
var my_string = "I pity the " + hello; 
+2

यह जल्द ही जावास्क्रिप्ट खाका स्ट्रिंग्स के साथ (ES6) में संभव हो जाएगा उपयोग करने के लिए याद है, नीचे मेरी विस्तृत जवाब – bformet

+0

देखते हैं। [यह है संभव] (http://stackoverflow.com/a/28497562/1189651) यदि आप कॉफीस्क्रिप्ट लिखना पसंद करते हैं, जो वास्तव में एक बेहतर वाक्यविन्यास के साथ जावास्क्रिप्ट है। – bformet

37

Prior to फ़ायरफ़ॉक्स 34/क्रोम 41/सफारी 9/माइक्रोसॉफ्ट एज, कोई: आप का सहारा लेना होगा। यद्यपि आप sprintf for JavaScript की कोशिश कर सकते आधे रास्ते वहाँ पहुँचने के लिए:

var hello = "foo"; 
var my_string = sprintf("I pity the %s", hello); 
+0

धन्यवाद। यदि आप डोजो का उपयोग कर रहे हैं, तो स्प्रिंटफ मॉड्यूल के रूप में उपलब्ध है: http://bill.dojotoolkit.org/api/1।9/डोजॉक्स/स्ट्रिंग/स्पिंटफ – user64141

4

आप microtemplating के लिए प्रक्षेप करने का प्रयास कर रहे हैं, मुझे लगता है कि इस प्रयोजन के लिए Mustache.js पसंद है।

18

अच्छी तरह से आप यह कर सकते हैं, लेकिन यह

'I pity the $fool'.replace('$fool', 'fool') 

आप आसानी से एक समारोह है कि इस समझदारी से करता है यदि आप वास्तव में

+1

अच्छा है, लेकिन मुझे लगता है कि एक प्रदर्शन हिट होगा। –

7

तुम कर सकते हो तुम CoffeeScript लिखना पसंद हैं:

hello = "foo" 
my_string = "I pity the #{hello}" 

कॉफीस्क्रिप्ट वास्तव में जावस्क है रिप्ट, लेकिन एक बेहतर वाक्यविन्यास के साथ।

कॉफीस्क्रिप्ट के एक सिंहावलोकन के लिए यह beginner's guide देखें।

3

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

function createStringFromTemplate(template, variables) { 
    return template.replace(new RegExp("\{([^\{]+)\}", "g"), function(_unused, varName){ 
     return variables[varName]; 
    }); 
} 

createStringFromTemplate(
    "I would like to receive email updates from {list_name} {var1} {var2} {var3}.", 
    { 
     list_name : "this store", 
     var1  : "FOO", 
     var2  : "BAR", 
     var3  : "BAZ" 
    } 
); 

आउटपुट: "I would like to receive email updates from this store FOO BAR BAZ."

String.replace() फ़ंक्शन करने के लिए एक तर्क के रूप में एक समारोह का उपयोग करना ECMAScript v3 कल्पना का हिस्सा था। अधिक जानकारी के लिए this SO answer देखें।

+0

क्या यह कुशल है? – momomo

+0

दक्षता उपयोगकर्ता के ब्राउज़र पर काफी हद तक निर्भर करेगी, क्योंकि यह समाधान रेगेक्स से मेल खाने और ब्राउजर के मूल कार्यों में स्ट्रिंग प्रतिस्थापन करने के "भारी उठाने" का प्रतिनिधित्व करता है। किसी भी मामले में, चूंकि यह ब्राउज़र-पक्ष पर हो रहा है, वैसे भी, दक्षता इतनी बड़ी चिंता नहीं है। यदि आप सर्वर-साइड टेम्पलेटिंग (नोड.जेएस या इसी तरह के लिए) चाहते हैं तो आपको @bformet द्वारा वर्णित ES6 टेम्पलेट अक्षर समाधान का उपयोग करना चाहिए, क्योंकि यह अधिक कुशल है। – Eric

5

पूरा जवाब है, तैयार इस्तेमाल किया जा:

var Strings = { 
     create : (function() { 
       var regexp = /{([^{]+)}/g; 

       return function(str, o) { 
        return str.replace(regexp, function(ignore, key){ 
          return (key = o[key]) == null ? '' : key; 
        }); 
       } 
     })() 
}; 

कॉल के रूप में

Strings.create("My firstname is {first}, my last name is {last}", {first:'Neo', last:'Andersson'}); 

यह संलग्न करने के लिए String.prototype रहे हैं:

String.prototype.create = function(o) { 
      return Strings.create(this, o); 
} 

तब के रूप में उपयोग:

"My firstname is ${first}".create({first:'Neo'}); 
1

मैं इस NPM पैकेज stringinject https://www.npmjs.com/package/stringinject जो आप निम्नलिखित

var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]); 

जो बदल देगा {0} और {1} सरणी आइटम के साथ और वापसी निम्न स्ट्रिंग

"this is a test string for stringInject" 
करने की अनुमति देता लिखा था

या तुम इतनी तरह और वस्तु कुंजी के साथ प्लेसहोल्डर मूल्यों की जगह सकता है:

var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" }); 

"My username is tjcafferkey on Github" 
0

ठीक है, आप this is ${variable} का उपयोग कर सकते हैं या आप "this is "+variable का उपयोग कर सकते हैं इन दोनों में से अच्छी तरह से काम करते हैं।

इसके अलावा टिल्डा (``) के बजाय "की this is ${variable} या 'चारों ओर कुंजी

+0

यह उत्तर डुप्लिकेट की तरह दिखता है। –

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