ES6 টেম্পলেট লিটারালস বনাম সম্মিলিত স্ট্রিং


86

আমার কাছে একমা-স্ক্রিপ্ট -6 এর জন্য নিম্নলিখিত কোড রয়েছে template literals

let person = {name: 'John Smith'};   
let tpl = `My name is ${person.name}.`;    
let MyVar="My name is "+ person.name+".";

console.log("template literal= "+tpl);  
console.log("my variable = "+MyVar);

আউটপুট নিম্নরূপ:

template literal= My name is John Smith.
my variable = My name is John Smith.

এই হৈচৈ আমি সঠিক পার্থক্যটি অনুসন্ধান করার চেষ্টা করেছি কিন্তু এটি খুঁজে পেল না, আমার প্রশ্ন এই দুটি বিবৃতিতে কী পার্থক্য রয়েছে,

  let tpl = `My name is ${person.name}.`;    

এবং

  let MyVar = "My name is "+ person.name+".";

আমি ইতিমধ্যে এখানে স্ট্রিং MyVarসংমিশ্রিত করতে সক্ষম person.name, তাই টেমপ্লেট আক্ষরিক ব্যবহারের দৃশ্যপটটি কী হবে?


8
এটি অন্যান্য ভাষায় একটি সাধারণ বৈশিষ্ট্য, সময় সম্পর্কে! দেখতে আরও পরিচ্ছন্ন, এবং এটি বহুভূমিক।
এলক্ল্যানাররা

4
নিশ্চিত নয় যে আপনি "পার্থক্য" বলতে কী বোঝায় tpl === MyVar? পার্থক্য কেবলমাত্র তাদের তৈরি করা বাক্য গঠন created লক্ষ্য করুন যে টেমপ্লেটগুলি স্ট্রিং কন্টেটিংয়ের বিপরীতে, ট্যাগ ফাংশন সরবরাহ করে যা স্বয়ংক্রিয়ভাবে পালানোর মতো জিনিসগুলির জন্য ব্যবহার করা যেতে পারে।
বার্গি

আপনি মূলত জিজ্ঞাসা করছেন স্ট্রিং ইন্টারপোলেশন বনাম স্ট্রিং কনকেন্টেশন এর মধ্যে পার্থক্য কী।
দাম্জন পাভলিকা

গতির পার্থক্য বিবেচনা করার মতো নয় - যদি ন্যানোসেকেন্ডগুলি আপনার কাছে একটি বাধা হয়ে থাকে তবে আপনাকে অন্য বড় সমস্যাগুলি যেমন অন্য সার্ভারের মতো সমাধান করা প্রয়োজন I
জেমস

উত্তর:


108

যদি আপনি `Hello ${person.name}`প্রশ্নের উদাহরণের মতো কেবল স্থানধারক (উদাহরণস্বরূপ ) সহ টেম্পলেট আক্ষরিক ব্যবহার করে থাকেন, তবে ফলাফলটি কেবল সংক্ষিপ্ত স্ট্রিংয়ের মতো। বিষয়গতভাবে এটি আরও ভাল দেখায় এবং পড়া সহজ, বিশেষত মাল্টি-লাইনের স্ট্রিং বা স্ট্রিং উভয়ই থাকে 'এবং "যেহেতু আপনাকে আর এই অক্ষরগুলি থেকে বাঁচতে হবে না।

পঠনযোগ্যতা একটি দুর্দান্ত বৈশিষ্ট্য, তবে টেমপ্লেটগুলি সম্পর্কে সর্বাধিক আকর্ষণীয় বিষয় হ'ল ট্যাগযুক্ত টেম্পলেট লিটারাল :

let person = {name: 'John Smith'}; 
let tag = (strArr, name) => strArr[0] + name.toUpperCase() + strArr[1];  
tag `My name is ${person.name}!` // Output: My name is JOHN SMITH!

এই উদাহরণের তৃতীয় লাইনে, একটি ফাংশন নামক tagবলা হয়। টেমপ্লেট স্ট্রিং এর বিষয়বস্তু একাধিক ভেরিয়েবল বিভক্ত করা, আপনি অফ আর্গুমেন্ট মধ্যে অ্যাক্সেস করতে পারেন tagফাংশন: (এর মান এই উদাহরণে আক্ষরিক বিভাগে strArr[0]হয় My name is এবং এর মান strArr[1]হয় !) এবং বদল ( John Smith)। tagফাংশনটি যাই হোক না কেন টেমপ্লেট আক্ষরিক মূল্যায়ন করা হবে ।

