ฉันจะสร้างสตริงหลายบรรทัดใน node.js ได้อย่างไร


128

ด้วยการเพิ่มขึ้นของ node.js สตริงแบบหลายบรรทัดจึงมีความจำเป็นมากขึ้นใน JavaScript

  1. มีวิธีพิเศษในการทำเช่นนี้ใน Node.JS แม้ว่าจะไม่สามารถใช้งานได้ในเบราว์เซอร์?
  2. มีแผนใด ๆ หรืออย่างน้อยก็มีการร้องขอคุณสมบัติเพื่อทำสิ่งนี้ที่ฉันสามารถสนับสนุนได้หรือไม่?

ฉันรู้แล้วว่าคุณสามารถใช้\n\ในตอนท้ายของทุกบรรทัดนั่นไม่ใช่สิ่งที่ฉันต้องการ


1
ทำไมคุณถึงต้องใส่ฮาร์ดไลน์รีเทิร์น? ไม่มีสิ่งใดใน DOM รองรับ (ยกเว้น "pre") และประเภทผลตอบแทนทั่วไปอื่น ๆ ทั้งหมดไม่สนใจ
jcolebrand

ดังนั้นฉันจะไม่ลงเอยด้วยแท็บทางซ้ายโดยไม่มีผลตอบแทนทางขวา ฉันชอบที่จะมีทั้งสองอย่างหรือไม่มีเลย ตอนนี้ฉันกำลังใช้print( '<div>')พิมพ์ HTML ของฉัน ไม่มีทั้งแท็บและผลตอบแทนที่ "เรียบร้อย" แต่จะง่ายกว่าถ้าใช้<<EOF..EOFสตริงสไตล์Perl หรือไฟล์ JSP แบบ Java อย่างไรก็ตามฉันต้องสามารถป้อนตัวแปรในสตริงหลายบรรทัดได้เมื่อมันมาถึง ฉันจะไม่ทำในตอนนี้
Bryan Field

9
@jcolebrand: Node.JS ไม่ได้เกี่ยวข้องกับการจัดการ DOM เป็นหลัก เป็นสภาพแวดล้อมการพัฒนาแอปพลิเคชันเต็มรูปแบบ ดูnodejs.org
Roy Tinker

@RoyTinker ใช่ แต่เขาเรียกเบราว์เซอร์ในเวลานั้นและยิ่งไปกว่านั้นเขาเรียกการไม่\nใช้งานดังนั้น ... นั่นเป็นเบราว์เซอร์ที่ค่อนข้างดี
jcolebrand

@GeorgeBailey หากคุณยังใช้ stack overflow คุณสามารถแก้ไขคำตอบที่ถูกต้องที่นี่ได้หรือไม่?
mikemaccana

คำตอบ:


165

โหนด v4 และโหนดเวอร์ชันปัจจุบัน

