آیا علامتهای نقل قول دوگانه و نقل قول تکگانه در جاوااسکریپت برای رشتهها قابل تعویض هستند؟


گزینههای زیر را مد نظر قرار دهید:

  • console.log("double");
  • console.log('single');

اولی از علامت نقل قول دوبل دور رشته استفاده میکند، در حالی که دومی از علامت نقل قول تکی دور رشته استفاده میکند.

من میبینم که روز به روز کتابخانههای بیشتری در جاوااسکریپت از علامت نقل قول تکی هنگام کار با رشتهها استفاده میکنند.

آیا این دو کاربرد قابل تعویض هستند؟ اگر نه، آیا استفاده از یکی نسبت به دیگری مزیتی دارد؟

پاسخ شماره ۱

محتملترین دلیل استفاده از float تکدقت در مقابل float دودقت در کتابخانههای مختلف، ترجیح برنامهنویس و/یا سازگاری با API است. غیر از رعایت سازگاری، از هر کدام که برای رشته مناسبتر است استفاده کنید.

استفاده از نوع دیگر نقل قول به صورت حرفی:

alert('Say "Hello"');
alert("Say 'Hello'");

این میتواند پیچیده شود:

alert("It's \"game\" time.");
alert('It\'s "game" time.');

گزینهی دیگری که در ECMAScript 6 جدید است، رشتههای قالبی هستند که از کاراکتر backtick استفاده میکنند:

alert(`Use "double" and 'single' quotes in the same string`);
alert(`Escape the \` back-tick character and the \${ dollar-brace sequence in a string`);

رشتههای قالبی یک نحو تمیز برای: درونیابی متغیرها، رشتههای چندخطی، و موارد بیشتر ارائه میدهند.

توجه داشته باشید که JSON به طور رسمی برای استفاده از علامت نقل قول دوتایی مشخص شده است، که بسته به الزامات سیستم ممکن است ارزش در نظر گرفتن داشته باشد.

پاسخ شماره ۲

اگر با JSON سر و کار دارید، باید توجه داشته باشید که به طور دقیق، رشتههای JSON باید با نقل قول دوتایی باشند. مطمئناً، بسیاری از کتابخانهها از نقل قول تک نیز پشتیبانی میکنند، اما من در یکی از پروژههایم مشکلات زیادی داشتم قبل از اینکه متوجه شوم که استفاده از نقل قول تک برای یک رشته در واقع مطابق با استانداردهای JSON نیست.

پاسخ شماره ۳

هیچ راهحل بهتری وجود ندارد؛ با این حال، میخواهم استدلال کنم که استفاده از نقلقول دوبل در برخی مواقع ممکن است مطلوبتر باشد:

  • تازهواردها قبلاً با نقلقولهای دوبل از زبان خود آشنا هستند. در انگلیسی، ما باید از نقلقولهای دوبل " برای مشخص کردن یک قطعه متن نقلشده استفاده کنیم. اگر از یک نقلقول تکی ' استفاده کنیم، ممکن است خواننده آن را به عنوان یک اختصار درک کند. معنای دیگر یک قطعه متن که با ' احاطه شده است، نشاندهنده معنی «محاورهای» است. منطقی است که با زبانهای موجود سازگار بمانیم و این احتمالاً یادگیری و تفسیر کد را آسانتر میکند.

  • گیومههای دوتایی نیاز به فرار دادن آپاستروفها را از بین میبرند (مانند حالت اختصارات). رشته را در نظر بگیرید: "من میروم به مرکز خرید"، در مقابل نسخهای که نیاز به فرار دادن دارد: 'من\' میروم به مرکز خرید'.

  • دابل کوتیشنها در بسیاری از زبانهای دیگر به معنای یک رشته هستند. وقتی یک زبان جدید مثل جاوا یا C را یاد میگیرید، همیشه از دابل کوتیشن استفاده میشود. در C، کوتیشنهای تکی برای چیزی متمایز رزرو شدهاند (char). در روبی، پیاچپی و پرل، رشتههای با کوتیشن تکی نشان میدهند که هیچ فرار بکاسلشی وجود ندارد، در حالی که دابل کوتیشنها از آنها پشتیبانی میکنند.

  • نشانگذاری JSON با گیومههای دوتایی نوشته میشود.

