2010-07-21 36 views
157

Tôi biết trong PHP chúng ta có thể làm điều gì đó như thế này:Làm cách nào để nội suy các biến trong chuỗi trong JavaScript mà không cần ghép nối?

$hello = "foo"; 
$my_string = "I pity the $hello"; 

Output: "I pity the foo"

Tôi đã tự hỏi nếu điều này tương tự có thể trong JavaScript là tốt. Sử dụng các biến bên trong các chuỗi mà không sử dụng nối - nó trông ngắn gọn và thanh lịch hơn để viết.

Trả lời

264

Bắt đầu từ Firefox 34/Chrome 41/Safari 9/Microsoft Edge bạn có thể sử dụng một ES2015/tính năng ES6 gọi Template Literals và sử dụng cú pháp sau:

`String text ${expression}` 

Các văn bản mẫu được đính kèm bởi dấu kiểm ngược (``) (dấu trọng âm) thay vì dấu nháy kép hoặc đơn.

Ví dụ:

var a = 5; 
var b = 10; 
console.log(`Fifteen is ${a + b}.`); 
// "Fifteen is 15. 

Làm thế nào gọn gàng là điều đó không?

Bonus:

Nó cũng cho phép cho các chuỗi đa dòng trong javascript mà không thoát, đó là rất tốt cho các mẫu:

return ` 
    <div class="${foo}"> 
     ... 
    </div> 
`; 

Browser support:

Là cú pháp này là không được hỗ trợ bởi các trình duyệt cũ hơn (Internet Explorer và Safari < = 8), bạn có thể muốn sử dụng Babel để chuyển mã của bạn thành ES5 để đảm bảo mã sẽ chạy ở mọi nơi.


Side lưu ý:

Bắt đầu từ IE8 + bạn có thể sử dụng chuỗi cơ bản định dạng bên console.log:

console.log('%s is %d.', 'Fifteen', 15); 
// Fifteen is 15. 
+22

Đừng bỏ lỡ thực tế rằng chuỗi mẫu được phân cách bằng dấu tick (\ ') thay vì các ký tự trích dẫn thông thường của bạn. '" $ {foo} "' nghĩa là $ {foo} '\' $ {foo} \ '' là những gì bạn thực sự muốn – Hovis

+1

Ngoài ra còn có nhiều transpilers để biến ES6 thành ES5 để khắc phục vấn đề tương thích! – Omid

145

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge, không, điều đó là không thể trong javascript. Bạn sẽ phải nghỉ đến:

var hello = "foo"; 
var my_string = "I pity the " + hello; 
+2

Nó sẽ sớm được có thể trong javascript (ES6) với mẫu Strings, xem câu trả lời chi tiết của tôi dưới đây. – bformet

+0

[Đó là có thể] (http://stackoverflow.com/a/28497562/1189651) nếu bạn muốn viết CoffeeScript, mà thực sự là javascript với cú pháp tốt hơn – bformet

37

Prior to Firefox 34/Chrome 41/Safari 9/Microsoft Edge, no. Mặc dù bạn có thể thử sprintf for JavaScript để có được nửa đường:

var hello = "foo"; 
var my_string = sprintf("I pity the %s", hello); 
+0

Cảm ơn bạn. Nếu bạn đang sử dụng dojo, sprintf có sẵn dưới dạng một mô-đun: http://bill.dojotoolkit.org/api/1.9/dojox/string/sprintf – user64141

4

Nếu bạn đang cố gắng làm suy cho microtemplating, tôi thích Mustache.js cho mục đích đó.

18

tốt bạn có thể làm điều này, nhưng nó không phải là đặc biệt nói chung

'I pity the $fool'.replace('$fool', 'fool') 

Bạn có thể dễ dàng viết một hàm thực hiện điều này một cách thông minh nếu bạn thực sự cần thiết để

+1

Tốt nhất, nhưng tôi tưởng tượng sẽ có một hit hiệu suất. –

7

Nếu bạn muốn viết CoffeeScript bạn có thể làm:

hello = "foo" 
my_string = "I pity the #{hello}" 

CoffeeScript thực sự là IS javasc ript, nhưng với cú pháp tốt hơn nhiều.

Để biết tổng quan về CoffeeScript, hãy kiểm tra số beginner's guide này.

3

Bạn có thể sử dụng chức năng javascript này để thực hiện loại khuôn mẫu này. Không cần bao gồm toàn bộ thư viện.

function createStringFromTemplate(template, variables) { 
    return template.replace(new RegExp("\{([^\{]+)\}", "g"), function(_unused, varName){ 
     return variables[varName]; 
    }); 
} 

createStringFromTemplate(
    "I would like to receive email updates from {list_name} {var1} {var2} {var3}.", 
    { 
     list_name : "this store", 
     var1  : "FOO", 
     var2  : "BAR", 
     var3  : "BAZ" 
    } 
); 

Output: "I would like to receive email updates from this store FOO BAR BAZ."

Sử dụng một chức năng như một cuộc tranh cãi với string.Replace() chức năng là một phần của ECMAScript v3 spec. Xem this SO answer để biết thêm chi tiết.

+0

Điều này có hiệu quả không? – momomo

+0

Hiệu quả sẽ phụ thuộc phần lớn vào trình duyệt của người dùng, vì giải pháp này đại diện cho "nâng hạng nặng" khớp với regex và thực hiện thay thế chuỗi đối với các hàm gốc của trình duyệt. Trong mọi trường hợp, vì điều này đang xảy ra ở phía trình duyệt, hiệu quả không phải là một mối quan tâm lớn. Nếu bạn muốn khuôn mẫu phía máy chủ (cho Node.JS hoặc tương tự), bạn nên sử dụng giải pháp ES6 template literals được mô tả bởi @bformet, vì nó có khả năng hiệu quả hơn. – Eric

5

Hoàn thành câu trả lời, sẵn sàng để được sử dụng:

var Strings = { 
     create : (function() { 
       var regexp = /{([^{]+)}/g; 

       return function(str, o) { 
        return str.replace(regexp, function(ignore, key){ 
          return (key = o[key]) == null ? '' : key; 
        }); 
       } 
     })() 
}; 

Gọi như

Strings.create("My firstname is {first}, my last name is {last}", {first:'Neo', last:'Andersson'}); 

Để gắn nó vào String.prototype:

String.prototype.create = function(o) { 
      return Strings.create(this, o); 
} 

Sau đó sử dụng như:

"My firstname is ${first}".create({first:'Neo'}); 
1

tôi đã viết gói NPM này stringinject https://www.npmjs.com/package/stringinject cho phép bạn làm như sau

var string = stringInject("this is a {0} string for {1}", ["test", "stringInject"]); 

sẽ thay thế {0} và {1} với các mục mảng và trả về chuỗi sau

"this is a test string for stringInject" 

hoặc bạn có thể thay thế placeholders với các phím đối tượng và giá trị như vậy:

var str = stringInject("My username is {username} on {platform}", { username: "tjcafferkey", platform: "GitHub" }); 

"My username is tjcafferkey on Github" 
0

Vâng, bạn có thể sử dụng this is ${variable} hoặc bạn có thể sử dụng "this is "+variable Cả hai đều hoạt động tốt.

Cũng nên nhớ để sử dụng Tilda (``) chính xung quanh this is ${variable} thay vì "hay"

+0

Câu trả lời này trông giống như một bản sao. –

Các vấn đề liên quan