ตั้งแต่ ES6 (และเวอร์ชันอื่น ๆ ของ Node ที่มากกว่า v4) ประเภทภายใน "template literal" ใหม่ได้ถูกเพิ่มเข้าไปใน Javascript (แสดงโดย back-ticks "" ") ซึ่งสามารถใช้สร้างสตริงหลายบรรทัดได้เช่นกัน :

`this is a 
single string`

ซึ่งประเมินเป็น: 'this is a\nsingle string'.

โปรดสังเกตว่าขึ้นบรรทัดใหม่ที่ท้ายบรรทัดแรกจะรวมอยู่ในสตริงผลลัพธ์

เพิ่มตัวอักษรเทมเพลตเพื่อให้โปรแกรมเมอร์สร้างสตริงที่สามารถแทรกค่าหรือรหัสลงในสตริงลิเทอรัลได้โดยตรงโดยไม่ต้องใช้util.formatหรือเทมพลาเตอร์อื่น ๆ เช่นใน:

let num=10;

console.log(`the result of ${num} plus ${num} is ${num + num}.`);

ซึ่งจะพิมพ์ "ผลลัพธ์ของ 10 บวก 10 คือ 20" ไปที่คอนโซล

เวอร์ชันเก่ากว่าของโหนด

โหนดรุ่นเก่าสามารถใช้อักขระ "ความต่อเนื่องของบรรทัด" เพื่อให้คุณเขียนสตริงหลายบรรทัดเช่น:

'this is a \
single string'

ซึ่งประเมินเป็น: 'this is a single string'.

โปรดสังเกตว่าการขึ้นบรรทัดใหม่ที่ท้ายบรรทัดแรกจะไม่รวมอยู่ในสตริงผลลัพธ์


ฉันคิดว่าฉันจะสิ้นสุดการใช้stackoverflow.com/questions/805107/... ฉันอาจขยายมันเพื่อที่ฉันจะได้ใช้ตัวแปร มันจะสร้างสรรค์อย่างแน่นอน! แต่เนื่องจากนี่คือ Node.JS ฉันจึงไม่ต้องกังวลเกี่ยวกับความเข้ากันได้ของเบราว์เซอร์และในกรณีของฉันไม่ใช่ความเข้ากันได้ของเวอร์ชัน
Bryan Field

6
"Javascript ไม่รองรับสตริงแบบหลายบรรทัด ... "ทำเหมือน ES5 และอยู่ใน V8 (เอ็นจิ้น JavaScript ของ Google) ดังนั้นจึงน่าจะอยู่ใน NodeJS (ซึ่งใช้ V8) ดูLineContinuationใน [ส่วน 7.8.4] * ( es5.github.com/#x7.8.4 ) การสนับสนุนเครื่องมืออาจไม่สมบูรณ์ในขณะหนึ่ง
TJ Crowder

มันอยู่ใน io.js แต่ยังไม่ใช่ Node.JS - ฉันเพิ่มคำตอบพร้อมลิงค์อีกสองสามลิงค์
Simon D

1
ตอนนี้โหนด 4.0+ รองรับสตริงแบบหลายสายภายในแล้ว
Rob Raisch

46

สตริงหลายบรรทัดเป็นส่วนปัจจุบันของ JavaScript (ตั้งแต่ ES6) และได้รับการสนับสนุนใน node.js v4.0.0 และใหม่กว่า

var text = `Lorem ipsum dolor 
sit amet, consectetur 
adipisicing 
elit.  `;

console.log(text);

2
คำตอบนี้ควรได้รับการโหวตให้ติดอันดับต้น ๆ ทันที! โปรดดูdeveloper.mozilla.org/en-US/docs/Web/JavaScript/Reference/…สำหรับรายละเอียดเกี่ยวกับสตริงเทมเพลต
user3413723

2
อาจต้องการทราบว่าคุณสามารถเพิ่มตัวแปรได้อย่างง่ายดายโดยการเพิ่ม $ {variablehere} syntax ภายในเทมเพลต (the `` ticks)
Joseph Astrahan

40

คุณกำลังมองหาอะไรเมื่อคุณหมายถึงสตริงหลายเส้น

คุณกำลังมองหาสิ่งที่ชอบ:

var str = "Some \
    String \
    Here";

ซึ่งจะพิมพ์เป็น "Some String Here"

ในกรณีนี้โปรดทราบว่าข้างต้นเป็น Javascript ที่ถูกต้อง แต่นี่ไม่ใช่:

var str = "Some \ 
    String \
    Here";

อะไรคือความแตกต่าง? ช่องว่างหลัง\. ขอให้สนุกกับการแก้ไขข้อบกพร่องนั้น


bollocks ที่ดี มันจะไม่ให้ฉันแสดงช่องว่างหลัง \ โดยไม่ต้องใส่อักขระตรงนั้น
jcolebrand

1
@jcolebrand: ใช่ไม่สนุกเลย: P
Robert


1
นี่คือการแฮ็กที่สกปรก กรุณาอย่า!
Raynos

1
ขอบคุณ @ โรเบิร์ตพื้นที่หลังจากข้อมูลเชิงลึก '\' ช่วยฉันได้บ้าง!
gpestana

8

ลองดูที่ที่mstringโมดูลสำหรับ node.js.

นี่เป็นโมดูลเล็ก ๆ ง่ายๆที่ให้คุณมีสตริงหลายบรรทัดใน JavaScript

เพียงทำสิ่งนี้:

var M = require('mstring')

var mystring = M(function(){/*** Ontario Mining and Forestry Group ***/})

ที่จะได้รับ

mystring === "Ontario\nMining and\nForestry\nGroup"

และนั่นก็สวยมาก

วิธีการทำงาน
ใน Node.js คุณสามารถเรียกใช้.toStringเมธอดของฟังก์ชันและจะให้ซอร์สโค้ดของข้อกำหนดฟังก์ชันรวมถึงความคิดเห็นใด ๆ นิพจน์ทั่วไปดึงดูดเนื้อหาของความคิดเห็น

ใช่มันเป็นการแฮ็ก แรงบันดาลใจจากความคิดเห็นใบปลิวจากโดมินิค Tarr


หมายเหตุ: โมดูล (ณ ปี 2012/13/11) ไม่อนุญาตให้มีช่องว่างก่อนการปิด***/ดังนั้นคุณจะต้องแฮ็คด้วยตัวเอง


1
หรือใช้สาขาของ mstring ของคุณซึ่งมีช่องว่างฟิกซ์ ขอบคุณ! github.com/davidmurdoch/mstring
Druska

6

นอกเหนือจากสิ่งที่ผู้คนโพสต์ไว้ที่นี่แล้วฉันได้ยินมาว่าการต่อข้อมูลสามารถทำได้เร็วกว่าการเข้าร่วมใน javascript vms ที่ทันสมัยมาก ความหมาย:

var a = 
[ "hey man, this is on a line",
  "and this is on another",
  "and this is on a third"
].join('\n');

จะช้ากว่า:

var a = "hey man, this is on a line\n" + 
        "and this is on another\n" +
        "and this is on a third";    

ในบางกรณี http://jsperf.com/string-concat-versus-array-join/3

ในฐานะที่อื่นกันฉันพบว่าหนึ่งในคุณสมบัติที่น่าสนใจอื่น ๆ ในนี้CoffeeScript ใช่ฉันรู้ว่าคนเกลียดจะเกลียด

html = '''
       <strong>
         cup of coffeescript
       </strong>
       '''

เหมาะอย่างยิ่งสำหรับตัวอย่าง html ฉันไม่ได้บอกเหตุผลที่จะใช้มัน แต่ฉันหวังว่ามันจะลงจอดในดินแดน ecma :-(

หยอกเย้า


1
สิ่งเดียวที่ผิดกับ CoffeeScript สำหรับฉันคือสิ่งเดียวกับที่ Groovy ตรวจสอบล่าสุด เมื่อไฟล์ถูกแปลงจาก.coffeeเป็น.jsเป็นตัวเลขบรรทัดจะสับสน ฉันไม่ได้ลอง CoffeeScript แต่เมื่อฉันลอง Groovy ฉันพบว่ามันค่อนข้างยากที่จะดีบักโดยไม่ได้รับ.javaไฟล์ที่สร้างขึ้น
Bryan Field

ฉันได้เขียนโครงการที่ใหญ่พอสมควรเกี่ยวกับกาแฟ คุณต้องดูรหัสที่คอมไพล์แล้ว อย่างไรก็ตามมันอ่านง่าย imo ยังคงมีความอัปยศที่ไม่สามารถยอมรับได้กับ Coffeescript ในชุมชนโหนดแม้ว่าจะมีการเขียนโครงการขนาดใหญ่หลายโครงการ (zombie.js, pow, riak-js) ฉันกำลังย้าย OSS ที่เล็กกว่าของฉันไปบางส่วนเพราะมีคนพูดว่า 'โอ้กาแฟแตก' และดำเนินการต่อทันทีแม้ว่าคุณจะไม่ต้องใช้กาแฟในการใช้ห้องสมุดก็ตาม
Josh

ฉันเกลียด Coffeescript : P แต่ฉันเป็นแฟนของ '' 'string block! หรือ ... ไวยากรณ์ PHP heredoc
BMiner

รูปแบบอาร์เรย์ (โดยใช้ join ('\ n')) จะช้ากว่าการต่อสตริงธรรมดาในกรณีส่วนใหญ่
BMiner

1
ยกเว้น IE7 และต่ำกว่านี้เป็นจริง และคุณจะทราบว่าฉันพูดและเชื่อมโยงกับ jsperf
Josh


1

หากคุณใช้ io.js จะมีการรองรับสตริงหลายบรรทัดเหมือนใน ECMAScript 6

var a =
`this is
a multi-line
string`;

ดู "วิธีการสตริงใหม่" ที่ http://davidwalsh.name/es6-ioสำหรับรายละเอียดและ "สตริงเทมเพลต" ที่http://kangax.github.io/compat-table/es6/สำหรับการติดตามความเข้ากันได้


1

นอกเหนือจากคำตอบที่ยอมรับ:

`this is a 
single string`

ซึ่งประเมินเป็น: "นี่คือ \ n สตริงเดี่ยว"

หากคุณต้องการใช้การแก้ไขสตริง แต่ไม่มีบรรทัดใหม่ให้เพิ่มแบ็กสแลชเหมือนในสตริงปกติ:

`this is a \
single string`

=> 'นี่คือสตริงเดียว'

โปรดจำไว้ว่าช่องว่างด้วยตนเองจำเป็นแม้ว่า:

`this is a\
single string`

=> 'นี่คือสตริงเดียว'


0

Vanilla Javascipt ไม่รองรับสตริงหลายบรรทัด ตัวประมวลผลล่วงหน้าภาษากลายเป็นสิ่งที่ทำได้ในทุกวันนี้

CoffeeScript ซึ่งเป็นที่นิยมมากที่สุดมีคุณสมบัตินี้ แต่ก็ไม่น้อยเลยเป็นภาษาใหม่ คอมไพเลอร์ traceur ของ Google เพิ่มคุณสมบัติใหม่ให้กับภาษาในรูปแบบ superset แต่ฉันไม่คิดว่าสตริงหลายบรรทัดเป็นหนึ่งในคุณสมบัติเพิ่มเติม

ฉันกำลังมองหาจาวาสคริปต์ชุดพิเศษที่รองรับสตริงหลายบรรทัดและคุณสมบัติอื่น ๆ อีกสองสามอย่าง ฉันเริ่มภาษานี้สักพักก่อนที่จะเขียนคอมไพเลอร์เริ่มต้นสำหรับ Coffeescript ฉันวางแผนที่จะเสร็จสิ้นในช่วงซัมเมอร์นี้

หากพรีคอมไพเลอร์ไม่ใช่ตัวเลือกนอกจากนี้ยังมีแฮ็กแท็กสคริปต์ที่คุณเก็บข้อมูลหลายบรรทัดไว้ในแท็กสคริปต์ใน html แต่ให้เป็นประเภทที่กำหนดเองเพื่อไม่ให้มีการเปลี่ยนแปลง จากนั้นใช้ javascript ในภายหลังคุณสามารถแยกเนื้อหาของแท็กสคริปต์ได้

นอกจากนี้หากคุณใส่ \ ที่ท้ายบรรทัดใด ๆ ในซอร์สโค้ดจะทำให้บรรทัดใหม่ถูกละเว้นราวกับว่าไม่มีอยู่ หากคุณต้องการขึ้นบรรทัดใหม่คุณต้องลงท้ายบรรทัดด้วย "\ n \"

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