با این حال، همانطور که دیگران گفتهاند، مهمترین چیز این است که ثابتقدم بمانیم.

پاسخ شماره ۴

بخش ۷.۸.۴ مشخصات، نشانهگذاری رشتهٔ صریح را شرح میدهد. تنها تفاوت این است که DoubleStringCharacter «SourceCharacter اما نه علامت نقلقول دوگانه» و SingleStringCharacter «SourceCharacter اما نه علامت نقلقول تکی» است. بنابراین تنها تفاوت را میتوان بدین صورت نشان داد:

'A string that\'s single quoted'

"A string that's double quoted"

پس این بستگی به این دارد که چقدر میخواهید نقلقولها را فرار دهید. واضح است که همان موضوع برای علامتهای نقلقول دوبل در رشتههای دوبل نقلقول شده نیز صدق میکند.

پاسخ شماره ۵

میخواهم بگویم تفاوت صرفاً سبکشناختی است، اما واقعاً به آن شک دارم. مثال زیر را در نظر بگیرید:

/*
    Add trim() functionality to JavaScript...
      1. By extending the String prototype
      2. By creating a 'stand-alone' function
    This is just to demonstrate results are the same in both cases.
*/

// Extend the String prototype with a trim() method
String.prototype.trim = function() {
    return this.replace(/^\s+|\s+$/g, '');
};

// 'Stand-alone' trim() function
function trim(str) {
    return str.replace(/^\s+|\s+$/g, '');
};

document.writeln(String.prototype.trim);
document.writeln(trim);

در مرورگرهای سافاری، کروم، اپرا و اینترنت اکسپلورر (در اینترنت اکسپلورر ۷ و اینترنت اکسپلورر ۸ آزمایش شده)، این مقدار زیر را برمیگرداند:

function () {
    return this.replace(/^\s+|\s+$/g, '');
}
function trim(str) {
    return str.replace(/^\s+|\s+$/g, '');
}

با این حال، فایرفاکس نتیجهای کمی متفاوت خواهد داد:

function () {
    return this.replace(/^\s+|\s+$/g, "");
}
function trim(str) {
    return str.replace(/^\s+|\s+$/g, "");
}

علامتهای تک کوتیشن با علامتهای دوتایی جایگزین شدهاند. (همچنین توجه کنید که فضای تورفتگی با چهار فاصله جایگزین شده است.) این نشان میدهد که حداقل یک مرورگر جاوااسکریپت را به طور داخلی طوری تحلیل میکند که انگار همه چیز با استفاده از علامتهای دوتایی نوشته شده است. ممکن است فکر کنید که فایرفاکس زمان کمتری برای تحلیل جاوااسکریپت نیاز دارد اگر همه چیز قبلاً مطابق با این 'استاندارد' نوشته شده باشد.

که، راستی، باعث میشود من یک پاندا خیلی غمگین باشم، چون فکر میکنم نقلقولهای تک در کد خیلی زیباتر به نظر میرسند. به علاوه، در زبانهای برنامهنویسی دیگر، معمولاً استفاده از آنها سریعتر از نقلقولهای دوتایی است، بنابراین منطقی است اگر همین موضوع برای جاوااسکریپت هم صدق کند.

نتیجهگیری: فکر میکنم ما نیاز داریم تحقیقات بیشتری در این زمینه انجام دهیم.

این ممکن است نتایج آزمایش پیتر-پل کوخ در سال ۲۰۰۳ را توضیح دهد.

به نظر میرسد که کوتیشنهای تکی گاهی در اکسپلورر ویندوز سریعتر هستند (حدود ۱/۳ آزمایشهای من زمان پاسخ سریعتری نشان داد)، اما اگر موزیلا هر گونه تفاوتی نشان دهد، کوتیشنهای دوتایی کمی سریعتر عمل میکنند. من هیچ تفاوتی در اپرا پیدا نکردم.

۲۰۱۴: نسخههای مدرن فایرفاکس/اسپایدرمانکی دیگر این کار را انجام نمیدهند.

پاسخ شماره ۶

