有沒有直接的,內置的方式(好吧,好吧,也許有 —見下文),但是如果你使用replace
功能,其中置換可以是功能而不是字符串的回撥功能(返回值是被替換的),你可以很容易地實現它。
例如,假設您爲佔位符使用Ruby符號#{xyz}
。代碼遍歷這些:
var mappings, str;
str = "One #{X} three #{Y} five";
mappings = {
"X": 2,
"Y": 4
};
str = str.replace(/\#\{([^#]+)\}/g, function(match, key) {
var result;
result = mappings[key];
/* ...processing here */
return result;
});
結果字符串是One 2 three 4 five
,因爲#{X}
和#{Y}
已經通過查找替換。你可以看看這個鍵,看看它是否是一個表達式,並且需要被評估而不是簡單地查找。這項評估是你真正的工作進來
現在,你可以使用和with
eval
實現表達式的支持。改變result = mapping[key];
線以上這樣的:
with (mappings) {
result = eval(key);
}
如果你喂字符串"One #{X} three #{Y} five #{X + Y * 2}"
成,結果是One 2 three 4 five 10
—因爲2 + 4 * 2
= 10
做是因爲with
枝之上給定對象範圍鏈,所以它是第一件事時檢查解決一個不合格的參考(如X
),並且eval
執行Javascript代碼 —所以可以評估表達式 —,並在所謂的範圍內神奇地這樣做。但要小心;正如Eric所指出的那樣,並非所有運營商在各種表達形式上都是相同的,特別是Javascript將^
解釋爲「按位異或」,而不是「對於權力」。 (它沒有一個指數運算符,你必須使用Math.pow
。)
但是你必須非常小心之類的事情,無論是with
和eval
(各以自己的方式)是有問題的。但是with
的主要問題在於,如果你做了一個任務,很難說出事情的來源或發生的方向,而你卻不知道;並且eval
的主要問題來自於使用它來解釋不受控制的字符串。只要你保持保障機制,並意識到問題...
沸騰下來到一個函數:
function evaluate(str, mappings) {
return str.replace(/\#\{([^#]+)\}/g, function(match, key) {
var result;
with (mappings) {
result = eval(key);
}
return result;
});
}
alert(evaluate(
"The expression '(#{X} + #{Y}) * 2' equals '#{(X + Y) * 2}'",
{"X": 2, "Y": 4}
)); // alerts "The expression '(2 + 4) * 2' equals '12'"
alert(evaluate(
"The expression '(#{X} + #{Y}) * 2' equals '#{(X + Y) * 2}'",
{"X": 6, "Y": 3}
)); // alerts "The expression '(6 + 3) * 2' equals '18'"
你是一個失敗者與「權力」運營商。在JavaScript中,這意味着異或。 – Eric 2010-05-16 11:50:15
@Eric:這是一個很好的觀點。 – 2010-05-16 12:35:36