国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > JavaScript > 正文

javascript下利用arguments實現string.format函數

2019-11-21 00:16:54
字體:
來源:轉載
供稿:網友
下面摘抄一下源碼,深入分析一下他的設計實現思路:
復制代碼 代碼如下:

function format(string) {
var args = arguments;
var pattern = new RegExp("%([1-" + arguments.length + "])", "g");
return String(string).replace(pattern, function(match, index) {
return args[index];
});
};

通過format函數,下面的代碼:
復制代碼 代碼如下:

format("And the %1 want to know whose %2 you %3", "papers", "shirt", "wear");

就會返回:"And the papers want to know whose shirt you wear" 。
果然有點像c#下string.format函數一樣傳參調用。
總體說來,好像真沒什么技術含量。但是真的沒有技術含量嗎?樓豬大膽根據自己對javascript和arguments的淺薄認識和理解,再來剖析一下這段程序:
1、正則表達式
非常巧妙地new了一個以%開頭匹配1到argument個數的一個正則pattern,這個正則是下面第2點字符串替換的重要前提準備;
2、string的Replace函數
replace函數的第二個參數是function,這點非常令人“意外”。通過定義,變量args實際上就是arguments,接著通過args[index]就能取到第index個參數,而且index>=1且index<arguments.length又能保證獲取參數的正確。

函數如此短小精悍,和強大的功能形成巨大反差,令人拍案。
可能有許多像樓豬一樣被c#慣壞的開發者,會迷戀c#的string.format的寫法(大部分還是使用習慣在作怪吧?),好事樓豬稍微改動了一下源碼:
復制代碼 代碼如下:

function format(string) {
var args = arguments;
var pattern = new RegExp("{([0-" + arguments.length + "])}", "g");
return String(string).replace(pattern, function(match, index) {
var currentIndex = parseInt(index);
if (currentIndex + 1 > args.length || currentIndex < 0) {
throw new Error("參數索引出錯");
}
return args[currentIndex + 1];
});
};
document.write(format("And the {0} want to know whose {1} you {2}", "papers", "shirt", "wear"));//大括號,索引從0開始...

這樣看上去就可以像c#的編寫風格一樣調用format函數了。
最后查看此文的寫作時間是在2008年,樓豬在08年的時候覺悟還算蠻高的,正自發努力學習javascript中,但是對arguments認識還很稚嫩,雖然已經知道可以在自定義事件中通過它來定義createFunction函數,用createFunction函數來構造無參數的function給事件使用,但是當時一直抑郁“只知其形,不得其實”。看完Andrew的佳作,豁然開朗,雖然反應遲鈍后知后覺,依然感到無比振奮和欣慰。

你看一下Andrew Tetlaw的原文吧。其實下面已經有人指出format函數參數超出9以后,該函數就不起作用了,然后還給出了解決方法:

eric d. Hi, thanks for that brilliant article. Made a lot of things a lot clearer!
Note: new RegExp("%([1-" + arguments.length + "])", "g"); will fail passed 9 arguments (the regexp would be "%([1-10])" so it will only match %0 and %1).

I think an easy fix would be something like:
function format(string) { var args = arguments; var pattern = new RegExp("%([0-9]+)", "g"); return String(string).replace(pattern, function(match, index) { if (index == 0 || index >= args.length) throw "Invalid index in format string"; return args[index]; }); };
(Sorry for nitpicking, I understand it was only an example and brevety is the main objective, but its a great function to have)

Posted on: January 20th 2009, 12:01 am

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 萍乡市| 蓬溪县| 迁安市| 集贤县| 永嘉县| 江孜县| 文山县| 铅山县| 绥中县| 公安县| 镇雄县| 长子县| 永泰县| 喀喇沁旗| 尚志市| 同仁县| 界首市| 南投县| 申扎县| 石狮市| 大足县| 景德镇市| 海门市| 铜川市| 鹿邑县| 松潘县| 安徽省| 马鞍山市| 西青区| 老河口市| 六枝特区| 浪卡子县| 大埔区| 博湖县| 徐水县| 巴塘县| 囊谦县| 故城县| 军事| 怀柔区| 诸暨市|