اگر شما در حال استفاده از جاوااسکریپت درونخطی هستید (که میتوان گفت کاری «بد» است، اما از بحث در این مورد خودداری میکنیم) به نظر من تنها گزینه شما برای رشتهها، کوتیشنهای تک است.

مثلاً، این خوب کار میکند:

<a onclick="alert('hi');">hi</a>

اما شما نمیتوانید "hi" را با استفاده از هیچ روش فراردهی که من میشناسم، در نقلقولهای دوگانه قرار دهید. حتی &quot; که بهترین حدس من بود (چون شما در حال فرار دادن نقلقولها در مقدار یک ویژگی HTML هستید) برای من در فایرفاکس کار نمیکند. " هم کار نخواهد کرد چون در این مرحله شما برای HTML فرار میدهید، نه برای جاوااسکریپت.

پس، اگر نام بازی ثبات است، و شما قرار است در بخشهایی از برنامه خود جاوااسکریپت خطی استفاده کنید، فکر میکنم کوتیشنهای تکی برنده هستند. با این حال، کسی لطفاً اگر اشتباه میکنم مرا اصلاح کند.

پاسخ شماره ۷

از نظر فنی هیچ تفاوتی وجود ندارد. این تنها مسئلهٔ سبک و قرارداد است.

داگلاس کراکفورد1 استفاده از نقلقولهای دوتایی را توصیه میکند.

من شخصاً آن را دنبال میکنم.

پاسخ شماره ۸

به طور دقیق، از نظر معنا تفاوتی وجود ندارد؛ بنابراین انتخاب به راحتی بستگی دارد.

اینجا چند عامل وجود دارد که میتواند انتخاب شما را تحت تأثیر قرار دهد:

  • سبک خانه: بعضی از گروههای توسعهدهنده از همین یکی از قراردادها استفاده میکنند.
  • نیازمندیهای سمت مشتری: آیا قصد دارید از علامت نقلقول درون رشتهها استفاده کنید؟ (پاسخ ادی را ببینید.)
  • زبان سمت سرور: VB.NET افراد ممکن است انتخاب کنند از نقل قولهای تکی برای جاوااسکریپت استفاده کنند تا اسکریپتها بتوانند در سمت سرور ساخته شوند (VB.NET از نقل قولهای دوتایی برای رشتهها استفاده میکند، بنابراین رشتههای جاوااسکریپت اگر از نقل قولهای تکی استفاده کنند، به راحتی قابل تشخیص هستند).
  • کد کتابخانه: اگر از کتابخانهای استفاده میکنید که از یک سبک خاص استفاده میکند، ممکن است بخواهید خودتان نیز از همان سبک استفاده کنید.
  • ترجیح شخصی: ممکن است فکر کنید یکی از سبکها بهتر به نظر میرسد.

پاسخ شماره ۹

فقط در استفاده خود ثبات را حفظ کنید. اما سطح راحتی خود را کاهش ندهید.

"This is my string."; // :-|
"I'm invincible."; // Comfortable :)
'You can\'t beat me.'; // Uncomfortable :(
'Oh! Yes. I can "beat" you.'; // Comfortable :)
"Do you really think, you can \"beat\" me?"; // Uncomfortable :(
"You're my guest. I can \"beat\" you."; // Sometimes, you've to :P
'You\'re my guest too. I can "beat" you too.'; // Sometimes, you've to :P

بهروزرسانی ECMAScript 6

استفاده از نحو رشته قالب.

`Be "my" guest. You're in complete freedom.`; // Most comfort :D

پاسخ شماره ۱۰

امیدوارم چیزی واضح نگفته باشم، اما من در کار با جنگو، آجاکس و JSON در این مورد دچار مشکل بودهام.

با فرض اینکه در کد HTML خود از علامت نقل قول دوتایی استفاده میکنید، همانطور که به طور معمول باید باشد، من اکیداً پیشنهاد میکنم برای بقیه در جاوااسکریپت از علامت نقل قول تکی استفاده کنید.

پس من با ادی موافقم، اما با کمی احتیاط.

نتیجهگیری من این است:

در جاوااسکریپت احتمالاً اهمیتی ندارد، اما به محض اینکه آن را داخل HTML یا چیز مشابهی جاسازی کنید، شروع به ایجاد مشکل میکنید. شما باید بدانید که در واقع چه چیزی در حال فرار، خواندن و عبور دادن رشته شما است.