এর নাম ECMAScript উইকি তালিকা কিছু সম্ভাব্য ব্যবহারের ক্ষেত্রে, স্বয়ংক্রিয়ভাবে পলায়নের বা ইনপুট, বা স্থানীয়করণ এনকোডিং মত। আপনি নামের মতো একটি ট্যাগ ফাংশন তৈরি করতে পারেন msgযা আক্ষরিক অংশগুলি সন্ধান করে My name is এবং বর্তমান স্থানীয় ভাষার ভাষায় অনুবাদ সহ তাদের প্রতিস্থাপন করে, উদাহরণস্বরূপ জার্মান ভাষায়:

console.log(msg`My name is ${person.name}.`) // Output: Mein Name ist John Smith.

ট্যাগ ফাংশন দ্বারা ফেরত মান এমনকি একটি স্ট্রিং হতে হবে না। আপনি নামের একটি ট্যাগ ফাংশন তৈরি করতে পারেন $যা স্ট্রিংকে মূল্যায়ণ করে এবং ডিওএম নোডের সংগ্রহ ফিরিয়ে আনার জন্য কোয়েরি নির্বাচক হিসাবে ব্যবহার করে, উদাহরণস্বরূপ :

$`a.${className}[href=~'//${domain}/']`

4
সুন্দর! আপনার যদি সেখানে আর কোনও টেমপ্লেট আক্ষরিক থাকে, যেমন template {person.message}, এটিও অনুবাদ করা হবে?
রিগোটি

4
@ রিগোটি এটি msgফাংশন বাস্তবায়নের উপর নির্ভর করে। আপনি অবশ্যই প্রতিস্থাপনের মানগুলি অনুবাদ করতে পারেন।
কেপেক্স

@ বিট পুরো ইমেজস্ক্রিপ্ট.অর্গ সাইটটি মনে হচ্ছে ডাউন আছে। আমি মনে করি যেহেতু তাদের উইকি পরিত্যাগ করার পরিকল্পনা ছিল, তাই আমি সংরক্ষণাগারিত সংস্করণগুলির সাথে লিঙ্কগুলি আপডেট করেছি।
কেপেক্স

