2015-08-28 6 views
7

जावास्क्रिप्ट ES6 के नए टेम्पलेट स्ट्रिंग (फ़ायरफ़ॉक्स में, यदि यह मायने रखता है) का परीक्षण करते समय, मैंने उनके प्रकारों में कुछ विसंगतियों को देखा।जावास्क्रिप्ट ES6 टेम्पलेट स्ट्रिंग्स के लिए असंगत प्रकार

मैं एक कस्टम समारोह में परिभाषित किया गया, इस तरह:

function f(a) { 
    console.log(typeof(a)); 
    console.log(a); 
} 

पहले, मैं समारोह "सामान्य रूप से" परीक्षण किया है, टेम्पलेट स्ट्रिंग के आसपास कोष्ठकों का उपयोग।

f(`Hello, World!`) 

जैसी उम्मीद थी, इस string और Hello, World! का एक प्रकार सामने आए कंसोल के लिए outputted था।

फिर मैंने फ़ंक्शन शॉर्टैंड को बिना किसी कोष्ठक के बुलाया, और असंगतताएं हुईं।

f`Hello, World!` 

प्रकार object बन गया, और Array [ "Hello, World!" ] कंसोल के लिए outputted था।

दूसरी विधि का उपयोग करते समय टेम्पलेट स्ट्रिंग को सरणी में क्यों लपेटा गया था? क्या यह फ़ायरफ़ॉक्स में बस एक बग है (ES6 एक नया मानक है), या यह व्यवहार किसी कारण से अपेक्षित है?

+1

'कंसोल.लॉग \ '$ {1} b $ {2} c \';' क्या हो रहा है बेहतर समझने के लिए '' {{}} $ {2} सी \ 'प्रयास करें। कोष्ठक को छोड़कर, आपने अपने कथन का अर्थ पूरी तरह से बदल दिया है: आप बस फ़ंक्शन को और कॉल नहीं कर रहे हैं, लेकिन आप एक * टैग किए गए टेम्पलेट * का उपयोग कर रहे हैं। हाँ, यह वाक्यविन्यास बेकार है। – Blackhole

उत्तर

2
// A function call, passed the result of a template literal. 
f(`str`) 

और

// A tagged template call, passed metadata about a template. 
f`str` 

ही नहीं हैं। पहली बार f एक तर्क के रूप में एकल स्ट्रिंग के साथ कॉल करता है। दूसरा टेम्पलेट के आधार पर कई पैरामीटर के साथ f पर कॉल करता है। जैसे

f`one${2}three${4}five` 

से होकर गुजरेगा f

f(strings, ...values) 

strings 
// ['one', 'three', 'five'] 

जो टेम्पलेट की स्ट्रिंग वर्गों के सभी की एक सूची है, और

values 
// [2, 4] 

जो सभी कर रहे हैं के साथ

मूल्यों का है कि तारों के बीच फिट। यह टैग को स्ट्रिंग को प्रीप्रोसेस करने और इसे संसाधित करने की अनुमति देता है।

documentation on MDN can help more

+0

एक 36k प्रतिनिधि उपयोगकर्ताओं से, मुझे विनिर्देश के लिए एक लिंक सूचीबद्ध करने की उम्मीद थी। थोड़ा निराश – Blackhole

+0

मदद के लिए धन्यवाद! मैंने यह सुझाव जोड़ने का सुझाव दिया है कि इस वाक्यविन्यास को टैग किए गए टेम्पलेट स्ट्रिंग कहा जाता है, जैसा कि मैंने भविष्य में खोजकर्ताओं की सहायता के लिए @ ब्लैकहोल की टिप्पणी से सीखा है। यह जवाब सहायक और जानकारीपूर्ण था। – jrich

+0

@UndefinedFunction: इसे "टैग किए गए टेम्पलेट" (कोई "स्ट्रिंग") कहा जाता है। मुझे लगता है कि यह "स्ट्रिंग्स" (आधिकारिक उन्हें "टैग किए गए टेम्पलेट" और "टेम्पलेट शाब्दिक" कहा जाता है) को कॉल करने के लिए थोड़ा भ्रामक है, खासकर जब टैग किए गए टेम्पलेट्स को स्ट्रिंग्स में जरूरी नहीं है। –

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