مورد ساده من این بود:

tbox.innerHTML = tbox.innerHTML + '<div class="thisbox_des" style="width:210px;" onmouseout="clear()"><a href="/this/thislist/'
                   + myThis[i].pk +'"><img src="/site_media/'
                   + myThis[i].fields.thumbnail +'" height="80" width="80" style="float:left;" onmouseover="showThis('
                   + myThis[i].fields.left +','
                   + myThis[i].fields.right +',\''
                   + myThis[i].fields.title +'\')"></a><p style="float:left;width:130px;height:80px;"><b>'
                   + myThis[i].fields.title +'</b> '
                   + myThis[i].fields.description +'</p></div>'

میتوانید ' را در فیلد سوم showThis ببینید.

علامت نقل قول دوتایی کار نکرد!

واضح است چرا، اما همچنین واضح است چرا باید به علامتهای نقل قول تک پایبند باشیم... حدس میزنم...

این مورد یک قرار دادن HTML بسیار ساده است و خطا ناشی از کپی/پیست ساده از یک کد جاوااسکریپت با 'دابل کوتیشن' بود.

پس برای پاسخ به سؤال:

سعی کنید در حین استفاده از HTML از کوتیشنهای تک استفاده کنید. ممکن است چند مشکل دیباگ را صرفهجویی کند...

پاسخ شماره ۱۱

این بیشتر یک مسئله سبک و ترجیح است. در پاسخهای دیگر برخی اکتشافات فنی نسبتاً جالب و مفید وجود دارد، بنابراین شاید تنها چیزی که من میتوانم اضافه کنم ارائه کمی توصیه دنیوی باشد.

  • اگر شما در یک شرکت یا تیم کدنویسی میکنید، پس احتمالاً ایده خوبی است که از «سبک داخلی» پیروی کنید.

  • اگر شما تنها هستید و چند پروژه جانبی را توسعه میدهید، پس به چند رهبر برجسته در جامعه نگاه کنید. برای مثال، فرض کنید شما به Node.js علاقهمند میشوید. نگاه کنید به ماژولهای اصلی، برای مثال Underscore.js یا express و ببینید چه قراردادهایی را استفاده میکنند، و فکر کنید که دنبال کردن آنها چطور میتواند باشد.

  • اگر هر دو قرارداد به طور مساوی استفاده شوند، پس به ترجیح شخصی خود رجوع کنید.

  • اگر هیچ ترجیح شخصی ندارید، آنگاه یک سکه بیندازید.

  • اگر سکهای نداری، پس آبجو مهمان من است ;)

پاسخ شماره ۱۲

من مطمئن نیستم که این در دنیای امروز مرتبط باشد، اما قبلاً از علامتهای نقل قول دوبل برای محتوایی استفاده میشد که نیاز به پردازش کاراکترهای کنترلی داشت و از علامتهای نقل قول تکی برای رشتههایی که چنین نیازی نداشتند.

کامپایلر عملیات دستکاری رشته را روی رشتهای که در داخل کوتیشن دوتایی قرار دارد انجام میدهد، در حالی که رشتهای که در داخل کوتیشن تکی است را به طور کامل بدون تغییر باقی میگذارد. این در گذشته باعث میشد که توسعهدهندگان «خوب» انتخاب کنند از کوتیشن تکی برای رشتههایی استفاده کنند که شامل کاراکترهای کنترلی مانند \n یا \0 نبودند (که در کوتیشن تکی پردازش نمیشوند) و از کوتیشن دوتایی زمانی استفاده میکردند که نیاز به تجزیه رشته داشتند (با هزینهای جزئی در چرخههای پردازنده برای پردازش رشته).

پاسخ شماره ۱۳

اگر از JSHint استفاده میکنید، در صورت استفاده از رشته با نقل قول دوبل، خطا ایجاد میکند.

من از طریق چارچوب Yeoman در AngularJS از آن استفاده کردم، اما شاید به نوعی راهی برای پیکربندی آن وجود داشته باشد.

راستی، وقتی HTML را وارد جاوااسکریپت میکنید، استفاده از نقلقول تک راحتتر است:

var foo = '<div class="cool-stuff">Cool content</div>';