আমি $ চালানোর চেষ্টা a.${className}[href=~'//${domain}/']ক্রোম কনসোল (এবং সামনে পেশ className=''এবং domain=''কিন্তু আমি করে DOM নোড কিন্তু স্ট্রিং অ্যারে পাবেন না: / (অন্যান্য hadn এ, jsfiddle আমরা কনসোলে ত্রুটি পাবেন: jsfiddle.net/d1fkta76 "Uncaught ReferenceError : defined "সংজ্ঞায়িত করা হয়নি" - কেন?
কামিল কিয়েসজেউস্কি

4
@AniketSuryavanshi এখানে বনাম সংযুক্তকরণের কর্মক্ষমতা টেমপ্লেট স্ট্রিং একটি তুলনামূলক আছে: stackoverflow.com/a/29083467/897024 কয়েক বছর আগে টেমপ্লেট স্ট্রিং ধীর ছিল কিন্তু এটা দেখে মনে হচ্ছে তারা একটি বিট সংযুক্তকরণের তুলনায় দ্রুততর এখন।
কেপেক্স

17

ES6`ডিলিমিটার হিসাবে ব্যাক-টিক ব্যবহার করে একটি নতুন ধরণের স্ট্রিং আক্ষরিক উপস্থিত হয় । এই লিটারালগুলি বেসিক স্ট্রিং ইন্টারপোলেশন এক্সপ্রেশনগুলি এম্বেড করার অনুমতি দেয় যা পরে স্বয়ংক্রিয়ভাবে পার্স এবং মূল্যায়ন করা হয়।

let actor = {name: 'RajiniKanth', age: 68};

let oldWayStr = "<p>My name is " + actor.name + ",</p>\n" +
  "<p>I am " + actor.age + " old</p>\n";

let newWayHtmlStr =
 `<p>My name is ${actor.name},</p>
  <p>I am ${actor.age} old</p>`;

console.log(oldWayStr);
console.log(newWayHtmlStr);

আপনি দেখতে পাচ্ছেন যে, আমরা কয়েকটি অক্ষরের চারপাশে ..`` ব্যবহার করেছি, যা স্ট্রিং আক্ষরিক হিসাবে ব্যাখ্যা করা হয়, তবে ফর্মটির কোনও অভিব্যক্তি ${..}পার্স এবং তাত্ক্ষণিকভাবে ইনলাইনে মূল্যায়ন করা হয়।

আন্তঃবিবাহিত স্ট্রিং আক্ষরিকাগুলির একটি দুর্দান্ত সুবিধা হ'ল এগুলি একাধিক লাইনে বিভক্ত হওয়ার অনুমতি রয়েছে:

var Actor = {"name" : "RajiniKanth"};

var text =
`Now is the time for all good men like ${Actor.name}
to come to the aid of their
country!`;
console.log( text );
// Now is the time for all good men
// to come to the aid of their
// country!

আন্তঃবিবাহিত এক্সপ্রেশন

কোনও বৈধ এক্সপ্রেশন ফাংশন কল, ইনলাইন ফাংশন এক্সপ্রেশন কল এবং আরও অন্যান্য সহ ${..}একটি ইন্টারপোল্টেড স্ট্রিংয়ের ভিতরে উপস্থিত হওয়ার অনুমতি lit‐ eralরয়েছে interpo‐ lated string literals!

function upper(s) {
 return s.toUpperCase();
}
var who = "reader"
var text =
`A very ${upper( "warm" )} welcome
to all of you ${upper( `${who}s` )}!`;
console.log( text );
// A very WARM welcome
// to all of you READERS!

এখানে "s"কারা + "s" এর বিপরীতে স্ট্রিংয়ের সাথে হু ভেরিয়েবলের সংমিশ্রণ করার সময় অভ্যন্তরীণ {{কে `` s`` ইন্টারপোল্টেড স্ট্রিং আক্ষরিক আমাদের জন্য কিছুটা সুন্দর সুবিধা ছিল । এছাড়াও একটি নোট রাখার একটি ইন্টারপোলেট স্ট্রিং আক্ষরিক শুধু হয় lexically scopedযেখানে এটি প্রদর্শিত হবে, না dynamically scopedঅন্য কোন উপায়ে

function foo(str) {
 var name = "foo";
 console.log( str );
}
function bar() {
 var name = "bar";
 foo( `Hello from ${name}!` );
}
var name = "global";
bar(); // "Hello from bar!"

ব্যবহার template literalHTML- এর জন্য স্পষ্টভাবে আরো পাঠযোগ্য বিরক্তি হ্রাস করা।

সরল পুরানো উপায়:

'<div class="' + className + '">' +
  '<p>' + content + '</p>' +
  '<a href="' + link + '">Let\'s go</a>'
'</div>';

সাথে ES6:

`<div class="${className}">
  <p>${content}</p>
  <a href="${link}">Let's go</a>
</div>`
  • আপনার স্ট্রিং একাধিক লাইন বিস্তৃত করতে পারে।
  • আপনার উদ্ধৃতি অক্ষরগুলি এড়ানোর দরকার নেই।
  • আপনি যেমন গ্রুপিং এড়াতে পারেন: '">'
  • আপনাকে প্লাস অপারেটর ব্যবহার করতে হবে না।

ট্যাগযুক্ত টেম্পলেট লিটারালস

আমরা একটি templateস্ট্রিং ট্যাগও করতে পারি , যখন একটি templateস্ট্রিং ট্যাগ করা হয়, literalsএবং বিকল্পগুলি ফাংশনে পাস করা হয় যা ফলাফলকে মান দেয়।

function myTaggedLiteral(strings) {
  console.log(strings);
}

myTaggedLiteral`test`; //["test"]

function myTaggedLiteral(strings,value,value2) {
  console.log(strings,value, value2);
}
let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
// ["test ", " ", ""]
// "Neat"
// 5

আমরা spreadএকাধিক মান পাস করতে এখানে অপারেটরটি ব্যবহার করতে পারি । প্রথম যুক্তি - আমরা একে স্ট্রিং বলেছিলাম - এটি সমস্ত প্লেইন স্ট্রিংগুলির একটি অ্যারে (কোনও বিভাজনযুক্ত এক্সপ্রেশনগুলির মধ্যে স্টাফ)।

আমরা তারপরে সমস্ত আর্গুমেন্টগুলি একটি অ্যারেতে ব্যবহার করে মানগুলি ব্যবহার করি ... gather/rest operator, যদিও আপনি অবশ্যই তাদের উপরের মতো স্ট্রিং প্যারামিটার অনুসরণ করে স্বতন্ত্র নামের প্যারামিটার হিসাবে রেখে যেতে পারেন (value1, value2 etc)

function myTaggedLiteral(strings,...values) {
  console.log(strings);
  console.log(values);    
}

let someText = 'Neat';
myTaggedLiteral`test ${someText} ${2 + 3}`;
// ["test ", " ", ""]
// ["Neat", 5]

argument(s)ইতিমধ্যে মূল্যায়ন ক্ষেপক স্ট্রিং আক্ষরিক পাওয়া এক্সপ্রেশন ফলাফল আমাদের মান অ্যারের মধ্যে জড়ো হয়। এ tagged string literalইন্টারপোলেশনগুলি মূল্যায়ন করার পরে প্রক্রিয়াজাতকরণের মতো তবে চূড়ান্ত স্ট্রিংয়ের মান সংকলন করার আগে আপনাকে আক্ষরিক থেকে স্ট্রিং তৈরির উপর আরও নিয়ন্ত্রণের সুযোগ দেয়। আসুন একটি তৈরির উদাহরণ দেখুন re-usable templates

const Actor = {
  name: "RajiniKanth",
  store: "Landmark"
}

const ActorTemplate = templater`<article>
  <h3>${'name'} is a Actor</h3>
  <p>You can find his movies at ${'store'}.</p>

</article>`;

function templater(strings, ...keys) {
  return function(data) {
  let temp = strings.slice();
  keys.forEach((key, i) => {
  temp[i] = temp[i] + data[key];
  });
  return temp.join('');
  }
};

const myTemplate = ActorTemplate(Actor);
console.log(myTemplate);

কাঁচা স্ট্রিংস

আমাদের ট্যাগ ফাংশনগুলি একটি প্রথম যুক্তি পায় stringsযা আমরা বলেছিলাম যা একটি array। তবে এতে অতিরিক্ত পরিমাণে ডেটা অন্তর্ভুক্ত রয়েছে: সমস্ত স্ট্রিংয়ের কাঁচা অপ্রয়োজনীয় সংস্করণ। আপনি .rawসম্পত্তি ব্যবহার করে এই কাঁচা স্ট্রিংয়ের মানগুলি অ্যাক্সেস করতে পারেন :

function showraw(strings, ...values) {
 console.log( strings );
 console.log( strings.raw );
}
showraw`Hello\nWorld`;

যেমন আপনি দেখতে পাচ্ছেন, rawস্ট্রিংয়ের সংস্করণটি পালানো sequ n ক্রম সংরক্ষণ করে, অন্যদিকে স্ট্রিংয়ের প্রসেসড সংস্করণটি একটি অবিরত আসল নতুন লাইনের মতো আচরণ করে। ES6একটি বিল্ট-ইন ফাংশন যা একটি স্ট্রিং আক্ষরিক ট্যাগ হিসেবে ব্যবহার করা যাবে সাথে আসে: String.raw(..)। এটি কেবলমাত্র এর কাঁচা সংস্করণগুলির মধ্য দিয়ে যায় strings:

console.log( `Hello\nWorld` );
/* "Hello
World" */

console.log( String.raw`Hello\nWorld` );
// "Hello\nWorld"

4

এটি অনেক পরিষ্কার এবং মন্তব্যগুলিতে যেমন বলা হয়েছে, এটি অন্য ভাষাগুলির একটি সাধারণ বৈশিষ্ট্য। আমি যে জিনিসটি দেখতে পেয়েছি তা হ'ল লাইন বিরতি, স্ট্রিং লেখার সময় খুব দরকারী।

let person = {name: 'John Smith', age: 24, greeting: 'Cool!' };

let usualHtmlStr = "<p>My name is " + person.name + ",</p>\n" +
                   "<p>I am " + person.age + " old</p>\n" +
                   "<strong>\"" + person.greeting +"\" is what I usually say</strong>";


let newHtmlStr = 
 `<p>My name is ${person.name},</p>
  <p>I am ${person.age} old</p>
  <p>"${person.greeting}" is what I usually say</strong>`;


console.log(usualHtmlStr);
console.log(newHtmlStr);

একটি স্ট্রিং এবং আক্ষরিকরে লাইনব্রেকগুলি রাখার মধ্যে যদি কোনও বড় পার্থক্য আছে তা আমি বুঝতে পারি না। এই es6fiddle.net/i3vj1ldl পরীক্ষা করুন । আক্ষরিক কেবল একটি লাইন ব্রেকের পরিবর্তে একটি স্থান রাখে
শায়খ

4
ওহ, আমি বলিনি যে এটি একটি বড় পার্থক্য। লিটারাল লাইন ব্রেকগুলি কেবল সিনট্যাক্স চিনি। এটি কেবল পাঠযোগ্যতার খাতিরে।
রিগোটি

কিন্তু তবুও আপনি একটি ভাল পার্থক্য চিহ্নিত করেছেন। তবে আপনার উত্তর গ্রহণ করার আগে আমি আরও ভাল সময়ের জন্য আরও কিছু সময়ের জন্য অপেক্ষা করব যা কোনও বড় পার্থক্য দেখায় (যদি কিছু থাকে!) :)
শায়খ

4
@ নাeমশাইখ আমি ভীষণ দুঃখিত, তবে আক্ষরিক লাইন বিরতি আসলে কাজ করে। সবেমাত্র লক্ষ্য করা গেছে যে ES6Fiddle এটি পরীক্ষা করার এক ভয়ঙ্কর উপায়। আমি আমার উত্তর সম্পাদনা করব।
রিগোটি

2

যদিও, আমার উত্তরটি সরাসরি প্রশ্নের সমাধান করে না। আমি ভেবেছিলাম অ্যারে জয়েনের পক্ষে টেমপ্লেট লিটারাল ব্যবহারের একটি অসুবিধা চিহ্নিত করা কিছুটা আগ্রহী হতে পারে।

বলি আমার আছে

let patient1 = {firstName: "John", lastName: "Smith"};
let patient2 = {firstName: "Dwayne", lastName: "Johnson", middleName: "'The Rock'"};

তাই কিছু রোগীর একটি মিডনাম থাকে এবং অন্যরা তা করেন না।

যদি আমি কোনও স্ট্রিং চাইতাম যে কোনও রোগীর পুরো নাম উপস্থাপন করে

let patientName = `${patient1.firstName} ${patient1.middleName} ${patient1.lastName}`;

তাহলে এটি "জন অপরিজ্ঞাত স্মিথ" হয়ে উঠবে

তবে আমি যদি

let patientName = [patient1.firstName, patient1.middleName,  patient1.lastName].join(" ");

তাহলে এটি হয়ে উঠবে কেবল "জন স্মিথ"

সম্পাদনা

জেনারেল_উইকেনহ্যাম উল্লেখ করেছিলেন যে "" "এ যোগদানের ফলে" জন "এবং" স্মিথ "এর মধ্যে বাড়তি জায়গা হবে।

এটি ঘুরে দেখার জন্য আপনার মিথ্যা মানগুলি থেকে মুক্তি পেতে যোগদানের আগে একটি ফিল্টার রাখতে পারেন: [patient1.firstName, patient1.middleName, patient1.lastName].filter(el => el).join(" ");


4
আসলে, এটি একেবারে সঠিক নয় - joinসংস্করণটি আপনাকে অতিরিক্ত জায়গা সহ জন স্মিথ দেবে । আপনি কল্পনা করতে পারেন, এটি প্রায়শই অনাকাঙ্ক্ষিত। এর map[patient1.firstName, patient1.middleName, patient1.lastName].map(el => el).join(" ");
ঠিকঠাকটি এর

@ জেনারাল_ওয়াইকেনহ্যাম আঃ আমি আপনার বক্তব্যটি দেখছি। ভালো বল ধরা. এছাড়াও, অতিরিক্ত স্থান থেকে মুক্তি পাওয়ার জন্য এটি ফিল্টার হওয়া উচিত এবং মানচিত্রের নয়। আমি আমার উত্তর সম্পাদনা করব, ধন্যবাদ।
ধ্রুব প্রকাশ

উফ - হ্যাঁ, filterআমি যে ফাংশনটি বোঝাতে চাইছিলাম তা হ'ল
জেনারেল_উইকেনহ্যাম

এবং এই আলোচনা অনুসারে, স্ট্রিং কনকেনেটেট অ্যারে যোগদানের চেয়ে দ্রুত। stackoverflow.com/questions/7299010/…
মাইকেল হারলে
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.