是否有相当于rubys“#{}”序列的JavaScript?

时间:2012-04-13 16:08:24

标签: javascript ruby

有没有比使用字符串连接更好的方法在JavaScript中构建字符串?

如果我可以做一些类似ruby的东西,你可以在字符串中扩展变量,而不是做很多“foo”+ bar +“baz”,这会使我的代码更清晰。

8 个答案:

答案 0 :(得分:7)

String.prototype.format = function() {
  var args = arguments;
  return this.replace(/{(\d+)}/g, function(match, number) { 
    return typeof args[number] != 'undefined'
      ? args[number]
      : match
    ;
  });
};


console.log("{0} bar {1}.".format("foo","baz"));

将产生:

“foo bar baz”

答案 1 :(得分:1)

Chris Nielsenthis answer中提供了纯JavaScript解决方案:

String.prototype.supplant = function (o) {
    return this.replace(/{([^{}]*)}/g,
        function (a, b) {
            var r = o[b];
            return typeof r === 'string' || typeof r === 'number' ? r : a;
        }
    );
};

alert("I'm {age} years old!".supplant({ age: 29 }));
alert("The {a} says {n}, {n}, {n}!".supplant({ a: 'cow', n: 'moo' }));

您还可以使用CoffeScript,这是一种可编译为JavaScript的语言。 It supports string interpolation

author = "Wittgenstein"
quote  = "A picture is a fact. -- #{ author }"

答案 2 :(得分:1)

抱歉,但这一切都不是红宝石的方式,这里是一个基本的p等效,对不起eval,肯定可以做得更好.. 如果你只想要连接,只需在第一个解决方案中用return替换document.write

function p(str){
  document.write(str.replace(/#{(\w)}/g, function(match, s){return eval(s)})+"<br>");
}

String.prototype.p = function() {
  return this.replace(/#{(\w)}/g, function(match, s){return eval(s)})+"<br>";
};


var f="foo", b="bar"
p("#{f} #{b}")
document.write("#{f} #{b}".p());

=> foo bar
=> foo bar
编辑:我添加了一个原型版本,在那个版本上遇到了一些困难

答案 3 :(得分:0)

var myStr = [];

myStr.push('something')

console.log(myStr.join(""))

答案 4 :(得分:0)

如果您处理 lot 字符串,那么使用一个数组,其中push字符串部分,最后join它们(空字符串作为分隔符)似乎是跨平台最有效的。

答案 5 :(得分:0)

  

“是否存在类似于rubys “#{}”序列的JavaScript?”

关于等效,没有。 JavaScript本身没有字符串插值。虽然您可以使用函数在某种程度上复制它。

答案 6 :(得分:0)

pylover's answer会为您提供喜欢的内容。

您也可以查看CoffeeScript,这是一种很好的语言,可以编译为JavaScript并具有字符串插值,以及其他(可能太多许多)功能。

答案 7 :(得分:0)

它被称为语法糖。

var a = 2;
var b = 4;
var c = "together";

var text = `Add ${a*b} elements ${c}.`;
console.log(text)

// "Add 8 elements together." (515,988,604 op/sec) 

VS

var text = "Add" + " " + a*b + " " + "elements" + " " + c + ".";
console.log(text)

// "Add 8 elements together." (511,188,184 op/sec 0.73% slower)

第一种方法更快更好阅读。

此处的效果测试:JSPerf string test