و حداقل JSON از نقلقولهای دوگانه برای نمایش رشتهها استفاده میکند.

هیچ راه پیش پا افتادهای برای پاسخ به سوال شما وجود ندارد.

پاسخ شماره ۱۴

بین کوتیشنهای تک و دوگانه در جاوااسکریپت هیچ تفاوتی وجود ندارد.

مشخصات مهم است:

شاید تفاوتهایی در عملکرد وجود داشته باشد، اما آنها کاملاً حداقلی هستند و میتوانند هر روز بسته به پیادهسازی مرورگرها تغییر کنند. بحث بیشتر بیفایده است مگر اینکه برنامه جاوااسکریپت شما صدها هزار خط باشد.

این مثل یک معیار است اگر

a=b;

سریعتر از

a = b;

(فضاهای اضافی)

امروز، در یک مرورگر و پلتفرم خاص و غیره.

پاسخ شماره ۱۵

بررسی مزایا و معایب

  • آشفتگی بصری کمتر.
  • تولید HTML: ویژگیهای HTML معمولاً با علامت نقلقول دوگانه محدود میشوند.

elem.innerHTML = '<a href="' + url + '">Hello</a>';

با این حال، کوتیشنهای تک نیز در HTML قانونی هستند.

elem.innerHTML = "<a href='" + url + "'>Hello</a>";

علاوه بر این، استفاده از HTML خطی معمولاً یک الگوی ضد رفتار است. از قالبها ترجیح دهید.

  • تولید JSON: تنها از علامتهای نقل قول دوگانه در JSON استفاده مجاز است.

myJson = '{ "hello world": true }';

باز هم، شما نباید مجبور باشید JSON را به این روش بسازید. اغلب JSON.stringify() کافی است. اگر نه، از قالبها استفاده کنید.

  • دو برابرها راحتتر دیده میشوند اگر کدگذاری رنگی نداشته باشید. مانند در یک کنسول لاگ یا نوعی تنظیمات مشاهدهمنبع.
  • شباهت با زبانهای دیگر: در برنامهنویسی شل (مانند Bash)، رشتههای داخل تکنقل وجود دارند، اما کاراکترهای فرار درون آنها تفسیر نمیشوند. زبانهای C و Java از کوتیشن دوبل برای رشتهها و کوتیشن تک برای کاراکترها استفاده میکنند.
  • اگر میخواهید کد JSON معتبر باشد، باید از علامت نقل قول دوتایی استفاده کنید.

به نفع هر دو

در جاوا اسکریپت بین این دو تفاوتی وجود ندارد. بنابراین، میتوانید هر چیزی که در لحظه مناسب است استفاده کنید. برای مثال، تمام رشتههای زیر همان رشته را تولید میکنند:

    "He said: \"Let's go!\""
    'He said: "Let\'s go!"'
    "He said: \"Let\'s go!\""
    'He said: \"Let\'s go!\"'

برای رشتههای داخلی از کوتیشن تکی و برای رشتههای خارجی از کوتیشن دوتایی استفاده کنید. این به شما اجازه میدهد ثابتهای داخلی را از رشتههایی که قرار است به کاربر نمایش داده شوند (یا به دیسک نوشته شوند و غیره) تشخیص دهید. واضح است که باید از قرار دادن مورد دوم در کد خود اجتناب کنید، اما همیشه نمیتوان این کار را انجام داد.

پاسخ شماره ۱۶

صحبت از عملکرد، نقلقولها هرگز گلوگاه شما نخواهند بود. با این حال، عملکرد در هر دو مورد یکسان است.

صحبت درباره سرعت کدنویسی، اگر از ' برای تعیین مرز یک رشته استفاده کنید، نیاز خواهید داشت تا کوتیشنهای " را escape کنید. به احتمال زیاد نیاز خواهید داشت که از " در داخل رشته استفاده کنید. مثال:

// JSON Objects:
var jsonObject = '{"foo":"bar"}';

// HTML attributes:
document.getElementById("foobar").innerHTML = '<input type="text">';

سپس، من ترجیح میدهم از ' برای جدا کردن رشته استفاده کنم، بنابراین باید تعداد کمتری از کاراکترها را فرار دهم.