Khi nào nên sử dụng dấu ngoặc kép hoặc đơn trong JavaScript?


1968

console.log("double"); đấu với console.log('single');

Tôi thấy ngày càng có nhiều thư viện JavaScript sử dụng dấu ngoặc đơn khi xử lý chuỗi. Các lý do để sử dụng cái này hơn cái kia là gì? Tôi nghĩ rằng họ có thể hoán đổi cho nhau.


125
cái nào dễ đọc hơn? cảnh báo ("Đó là thời gian trò chơi"); hoặc cảnh báo ('Đó là thời gian trò chơi');
Ryan Miller

591
Ryan thì sao? alert("It's \"game\" time.");hay alert('It\'s "game" time.');?
Francisc

37
Nếu các trích dẫn đơn luôn được sử dụng và đôi khi trích dẫn gấp đôi trong đó nghĩa đen chứa một trích dẫn, thì chúng ta sẽ phải gõ các nút dịch chuyển ít hơn rất nhiều và ngón tay trái của chúng ta sẽ ban phước cho chúng ta. Nhưng có, như @arne đã nói, nên sử dụng trích dẫn đôi JSON.
IsmailS

9
Trích dẫn đơn sẽ dễ thực hiện hơn khi bạn sử dụng bàn phím châu Âu (trích dẫn kép là Shift + 2 không ngọt bằng cách gõ một phím đơn một cách thuận tiện bởi màu hồng bên phải của bạn).
Arne

38
@Arne Không có thứ gọi là "bàn phím châu Âu". Ví dụ, bàn phím tiếng Đức yêu cầu thay đổi cho cả hai loại dấu ngoặc kép. (Nhưng trích dẫn đơn dễ dàng hơn.)
ANeves

Câu trả lời:


1222

Lý do có khả năng nhất để sử dụng đơn so với gấp đôi trong các thư viện khác nhau là tùy chọn lập trình viên và / hoặc tính nhất quán API. Khác với sự nhất quán, sử dụng bất kỳ phù hợp nhất với chuỗi.

Sử dụng các loại trích dẫn khác như một nghĩa đen:

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

Điều này có thể trở nên phức tạp:

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

Một tùy chọn khác, mới trong ES6, là các mẫu chữ sử dụng back-tickký tự:

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

Mẫu chữ cung cấp một cú pháp rõ ràng cho: nội suy biến, chuỗi nhiều dòng và hơn thế nữa.

Lưu ý rằng JSON được chính thức chỉ định để sử dụng dấu ngoặc kép, có thể đáng xem xét tùy thuộc vào yêu cầu hệ thống.


84
Một điểm quan trọng cần lưu ý với tất cả các quy ước mã - Xác định nó một lần và gắn bó với nó. IOW, không sử dụng dấu ngoặc kép ở đâu đó và dấu ngoặc đơn ở nơi khác.
Cerebrus

170
@Cerebrus - Tôi nghĩ tính linh hoạt là ổn với cái này. Chắc chắn chọn một kiểu ưa thích, nhưng nếu bạn cần tách ra khỏi kiểu để lưu thoát rất nhiều dấu ngoặc kép trong một chuỗi. Tôi sẽ ổn với điều đó.
Martin Clarke

5
Tôi không nghĩ có bất kỳ lý do nào để phải nhất quán về nó. Không có lợi thế cho một trong hai và tôi không nghĩ rằng khả năng đọc thực sự bị ảnh hưởng cho dù bạn có sử dụng 'ở một nơi và "ở một nơi khác hay không.
cdmckay

2
@Olly Hicks, bài kiểm tra thú vị !! Báo giá đơn thực sự nhanh hơn nhiều lần so với trích dẫn kép ở đây trong Chrome 13 (OSX). Thú vị ...
Ricket

12
Một chút lạc đề, nhưng nếu mọi người sử dụng kiểu chữ chính xác, rất nhiều cuộc thảo luận về việc trốn thoát sẽ bị lỗi thời: alert('It’s “game” time')so với alert("It’s “game” time")- không thành vấn đề. Bạn sẽ chỉ cần thoát trong các trường hợp (hiếm) trong đó dấu nguyên tố đơn hoặc kép ', "thực sự phù hợp.
jotaen

617

Nếu bạn đang làm việc với JSON, cần lưu ý rằng nói đúng, các chuỗi JSON phải được trích dẫn gấp đôi. Chắc chắn, nhiều thư viện cũng hỗ trợ các trích dẫn đơn, nhưng tôi đã gặp vấn đề lớn trong một trong các dự án của mình trước khi nhận ra rằng trích dẫn một chuỗi trên thực tế không theo tiêu chuẩn JSON.


5
Điều này rất phù hợp khi làm việc với jQuery.ajax gọi vào một dịch vụ ASP.NET (Dịch vụ web, Phương thức trang hoặc MVC).
Schmuli

100
Các tên thuộc tính trong các chuỗi JSON phải được trích dẫn kép, nhưng toàn bộ chuỗi JSON có thể được trích dẫn một lần: var jsonString = '{"key1":"value1"}';(Không phải tôi khuyên bạn nên xây dựng JSON theo cách thủ công.)
nnnnnn

51
Bạn không nên viết JSON bằng tay nếu bạn có thể .stringify().
Camilo Martin

23
Điều này đúng ở đây là đối số tốt nhất cho việc luôn luôn sử dụng dấu ngoặc kép. JSON nên có dấu ngoặc kép. Các câu trả lời khác chủ yếu đưa ra lời khuyên là "nhất quán", có nghĩa là nếu bất kỳ một phần nào của ngôn ngữ có thể thực sự buộc một trích dẫn kép, bạn nên sử dụng nhất quán câu trích dẫn đó.
Josh từ Qaribou

18
Điều này cũng có liên quan khi làm việc với nhiều ngôn ngữ trong đó gần như tất cả các ngôn ngữ khác (Java, C, C ++, ...) sử dụng dấu ngoặc kép cho chuỗi và dấu ngoặc đơn cho ký tự. Tôi thích sử dụng cùng một trích dẫn trên bảng và vì vậy hãy gắn với dấu ngoặc kép cho JS. Với nhiều năm chạm phím, phím phụ để thay đổi dấu ngoặc kép là hoàn toàn không liên quan và nếu mã hóa của bạn bị hạn chế bởi cách gõ của bạn thì bạn cần thực hành gõ đúng.
Lawrence Dol

