ฉันจะแบ่งสตริงข้ามโค้ดมากกว่าหนึ่งบรรทัดใน JavaScript ได้อย่างไร


198

มีอักขระใน JavaScript เพื่อแยกบรรทัดของรหัสเพื่อให้สามารถอ่านได้อย่างต่อเนื่องแม้จะอยู่ในบรรทัดใหม่หรือไม่?

สิ่งที่ต้องการ....

1. การแจ้งเตือน ("กรุณาเลือกไฟล์   
2. \ เพื่อลบ ");

คำตอบ:


272

ในตัวอย่างของคุณคุณสามารถแบ่งสตริงออกเป็นสองส่วน:

alert ( "Please Select file"
 + " to delete");

หรือเมื่อเป็นสตริงเช่นเดียวกับในกรณีของคุณคุณสามารถใช้แบ็กสแลชตามที่ @Gumbo แนะนำ:

alert ( "Please Select file\
 to delete");

โปรดทราบว่าวิธีการแบ็กสแลชนี้ไม่จำเป็นต้องได้รับการสนับสนุนและอาจไม่ได้รับการสนับสนุนในระดับสากล มันเป็นไม่ได้ในECMA 5.1 สเปค

เมื่อทำงานกับรหัสอื่น ๆ (ไม่ใช่ในเครื่องหมายคำพูด) การขึ้นบรรทัดใหม่จะถูกละเว้นและยอมรับได้อย่างสมบูรณ์ ตัวอย่างเช่น:

if(SuperLongConditionWhyIsThisSoLong
  && SuperLongConditionOnAnotherLine
  && SuperLongConditionOnThirdLineSheesh)
{
    // launch_missiles();
}

คุณสามารถแบ่งคำสั่ง if ได้ไหม?
TTT

17
แต่ระวังกลไกการแทรกเซมิโคลอนอัตโนมัติ: ลองส่งคืนหนึ่งแถวและ "สตริง" ที่อยู่ถัดไปท้ายฟังก์ชันและคุณจะได้ผลลัพธ์ที่ไม่ได้กำหนด
บาง

เป็นไปตามมาตรฐานนี้หรือไม่? เบราว์เซอร์ที่รองรับทั้งหมดจะรองรับหรือไม่ อย่าเก่าเบราว์เซอร์สนับสนุนมันวันนี้? ไม่ครอบคลุมคำถามสำคัญเหล่านี้ -1
ulidtko

3
ถ้าคุณจะถามคำถามใหม่ ๆ ที่ยังไม่ได้ถามคุณจะต้องให้โอกาสเราตอบคำถาม ฉันอัปเดตคำตอบของฉันด้วยการคาดเดาที่น่าพอใจ
Michael Haren

2
ระวังแบ็กสแลช มันจะกินทั้งหมด blancks จนกว่าจะพบว่าไม่มีที่ว่างเปล่า ดังนั้นตัวอย่างจะ "แจ้งเตือน": กรุณาเลือกไฟล์ที่จะลบ หากคุณต้องการพื้นที่สีขาวระหว่างไฟล์และถึงคุณควรวางไว้ก่อน de backslash
jgomo3

41

ใส่แบ็กสแลชที่ท้ายบรรทัด:

alert("Please Select file\
 to delete");

แก้ไข     ฉันต้องทราบว่านี่ไม่ใช่ส่วนหนึ่งของสตริง ECMAScriptเนื่องจากไม่อนุญาตให้ใช้อักขระที่ลงท้ายด้วยบรรทัด :

A ' LineTerminatorตัวอักษร' \ไม่สามารถปรากฏในตัวอักษรสตริงแม้ว่านำหน้าด้วยเครื่องหมาย วิธีที่ถูกต้องจะทำให้เกิดตัวละครสายเทอร์มิให้เป็นส่วนหนึ่งของค่าสตริงของตัวอักษรสตริงคือการใช้ลำดับหนีเช่นหรือ\n\u000A

ดังนั้นการใช้การต่อสตริงเป็นตัวเลือกที่ดีกว่า


อัปเดต 2015-01-05     สตริงตัวอักษรใน ECMAScript5อนุญาตไวยากรณ์ที่กล่าวถึง:

อักขระตัวคั่นบรรทัดไม่สามารถปรากฏในสตริงตัวอักษรยกเว้นเป็นส่วนหนึ่งของLineContinuationเพื่อสร้างลำดับอักขระว่างเปล่า วิธีที่ถูกต้องจะทำให้เกิดตัวละครสายเทอร์มิให้เป็นส่วนหนึ่งของค่าสายอักขระของตัวอักษรสตริงคือการใช้ลำดับหนีเช่นหรือ\n\u000A


1
ECMAScript5อนุญาต: " อักขระตัวสิ้นสุดบรรทัดไม่สามารถปรากฏในตัวอักษรสตริงยกเว้นว่าเป็นส่วนหนึ่งของ LineContinuation เพื่อสร้างลำดับอักขระว่างวิธีที่ถูกต้องในการทำให้อักขระตัวสิ้นสุดบรรทัดเป็นส่วนหนึ่งของค่าสตริงของตัวอักษรสตริงคือ ใช้ลำดับหนีเช่น\nหรือ\u000A. "
Oriol

1
@Oriol ขอบคุณสำหรับการบันทึกปรับปรุงคำตอบตาม!
Gumbo

1
นี่เป็นปัญหาหรือไม่ถ้าไฟล์นั้นสร้างขึ้นใน Windows กล่าวอีกนัยหนึ่งบรรทัดที่ลงท้ายด้วย\r\nแทนที่จะเป็น\n?
Adam Plocher

31

ECMAScript 6 แนะนำสตริงเท็มเพลต:

สตริงเทมเพลตเป็นตัวอักษรสตริงที่อนุญาตให้มีการแสดงออกที่ฝังตัว คุณสามารถใช้สตริงหลายบรรทัดและคุณสมบัติการแก้ไขสตริงด้วย

ตัวอย่างเช่น,

alert(`Please Select file   
to delete`);

จะแจ้งเตือน

Please Select file   
to delete

1
ว้าวยอดเยี่ยม ในการรับ `` เหล่านี้บนแป้นพิมพ์ให้กด SHIFT + ´สองครั้ง บนแป้นพิมพ์ภาษาเยอรมันปุ่มนั้นอยู่ใกล้กับปุ่ม Backspace
นาฑู

@Nadu นั่นขึ้นอยู่กับคีย์บอร์ด ของฉันมี`กุญแจ เนื่องจากมันเป็นตัวดัดแปลงจึงไม่ได้เขียนโดยตรง นั่นอาจเป็นเหตุผลว่าทำไมคุณถึงคิดว่าคุณควรกดสองครั้ง แต่มันจะเขียนสองอัน กด spacebar เพื่อเขียนเพียงหนึ่ง
Oriol

ไม่น่าเชื่อว่าจะใช้เวลานานมากในการอนุญาตสตริงหลายบรรทัดโดยไม่มีแฮ็กแฟนซี ... คำถามคืออะไรจะใช้เป็นตัวแยกบรรทัด - อักขระแบบ hardcoded หรือตัวแบ่งบรรทัดของเอกสาร?
StanE

1
มีปัญหากับ `` ในกรณีที่คุณต้องการขยายไฟล์ * .js
Raskolnikov

1
พิจารณาว่ายังคงมีอยู่ในเดือนมีนาคม 2018 มีเพียง 89% ของเบราว์เซอร์ที่ใช้ทั่วโลกรองรับเทมเพลตสตริงตาม caniuse.com caniuse.com/#feat=template-literals
FFirmenich

7

แยกสตริงออกเป็นสองส่วน 

alert ("Please select file " +
       "to delete");

9
แต่อย่าลืมที่จะมีช่องว่างในตอนท้ายของครั้งแรกหรือจุดเริ่มต้นของก้อนที่สอง;)
Majid Fouladpour

4

ที่น่าสนใจที่จะต้องทราบ พยายาม:

alert("Some \
    string \
    wrapped \
    across \
    mutliples lines.")

และสิ่งนี้ใช้ได้ผล อย่างไรก็ตามเมื่อเกิดอุบัติเหตุ! มีอักขระเว้นวรรคตามแบ็กสแลชสุดท้าย (แบ็กสแลชอื่น ๆ ทั้งหมดอยู่ที่ท้ายบรรทัด) และสิ่งนี้ทำให้เกิดข้อผิดพลาดในจาวาสคริปต์! แม้ว่าการลบพื้นที่นี้จะแก้ไขข้อผิดพลาดได้

นี่คือใน ADT สำหรับ Android โดยใช้ Cordova


1
ใช้เวลาส่วนใหญ่ในการต่อสู้กับปัญหานี้ในวันนี้และฉันก็ค้นพบด้วยเช่นกันว่าการที่ตัวละครช่องว่างหลังจากสแลชใด ๆ ทำให้แอพพลิเคชั่นไอออนิกของฉันไม่คอมไพล์ ขอบคุณ!
rekordboy

1
ไม่สามารถเชื่อว่ามีใครแสดงความคิดเห็นว่าสิ่งนี้จะรวมการเยื้องใด ๆ ที่อยู่ในรหัสเป็นส่วนหนึ่งของสตริงดังนั้นตัวอย่างจะกลายเป็นSome\n<4 spaces>string\n<4 spaces>wrapped\n<4 spaces>across\n<4 spaces>multiple lines.
JHH


0

คุณสามารถแบ่งค่าคงที่สตริงที่ยาวเป็นโลจิคัลแบบลอจิคัลและกำหนดลงในอาร์เรย์ จากนั้นทำjoinกับสตริงว่างเป็นตัวคั่น

var stringArray = [
  '1. This is first part....',
  '2. This is second part.....',
  '3. Finishing here.'
];

var bigLongString = stringArray.join('');
console.log(bigLongString);

ผลลัพธ์จะเป็น:

  1. นี่เป็นส่วนแรก .... 2. นี่คือส่วนที่สอง ..... 3 จบที่นี่

วิธีนี้มีประสิทธิภาพเพียงเล็กน้อย แต่คุณสามารถอ่านและบำรุงรักษาโค้ดได้


0

ทางออกที่ดี สำหรับผู้ใช้ VSCodeหากสตริงที่แบ่งเป็นหลายบรรทัดทำให้เกิดปัญหา (ฉันต้องเผชิญกับปัญหานี้เมื่อฉันต้องทดสอบโทเค็น JWT ที่มีความยาว


-3

ฉันลองคำแนะนำด้านบนจำนวนหนึ่ง แต่ได้รับคำเตือนเกี่ยวกับตัวอักษร ILLEGAL ในเครื่องมือตรวจสอบโค้ด Chrome รายการต่อไปนี้ใช้ได้สำหรับฉัน (ผ่านการทดสอบใน Chrome เท่านั้น!)

alert('stuff on line 1\\nstuff on line 2);

ออกมาเหมือน ...

stuff on line 1
stuff on line 2

หมายเหตุแบ็กสแลชสองครั้ง !! ... นี่น่าจะสำคัญนะ!


-5

ไม่จำเป็นต้องมีการแบ่งด้วยตนเองในรหัส เพียงเพิ่ม \ n ตำแหน่งที่คุณต้องการทำลาย

alert ("Please Select file \n to delete");

นี้จะแสดงการแจ้งเตือนเช่น

Please select file 
to delete.

ผู้มีสิทธิเลือกตั้งลงไปคุณช่วยบอกเหตุผลของการโหวตลงได้ไหม โซลูชันนี้ใช้ได้สำหรับฉันเสมอ
Narendra

27
ฉันไม่รู้ว่าใครโหวตหรือทำไม แต่เพียงเดาว่า: op ต้องการทราบวิธีขยายข้อความตามตัวอักษรในโค้ดหลายบรรทัดแทนที่จะใส่ตัวแบ่งบรรทัดในเอาต์พุต
Zarepheth
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.