336

Không có giải pháp nào tốt hơn ; tuy nhiên, tôi muốn lập luận rằng đôi khi trích dẫn có thể được mong muốn hơn:

  • Những người mới đến sẽ quen thuộc với các trích dẫn kép từ ngôn ngữ của họ . Trong tiếng Anh, chúng ta phải sử dụng dấu ngoặc kép "để xác định một đoạn văn bản được trích dẫn. Nếu chúng ta sử dụng một trích dẫn duy nhất ', người đọc có thể hiểu sai nó là một sự co lại. Ý nghĩa khác của một đoạn văn bản được bao quanh bởi 'biểu thị ý nghĩa 'thông tục'. Thật hợp lý khi duy trì sự phù hợp với các ngôn ngữ đã có từ trước và điều này có thể giúp giảm bớt việc học và giải thích mã.
  • Dấu ngoặc kép loại bỏ sự cần thiết phải thoát khỏi dấu nháy đơn (như trong các cơn co thắt). Xem xét chuỗi : "I'm going to the mall", so với phiên bản thoát khác : 'I\'m going to the mall'.
  • Dấu ngoặc kép có nghĩa là một chuỗi trong nhiều ngôn ngữ khác . Khi bạn học một ngôn ngữ mới như Java hoặc C, dấu ngoặc kép luôn được sử dụng. Trong Ruby, PHP và Perl, các chuỗi trích dẫn đơn ngụ ý không có dấu gạch chéo ngược thoát trong khi dấu ngoặc kép hỗ trợ chúng.

  • Ký hiệu JSON được viết với dấu ngoặc kép.

Tuy nhiên, như những người khác đã tuyên bố, điều quan trọng nhất là duy trì sự nhất quán.


Điểm đầu tiên của bạn về ngôn ngữ tiếng Anh không phải lúc nào cũng đúng và có thể thay đổi tùy thuộc vào quy ước địa phương / nhà ở. Tài liệu in thường sử dụng dấu ngoặc đơn cho lời nói và sử dụng định dạng khác cho các khối lớn văn bản được trích dẫn. Ý nghĩa 'thông tục' của bạn không phải là một định nghĩa hữu ích về trích dẫn để nhấn mạnh. Cộng với người dùng tiếng Anh nói chung rất kém với dấu ngoặc kép và dấu nháy đơn.
John Ferguson

2
@JohnFerguson, vì lý do đó một mình, có thể nên sử dụng dấu ngoặc kép để tạo sự khác biệt (giữa dấu nháy đơn và đoạn trích dẫn).
dùng1429980

Tôi là tất cả về chủ nghĩa thực dụng. Do thực tế là 1 trong 100 chuỗi mà tôi gõ hoặc sử dụng có dấu ngoặc kép và nhiều, nhiều chuỗi khác có dấu nháy đơn, tôi sử dụng gấp đôi. Tuy nhiên, vào cuối ngày, bạn nên sử dụng loại trích dẫn 1) đã được sử dụng trong dự án nếu bạn là nhà phát triển mới cho dự án hoặc 2) sử dụng loại trích dẫn mà bạn cho là hợp lý hơn.
dudewad

Trường hợp tại điểm-- những gì tôi vừa gõ (có nhiều dấu nháy đơn, không có dấu ngoặc kép;)
dudewad

FWIW - đây là trích dẫn từ một bài báo của Quora: quora.com/ Kẻ
theUtherSide

118

Mục 7.8.4 của đặc tả mô tả ký hiệu chuỗi ký tự. Sự khác biệt duy nhất là DoubleStringCharacter là "SourceCharacter nhưng không trích dẫn kép" và SingleStringCharacter là "SourceCharacter nhưng không trích dẫn đơn". Vì vậy, sự khác biệt duy nhất có thể được chứng minh như vậy:

'A string that\'s single quoted'

"A string that's double quoted"

Vì vậy, nó phụ thuộc vào bao nhiêu trích dẫn bạn muốn làm. Rõ ràng điều tương tự áp dụng cho dấu ngoặc kép trong chuỗi trích dẫn kép.


@Gareth: Tôi đã không nói về thông số kỹ thuật mặc dù, tôi đã nói về tác động hiệu suất có thể. stackoverflow.com/questions/242813/ Từ
Mathias Bynens

nếu bạn đặt đủ dấu nháy đơn trong mã của mình để bù cho số lần bạn cần nhấn shift + 'thì bạn đã làm sai.
SgtPooki

1
Thế còn "{\"name\": \"Peter\"}"vs '{"name": "Peter"}'? Phải thừa nhận rằng, bạn có thể nói đây là sự khác biệt tương tự, nhưng chắc chắn nó sẽ ảnh hưởng đến quyết định của bạn theo một cách khác so với ví dụ trên.
Trevor

@MathiasBynens - Đó là một quan sát thú vị không liên quan trong ít nhất một năm và có thể là 6 năm.
ArtOfWarfare 7/08/2015

4
Người ta nên sử dụng U + 2019 cho dấu nháy đơn, không phải trích dẫn theo chiều dọc
jjg

95

Dấu nháy đơn

Tôi muốn trích dẫn đôi là tiêu chuẩn, bởi vì chúng có ý nghĩa hơn một chút , nhưng tôi tiếp tục sử dụng dấu ngoặc đơn vì chúng thống trị cảnh.

Dấu nháy đơn:

Không ưu tiên:

Dấu ngoặc kép:


7
Crockford bây giờ thích báo giá gấp đôi.
Adam Calvet Bohl

6
airbnb bây giờ thích dấu ngoặc kép
Suraj Jain

15
@SurajJain Nguồn? Các hướng dẫn về phong cách của AirbnbGoogle vẫn liệt kê đơn là ưu tiên.
Alec Mev

5
@SurajJain Ah, đây là các cấu hình trình kiểm tra kiểu mã, được viết bằng JSON, không cho phép trích dẫn nào cả. Đọc chúng là một cách hay để so sánh các lựa chọn của các dự án khác nhau.
Alec Mev

2
Google hiện thích các trích dẫn đơn
GabrielOshiro

57

Tôi muốn nói rằng sự khác biệt hoàn toàn là phong cách, nhưng tôi thực sự có nghi ngờ của mình. Hãy xem xét ví dụ sau:

/*
   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);

Trong Safari, Chrome, Opera và Internet Explorer (đã được thử nghiệm trong IE7 và IE8), điều này sẽ trả về như sau:

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

Tuy nhiên, Firefox sẽ mang lại một kết quả hơi khác:

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

Các trích dẫn đơn đã được thay thế bằng dấu ngoặc kép. (Cũng lưu ý cách không gian thụt lề được thay thế bằng bốn khoảng trắng.) Điều này tạo ấn tượng rằng ít nhất một trình duyệt phân tích JavaScript bên trong như thể mọi thứ được viết bằng dấu ngoặc kép. Mọi người có thể nghĩ, Firefox sẽ mất ít thời gian hơn để phân tích JavaScript nếu mọi thứ đã được viết theo 'tiêu chuẩn' này.

Nhân tiện, điều đó làm cho tôi trở thành một con gấu trúc rất buồn, vì tôi nghĩ rằng các trích dẫn đơn lẻ trông đẹp hơn trong mã. Ngoài ra, trong các ngôn ngữ lập trình khác, chúng thường được sử dụng nhanh hơn so với dấu ngoặc kép, do đó, sẽ chỉ có ý nghĩa nếu áp dụng tương tự cho JavaScript.

Kết luận: Tôi nghĩ rằng chúng ta cần nghiên cứu thêm về điều này.

Chỉnh sửa: Điều này có thể giải thích kết quả kiểm tra của Peter-Paul Koch từ hồi năm 2003.

Có vẻ như các trích dẫn đơn đôi khi nhanh hơn trong Explorer Windows (khoảng 1/3 các thử nghiệm của tôi đã cho thấy thời gian phản hồi nhanh hơn), nhưng nếu Mozilla cho thấy sự khác biệt hoàn toàn, thì nó xử lý các trích dẫn nhanh hơn một chút. Tôi không tìm thấy sự khác biệt nào trong Opera.

Chỉnh sửa 2014: Các phiên bản hiện đại của Firefox / Spidermonkey không làm điều này nữa.


25
Nếu nó nhanh hơn một chút trong một trình duyệt để làm theo cách này và nhanh hơn một chút để làm theo cách khác, thì có vẻ như hướng dẫn duy nhất chúng ta có thể tránh khỏi đó là chúng ta nên làm bất cứ điều gì chúng ta thích hơn vì nó sẽ làm tổn thương một số người người dùng và giúp đỡ người khác, và số lượng chênh lệch có thể không được chấp nhận. "Tối ưu hóa sớm ..." và tất cả những thứ đó.
Andrew Hedges

2
Tôi xin lỗi nhận xét của tôi không mang tính xây dựng hơn. Tôi chỉ nói rằng cách trình duyệt chọn hiển thị cú pháp bên trong của cú pháp có thể có rất ít liên quan đến cách phân tích cú pháp và do đó có lẽ không phải là lý do để thích một loại trích dẫn hơn loại kia. Dữ liệu hiệu suất so sánh thời gian phân tích cú pháp cho dấu ngoặc đơn và dấu ngoặc kép trên các trình duyệt, mặt khác, sẽ hấp dẫn hơn.
Chris Calo

1
Đây là một câu trả lời tuyệt vời, một break từ phần còn lại mà chỉ kêu 'Họ \' lại cùng họ \ 'lại cùng' ... Bạn nói "Thêm vào đó, trong ngôn ngữ lập trình khác, chúng thường nhanh hơn để sử dụng gấp đôi trích dẫn " , tôi có thể hỏi ngôn ngữ nào? Tôi đã sử dụng các lang thông thường như Java và C #, chưa bao giờ thấy một ngôn ngữ nào khác ngoài JS chấp nhận chuỗi ký tự trong các dấu ngoặc đơn. Các bao vây trích dẫn duy nhất thường chỉ được sử dụng cho các hằng ký tự (chỉ cho phép một char).
ADTC

3
AFAIK điều này đã được sửa trong Firefox 17, Firefox đã từng thực hiện dịch ngược khi thực hiện .toStringnhưng bây giờ nó trả về bản gốc. Firefox hiện đại sẽ không có vấn đề này.
Benjamin Gruenbaum

3
Không biết về sự khác biệt tốc độ. Nhưng tôi muốn lưu ý rằng "Điều này mang lại ấn tượng rằng ít nhất một trình duyệt phân tích JavaScript bên trong như thể mọi thứ được viết bằng dấu ngoặc kép." là vô nghĩa. Nó UNparsed như thể được viết với dấu ngoặc kép. Đó là nó đã biến đại diện bên trong của nó (chỉ lưu trữ chuỗi chứ không phải dấu ngoặc kép) thành phiên bản có thể đọc được của con người, do đó nó tình cờ sử dụng một bộ dấu ngoặc kép. Dù sao đi nữa, điều này dường như đã thay đổi, theo nhận xét của Benjamin.
subub

32

Nếu bạn đang thực hiện JavaScript nội tuyến (có thể là một điều "xấu", nhưng tránh thảo luận đó) thì các trích dẫn đơn là lựa chọn duy nhất của bạn cho chuỗi ký tự, tôi tin.

ví dụ, điều này hoạt động tốt:

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

Nhưng bạn không thể gói "hi" trong dấu ngoặc kép, thông qua bất kỳ phương thức thoát nào tôi biết. Ngay cả &quot;đó sẽ là phỏng đoán tốt nhất của tôi (vì bạn đang thoát các trích dẫn trong giá trị thuộc tính của HTML) không hoạt động với tôi trong Firefox. \"Sẽ không hoạt động vì tại thời điểm này, bạn đang thoát khỏi HTML, không phải JavaScript.

Vì vậy, nếu tên của trò chơi là nhất quán và bạn sẽ thực hiện một số JavaScript nội tuyến trong các phần của ứng dụng của mình, tôi nghĩ rằng các trích dẫn đơn là người chiến thắng. Ai đó làm ơn sửa tôi nếu tôi sai.


8
Đồng ý về việc được cho là một điều xấu, tuy nhiên nếu nó phải được thực hiện, tôi khá chắc chắn có thể sử dụng mã hóa kiểu URL, ví dụ: <a onclick="alert(%22hi%22);">hi</a>từ bộ nhớ này hoạt động, mặc dù nó có thể nằm trong thuộc tính href<a href="javascript:alert(%22hi%22);">hi</a>
Graza

2
@PhiLho bạn nói đúng về điều đó ... Tôi đã giả sử rằng mọi người đang viết các thuộc tính HTML được trích dẫn theo quy ước và sẽ không (1) bán buôn chuyển đổi mọi thứ thành dấu ngoặc đơn hoặc (2) kết hợp và khớp thuộc tính trích dẫn đơn và đôi. Nhưng vâng, bạn đúng đó là hợp pháp
Tom Lianza

4
@Tom Lianza, chắc chắn alert(&quot;hi&quot;)không phải là JavaScript hợp lệ. Nhưng giá trị của các thuộc tính được mã hóa. w3.org/TR/html4/intro/sgmltut.html#didx-attribution
Robert

4
Đồng ý với @Robert tại đây. &quot;là cách chính xác để thoát một trích dẫn kép bên trong thuộc tính HTML. Nó hoạt động tốt trong Firefox. @Denilson, XML (và do đó XHTML) cho phép cả dấu ngoặc đơn và dấu ngoặc kép. Xem AttValuenghĩa đen trong thông số XML tại w3.org/TR/REC-xml/#d0e888 .
Chris Calo

1
@Pacener: Bởi vì nó, uh, không sai. Có một quy ước trong HTML để đặt các thuộc tính giữa các dấu ngoặc kép.
Konrad Borowski

30

Về mặt kỹ thuật không có sự khác biệt, đó chỉ là vấn đề về phong cách và quy ước.

Douglas Crockford khuyên bạn nên sử dụng dấu ngoặc đơn cho chuỗi bên trong và dấu ngoặc kép cho bên ngoài (theo bên ngoài, chúng tôi có nghĩa là những dấu ngoặc kép sẽ được hiển thị cho người dùng ứng dụng, như tin nhắn hoặc cảnh báo).

Cá nhân tôi làm theo điều đó.

CẬP NHẬT: Có vẻ như ông Crockford đã thay đổi quyết định và hiện khuyên bạn nên sử dụng dấu ngoặc kép trong suốt :)


13
Douglas Crockford vs JQuery. Chọn thuốc độc của bạn.
Eric

Lý do của Crockford cho điều này là gì?
BadHorsie

1
Đây là quy ước tôi tuân theo. Đó là sở thích cá nhân nhiều hơn. Tôi thích sử dụng các chuỗi trích dẫn đơn cho các nội dung như bộ chọn jQuery và / hoặc những thứ như getEuityById ('id');, Tôi chỉ thích giao diện của nó với các dấu ngoặc đơn. Nhưng, chuyển sang dấu ngoặc kép cho văn bản bên ngoài, vì nó thường có thể chứa dấu ngoặc kép trong văn bản. Ngoài ra, nó giúp bạn dễ dàng phát hiện và phân biệt giữa các chuỗi bên ngoài và bên trong nếu bạn đang cố gắng tìm lỗi ở cái này hay cái khác.
adimauro

3
Kể từ tháng 4 năm 2016, Douglas Crockford hiện khuyên bạn chỉ nên sử dụng dấu ngoặc kép, do thực tế, nhiều nhà phát triển nhận thấy sự phân đôi bên trong so với bên ngoài khó sử dụng.
Thunderforge

27

Nói đúng ra, không có sự khác biệt về ý nghĩa; vì vậy sự lựa chọn đi xuống để thuận tiện.

Dưới đây là một số yếu tố có thể ảnh hưởng đến lựa chọn của bạn:

  • Kiểu nhà: Một số nhóm nhà phát triển đã sử dụng quy ước này hoặc quy ước khác.
  • Yêu cầu phía khách hàng: Bạn sẽ sử dụng dấu ngoặc kép trong chuỗi chứ? (Xem câu trả lời của Ady).
  • Ngôn ngữ phía máy chủ: Người dùng VB.Net có thể chọn sử dụng dấu ngoặc đơn cho tập lệnh java để tập lệnh có thể được xây dựng phía máy chủ (VB.Net sử dụng dấu ngoặc kép cho chuỗi, vì vậy chuỗi java-script dễ phân biệt nếu họ sử dụng dấu ngoặc đơn).
  • Mã thư viện: Nếu bạn đang sử dụng thư viện sử dụng một kiểu cụ thể, bạn có thể tự cân nhắc sử dụng cùng một kiểu.
  • Sở thích cá nhân: Bạn có thể nghĩ rằng một hoặc phong cách khác trông tốt hơn.

Không đúng, '00100111trong nhị phân, trong khi "00100010nhị phân. Do đó, dấu ngoặc kép chiếm một nửa năng lượng để lưu trữ như dấu ngoặc đơn. Đó là sự khác biệt ngay tại đó.

19

Hãy xem những gì một tài liệu tham khảo làm.

Bên trong jquery.js, mọi chuỗi đều được trích dẫn kép.

Vì vậy, bắt đầu từ bây giờ, tôi sẽ sử dụng các chuỗi trích dẫn kép. (Tôi đã sử dụng đơn!)


11
Tại sao điều này được bỏ phiếu. Đây là một câu hỏi về phong cách và phong cách tốt nhất là phải nhất quán và theo dõi những người đến trước bạn.
Eric

2
+1 Tài liệu API jQuery cũng vậy. Đây là lý do duy nhất tôi giải quyết cho dấu ngoặc kép. Cá nhân, tôi nghĩ rằng câu trả lời rằng "nó thuộc về sở thích cá nhân" là một thiếu sót - tốt nhất là tìm ra một quy ước được sử dụng rộng rãi và gắn bó với nó. Và vì tôi có thể muốn sao chép và dán các ví dụ từ jQuery (trực tiếp hoặc gián tiếp), tôi không muốn phải thay thế các trích dẫn mỗi lần.
Steve Chambers

2
Có lẽ jQuery đã không theo dõi được mọi người trước họ (hoặc thực sự không quan tâm, như hầu hết các chuyên gia khác). ;)
James Wilkins

14

Chỉ cần giữ sự nhất quán trong những gì bạn sử dụng. Nhưng đừng để mức độ thoải mái của bạn xuống.

"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

Cập nhật ES6

Sử dụng cú pháp mẫu bằng chữ .

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

13

Đó chủ yếu là vấn đề về phong cách và sở thích. Có một số khám phá kỹ thuật khá thú vị và hữu ích trong các câu trả lời khác, vì vậy có lẽ điều duy nhất tôi có thể thêm vào là đưa ra một lời khuyên nhỏ trên thế giới.

  • Nếu bạn đang viết mã trong một công ty hoặc nhóm, thì có lẽ nên theo "kiểu nhà".

  • Nếu bạn đang một mình hack một vài dự án phụ, thì hãy nhìn vào một vài nhà lãnh đạo nổi bật trong cộng đồng. Ví dụ: giả sử bạn vào Node.js. Hãy xem các mô-đun cốt lõi, ví dụ underscore.js hoặc express và xem họ sử dụng quy ước nào và xem xét theo đó.

  • Nếu cả hai quy ước đều được sử dụng như nhau, thì hãy trì hoãn
    sở thích cá nhân của bạn .

  • Nếu bạn không có sở thích cá nhân, sau đó lật một đồng xu.

  • Nếu bạn không có tiền, thì bia là của tôi;)


13

Tôi hy vọng tôi không thêm một cái gì đó rõ ràng, nhưng tôi đã vật lộn với DjangoAjax và JSON về điều này.

Giả sử rằng trong mã HTML của bạn, bạn sử dụng dấu ngoặc kép, như thường lệ, tôi khuyên bạn nên sử dụng dấu ngoặc đơn cho phần còn lại trong JavaScript.

Vì vậy, tôi đồng ý với @ady nhưng với một số chăm sóc.

Điểm mấu chốt của tôi là: Trong JavaScript có lẽ nó không thành vấn đề, nhưng ngay khi bạn nhúng nó vào HTML hoặc giống như bạn bắt đầu gặp rắc rối. Bạn nên biết những gì thực sự thoát, đọc, truyền chuỗi của bạn.

Trường hợp đơn giản của tôi là:

tbox.innerHTML = tbox.innerHTML + '<div class="thisbox_des" style="width:210px;" onmouseout="clear()"><a href="https://stackoverflow.com/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>'

Bạn có thể phát hiện \ 'trong trường thứ ba của chương trình này.

Báo giá kép không hoạt động!

Rõ ràng là tại sao, nhưng cũng rõ ràng lý do tại sao chúng ta nên bám vào các trích dẫn duy nhất ... .. tôi đoán ..

Trường hợp này là một nhúng HTML rất đơn giản, lỗi được tạo ra bởi một bản sao / dán đơn giản từ mã JavaScript được trích dẫn hai lần.

Vì vậy, để trả lời câu hỏi:

Cố gắng sử dụng dấu ngoặc đơn trong khi trong HTML. Nó có thể lưu một vài vấn đề gỡ lỗi ...


1
Tôi gặp một vấn đề tương tự với phép nội suy chuỗi ES6 (backticks). Hệ thống xây dựng của tôi đã biên dịch nó thành một chuỗi trích dẫn kép, đã phá vỡ một tiêu đề Auth đã hoạt động với các dấu ngoặc đơn!
Jay

12

Không chắc điều này có liên quan trong thế giới ngày nay hay không, nhưng dấu ngoặc kép được sử dụng cho nội dung cần xử lý các ký tự điều khiển và dấu ngoặc đơn cho các chuỗi không.

Trình biên dịch sẽ chạy thao tác chuỗi trên một chuỗi trích dẫn kép trong khi để lại một chuỗi trích dẫn duy nhất theo nghĩa đen. Điều này được sử dụng để dẫn đến các nhà phát triển 'tốt' chọn sử dụng các trích dẫn đơn cho các chuỗi không chứa các ký tự điều khiển như \nhoặc \0(không được xử lý trong các dấu ngoặc đơn) và dấu ngoặc kép khi họ cần phân tích cú pháp (với chi phí nhỏ trong chu kỳ cpu cho xử lý chuỗi).


14
Không phải là những thứ từng được thực hiện theo một cách và bây giờ chúng được thực hiện theo cách khác. Các ngôn ngữ khác nhau xử lý các trích dẫn khác nhau, và một số công việc như bạn mô tả. Nhưng đây là một câu hỏi JavaScript . Các trích dẫn đơn và kép được xử lý giống hệt nhau trong JavaScript (ngoại trừ việc cho phép các loại trích dẫn khác được sử dụng trong một chuỗi mà không thoát ra). Không có câu hỏi về dấu ngoặc kép cho phép các ký tự điều khiển hoặc nội suy chuỗi. JavaScript không hoạt động như vậy. Các ký tự điều khiển và các chuỗi thoát hoạt động giống như bất kỳ loại trích dẫn nào bạn sử dụng.
Michael Geary

Là một lập trình viên Perl cũ, đây là những gì tôi tiếp tục suy nghĩ mặc dù tôi biết nó không liên quan trong JS.
zbest

12

Nếu bạn đang sử dụng jshint , nó sẽ phát sinh lỗi nếu bạn sử dụng chuỗi trích dẫn kép.

Tôi đã sử dụng nó thông qua việc dàn dựng Yeoman của AngularJS nhưng có lẽ có một cách nào đó để cấu hình nó.

Nhân tiện, khi bạn xử lý HTML thành JavaScript, việc sử dụng một trích dẫn sẽ dễ dàng hơn:

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

Và ít nhất JSON đang sử dụng dấu ngoặc kép cho các chuỗi lặp lại.

Không có cách nào để trả lời câu hỏi của bạn


Đã thực hiện jshint thay đổi? vì trang web demo dường như chấp nhận hoặc không đưa ra bất kỳ cảnh báo / lỗi nào và tôi không thể tìm thấy bất kỳ tùy chọn nào để hạn chế jshint sử dụng. Có lẽ câu trả lời này đã lỗi thời hoặc không chính xác?
Lea Hayes

nếu jshint gây ra lỗi cho một chuỗi trích dẫn kép, thì nó bị hỏng nghiêm trọng. Tiêu chuẩn JavaScript xác định những gì là chính xác và không phải là một kẻ nói dối bị hỏng.
Mecki

10

Nói về hiệu suất, báo giá sẽ không bao giờ là nút cổ chai của bạn, tuy nhiên, hiệu suất là như nhau trong cả hai trường hợp.

Nói về tốc độ mã hóa, nếu bạn sử dụng 'để phân định một chuỗi, bạn sẽ cần phải thoát "dấu ngoặc kép. Bạn có nhiều khả năng cần sử dụng "bên trong chuỗi, ví dụ:

//JSON Objects:
var jsonObject = '{"foo":"bar"}';
//HTML attributes:
document.getElementById("foobar").innerHTML = '<input type="text">';

Sau đó, tôi thích sử dụng 'để phân định chuỗi, vì vậy tôi phải thoát ít ký tự hơn.


10

Một lý do (ngớ ngẩn) để sử dụng các trích dẫn đơn là họ không yêu cầu bạn nhấn phím shift để nhập chúng, trong khi trích dẫn kép thì có. (Tôi giả sử rằng chuỗi trung bình không yêu cầu thoát, đó là một giả định hợp lý.) Bây giờ, giả sử mỗi ngày tôi mã hóa 200 dòng mã. Có lẽ trong 200 dòng đó tôi có 30 trích dẫn. Có thể gõ một trích dẫn kép mất nhiều thời gian hơn 0,1 giây so với gõ một trích dẫn (vì tôi phải nhấn phím shift). Sau đó vào bất kỳ ngày nào, tôi lãng phí 3 giây. Nếu tôi viết mã theo cách này trong 200 ngày một năm trong 40 năm, thì tôi đã lãng phí 6,7 giờ trong cuộc đời mình. Thức ăn cho suy nghĩ.


1
Tôi đoán bạn chỉ đề cập đến bố trí bàn phím tiếng Anh ở đây ... Tôi có một người Đức, tôi phải nhấn shift cho cả hai. Dù sao, tôi không thấy lý do tại sao nhấn phím shift sẽ thêm thời gian vào quy trình. Tôi nhấn shift bằng tay trái và nhấn phím quote bằng tay phải. Nó xảy ra cùng một lúc, đối với tôi không có sự khác biệt.
viết mã

1
@codewandler Vẫn có chi phí phải bấm phím shift ngay cả khi bạn có thể nhấn song song với phím ". Nó buộc bạn phải di chuyển một ngón tay khỏi vị trí mặc định của nó. Ví dụ: giả sử bạn đang gõ: var description = "This is a \"quick\" test";bật Bàn phím tiếng Anh. Đối với bàn phím tiếng Anh, ngón tay hồng hào của bạn phải di chuyển từ phím shift trái lên phím Q ở hàng trên cùng thay vì di chuyển từ phím A sang phím Q. Nói cách khác, nó phải di chuyển gấp đôi khoảng cách . Tôi không chắc phím ở đâu trên bàn phím tiếng Đức, nhưng tôi chắc chắn có một ví dụ tương tự.
John Kurlak

2
@codewandler Ngoài ra, phải gõ shift, ngay cả khi tôi có thể làm điều đó song song, không cho phép ngón tay hồng hào bên trái chuẩn bị nhập ký tự tiếp theo sau "trong bất cứ điều gì bạn đang gõ.
John Kurlak

1
Ý tưởng "lãng phí thời gian" là một chút ngớ ngẩn, nhưng ý tưởng về sự căng thẳng ít tiện lợi hơn (đặc biệt là trong thời đại của hội chứng đường hầm cá chép, v.v.), làm cho nó đạt được một kết quả tốt, đặc biệt là trong trường hợp nó không thành vấn đề. Với hơn 1.000 dòng mã mỗi ngày, điều này có thể tiết kiệm hàng trăm lần uốn hồng hàng ngày.
Beejor

9

Kiểm tra ưu và nhược điểm

Có lợi cho dấu ngoặc đơn

  • Ít lộn xộn thị giác.
  • Tạo HTML: Các thuộc tính HTML thường được phân cách bằng dấu ngoặc kép.

elem.innerHTML = '<a href="' + url + '">Hello</a>';
Tuy nhiên, dấu ngoặc đơn là hợp pháp trong HTML.

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

Hơn nữa, HTML nội tuyến thường là một mô hình chống. Thích mẫu.

  • Tạo JSON: Chỉ cho phép trích dẫn kép trong JSON.

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

Một lần nữa, bạn không cần phải xây dựng JSON theo cách này. JSON.opesify () thường là đủ. Nếu không, sử dụng các mẫu.

Có lợi cho dấu ngoặc kép

  • Nhân đôi sẽ dễ dàng nhận ra hơn nếu bạn không có mã màu. Giống như trong nhật ký giao diện điều khiển hoặc một số loại thiết lập nguồn xem.
  • Tương tự với các ngôn ngữ khác: Trong lập trình shell (Bash, v.v.), các chuỗi ký tự trích dẫn đơn tồn tại, nhưng các lối thoát không được diễn giải bên trong chúng. C và Java sử dụng dấu ngoặc kép cho chuỗi và dấu ngoặc đơn cho ký tự.
  • Nếu bạn muốn mã là JSON hợp lệ, bạn cần sử dụng dấu ngoặc kép.

Có lợi cho cả hai

Không có sự khác biệt giữa hai trong JavaScript. Do đó, bạn có thể sử dụng bất cứ điều gì thuận tiện vào lúc này. Ví dụ: tất cả các chuỗi ký tự sau đây đều tạo ra cùng một chuỗi:

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

Dấu ngoặc đơn cho chuỗi bên trong và gấp đôi cho bên ngoài. Điều đó cho phép bạn phân biệt các hằng số nội bộ với các chuỗi sẽ được hiển thị cho người dùng (hoặc được ghi vào đĩa, v.v.). Rõ ràng, bạn nên tránh đặt mã sau vào mã của mình, nhưng điều đó không thể luôn luôn được thực hiện.


8

Một điều nữa mà bạn có thể muốn xem là một lý do cho việc chuyển từ dấu ngoặc kép sang dấu ngoặc đơn là sự gia tăng mức độ phổ biến của tập lệnh phía máy chủ. Khi sử dụng PHP, bạn có thể truyền các biến và phân tích các hàm javascript bằng chuỗi và biến trong PHP.

Nếu bạn viết một chuỗi và sử dụng dấu ngoặc kép cho PHP của mình, bạn sẽ không phải thoát bất kỳ dấu ngoặc đơn nào và PHP sẽ tự động truy xuất giá trị của các biến cho bạn.

Ví dụ: Tôi cần chạy một hàm javascript bằng cách sử dụng một biến từ máy chủ của tôi.

public static function redirectPage( $pageLocation )
{
    echo "<script type='text/javascript'>window.location = '$pageLocation';</script>";
}

Điều này giúp tôi tiết kiệm rất nhiều rắc rối khi phải xử lý các chuỗi tham gia và tôi có thể gọi javascript từ PHP một cách hiệu quả. Đây chỉ là một ví dụ, nhưng đây có thể là một trong nhiều lý do tại sao các lập trình viên mặc định cho các trích dẫn đơn trong javascript.

Trích dẫn từ các tài liệu PHP : "Tính năng quan trọng nhất của chuỗi trích dẫn kép là thực tế là tên biến sẽ được mở rộng. Xem phân tích chuỗi để biết chi tiết."


+1, tôi thực hiện điều này trong dự án MVC.Net của mình để các trích dẫn kép từ C # không can thiệp vào các trích dẫn đơn từ javascript và ngược lại.
DCShannon

3
Tôi nghĩ rằng nếu bạn đang viết JavaScript lên trang của bạn từ một phương thức lớp PHP thì bạn có vấn đề lớn hơn.
BadHorsie

6

Có những người tuyên bố để thấy sự khác biệt hiệu suất: chủ đề danh sách gửi thư cũ . Nhưng tôi không thể tìm thấy bất kỳ ai trong số họ được xác nhận.

Điều chính là xem xét loại trích dẫn nào (gấp đôi hoặc đơn) mà bạn đang sử dụng bên trong chuỗi của mình. Nó giúp giữ cho số lượng thoát thấp. Chẳng hạn, khi bạn đang làm việc với html bên trong các chuỗi của mình, việc sử dụng các dấu ngoặc đơn sẽ dễ dàng hơn để bạn không phải thoát tất cả các dấu ngoặc kép xung quanh các thuộc tính.


Mặc dù các thuộc tính cũng có thể được bao quanh bằng các dấu ngoặc đơn :)
Damir Zekić

Quyền của bạn, tôi nghĩ rằng xml và xhtml quy định dấu ngoặc kép bao quanh các thuộc tính, nhưng dấu ngoặc đơn được phép.
Michiel Overeem

6

Tôi sẽ sử dụng dấu ngoặc kép khi không thể sử dụng dấu ngoặc đơn và ngược lại:

"'" + singleQuotedValue + "'"
'"' + doubleQuotedValue + '"'

Thay vì:

'\'' + singleQuotedValue + '\''
"\"" + doubleQuotedValue + "\""

Thế còn một chuỗi chứa cả trích dẫn đơn và trích dẫn kép như O'rea "lly
sudhAnsu63

6

Không có sự khác biệt giữa dấu ngoặc đơn và dấu ngoặc kép trong JavaScript.

Đặc điểm kỹ thuật là quan trọng:

Có thể có khác biệt về hiệu suất, nhưng chúng hoàn toàn tối thiểu và có thể thay đổi hàng ngày theo cách triển khai của trình duyệt. Thảo luận thêm là vô ích trừ khi ứng dụng JavaScript của bạn dài hàng trăm ngàn.

Nó giống như một điểm chuẩn nếu

a=b;

nhanh hơn

a = b;

(không gian thêm)

ngày nay, trong một trình duyệt và nền tảng cụ thể, v.v.


2
không có không gian thì nhanh hơn ít ký tự để phân tích cú pháp trong chuỗi. : p
pilavdzice

6

Khi sử dụng CoffeeScript tôi sử dụng dấu ngoặc kép. Tôi đồng ý rằng bạn nên chọn một trong hai và bám vào nó. CoffeeScript cung cấp cho bạn phép nội suy khi sử dụng dấu ngoặc kép.

"This is my #{name}"

ES6 đang sử dụng dấu tick ngược (`) cho chuỗi mẫu. Điều này có thể có lý do chính đáng, nhưng khi mã hóa, có thể rất khó để thay đổi ký tự chuỗi ký tự từ dấu ngoặc kép hoặc dấu ngoặc kép thành dấu tích ngược để có được tính năng nội suy. CoffeeScript có thể không hoàn hảo, nhưng sử dụng cùng một ký tự chuỗi ký tự ở mọi nơi (dấu ngoặc kép) và luôn có thể nội suy là một tính năng hay.

`This is my ${name}`

Đối với tôi, đánh dấu lại là một người chiến thắng rõ ràng trong cuộc thi này, (hầu như) không có sự hiện diện bên trong các chuỗi văn bản phổ biến, cộng với phép nội suy var
Simone Poggi

5

Nếu bạn nhảy lùi lại giữa JavaScript và C #, tốt nhất bạn nên huấn luyện các ngón tay của mình cho quy ước chung là dấu ngoặc kép.


5

Tôi đã chạy khoảng 20 lần sau đây. Và có vẻ như báo giá kép nhanh hơn khoảng 20%.

Điều thú vị là, nếu bạn thay đổi phần 2 và phần 1 xung quanh, các trích dẫn đơn sẽ nhanh hơn khoảng 20%.

//Part1
var r='';
var iTime3 = new Date().valueOf();
for(var j=0; j<1000000; j++) {
    r+='a';
}
var iTime4 = new Date().valueOf();
alert('With single quote : ' + (iTime4 - iTime3));  

//Part 2                
var s="";
var iTime1 = new Date().valueOf();
for(var i=0; i<1000000; i++) {
    s += "a";
}
var iTime2 = new Date().valueOf();
alert('With double quote: ' + (iTime2 - iTime1));

31
Nói cách khác, bạn đã thấy rằng mã sau này chạy nhanh nhất. Đây là vấn đề khi làm điểm chuẩn vi mô. Bạn phải tính đến công cụ JS tối ưu hóa mã khi nó chạy. (Bạn sẽ thấy hiệu ứng tương tự khi đo điểm chuẩn Java do cách JIT hoạt động.)
David Phillips

4
Ngày mới đầu tiên chậm, thêm var dummy_date = new Date()vào bắt đầu
Lauri

1
Mức độ tối ưu hóa vi mô ở đây rất ngớ ngẩn đến nỗi bạn cũng có thể lập luận rằng các trích dẫn đơn sẽ nhanh hơn để gõ, dẫn đến phát triển nhanh hơn.
Beejor

4

Hoàn toàn không có sự khác biệt, do đó, chủ yếu là vấn đề về hương vị và những gì có trong chuỗi (hoặc nếu chính mã JS nằm trong một chuỗi), để giữ cho số lần thoát thấp.

Truyền thuyết chênh lệch tốc độ có thể đến từ thế giới PHP, nơi hai trích dẫn có hành vi khác nhau.


Và Ruby, tôi có thể thêm. Python có hành vi tương tự như JavaScript: không có sự khác biệt nào được thực hiện giữa các trích dẫn đơn / kép.
Damir Zekić

4

Sau khi đọc tất cả các câu trả lời có thể nhanh hơn hoặc có thể có lợi thế, tôi sẽ nói trích dẫn kép là tốt hơn hoặc có thể nhanh hơn vì trình biên dịch đóng của Google chuyển đổi dấu ngoặc đơn thành dấu ngoặc kép.


Bạn có biết tại sao nó làm điều đó?
ma11hew28

Tôi không biết. Có lẽ đó là một quy ước mã hóa và không có gì đặc biệt.
Mohsen

4

Bây giờ là năm 2020, chúng ta nên xem xét tùy chọn thứ ba cho Javascript: Backtick duy nhất cho mọi thứ.

Điều này có thể được sử dụng ở mọi nơi thay vì dấu ngoặc đơn hoặc kép.

Nó cho phép bạn làm tất cả mọi thứ!

  1. Nhúng các trích dẫn đơn bên trong nó: 'Thật tuyệt!'
  2. Nhúng hai dấu ngoặc kép bên trong nó: 'Thật "tuyệt vời!'
  3. Sử dụng phép nội suy chuỗi: `Đó là" $ {better} "hơn là tuyệt vời!`
  4. Nó cho phép nhiều dòng: `

    Điều này

    Làm cho

    Javascript

    Tốt hơn!

    `

Nó cũng không gây ra bất kỳ mất hiệu suất nào khi thay thế hai cái còn lại: https://medium.com/javascript-in-plain-english/are-backticks-slower-than-other-strings-in-javascript-ce4abf9b9fa


3

Nếu nguồn JS của bạn là:

elem.innerHTML="<img src='smily' alt='It\'s a Smily' style='width:50px'>";

Nguồn HTML sẽ là:

<img src="smiley" alt="It's a Smiley" style="width:50px">

hoặc cho HTML5

<img src=smiley alt="It's a Smiley" style=width:50px>

JS cho phép các mảng như thế:

var arr=['this','that'];

Nhưng nếu bạn xâu chuỗi nó, nó sẽ là lý do tương thích:

JSON=["this","that"]

Tôi chắc chắn rằng điều này sẽ mất một thời gian.


3

Chỉ cần thêm 2 xu của tôi: Khi làm việc với cả JS và PHP vài năm trước, tôi đã quen với việc sử dụng các trích dẫn đơn để tôi có thể nhập ký tự thoát ('\') mà không phải thoát khỏi nó. Tôi thường sử dụng nó khi gõ chuỗi thô với đường dẫn tệp, v.v ( http://en.wikipedia.org/wiki/String_literal#Raw_strings )

Dù sao đi nữa, quy ước của tôi cuối cùng đã trở thành việc sử dụng các trích dẫn đơn trên các chuỗi thô kiểu định danh, chẳng hạn như if (typeof s == 'string') ...(trong đó các ký tự thoát sẽ không bao giờ được sử dụng - bao giờ) và trích dẫn kép cho các văn bản , chẳng hạn như "Này, có chuyện gì?". Tôi cũng sử dụng các trích dẫn đơn trong các bình luận như một quy ước đánh máy để hiển thị tên định danh. Đây chỉ là một quy tắc và tôi chỉ dừng lại khi cần, chẳng hạn như khi gõ chuỗi HTML '<a href="#"> like so <a>'(mặc dù bạn cũng có thể đảo ngược các trích dẫn ở đây). Tôi cũng biết rằng, trong trường hợp JSON, các trích dẫn kép được sử dụng cho các tên - nhưng bên ngoài đó, cá nhân tôi thích các trích dẫn đơn khi thoát không bao giờ được yêu cầu cho văn bản giữa các trích dẫn - nhưdocument.createElement('div') .

Dòng dưới cùng, và như một số người đã đề cập / ám chỉ, chọn một quy ước, gắn bó với nó và chỉ đi chệch khi cần thiết.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.